最新版安卓TCP助手Android studio工程分享:Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)
第0章 简介
大家好,在上上上期发布的教程中,教大家如何利用Android Studio开发出一款接入华为云物联网平台并调用相关API完成设备属性查询、设备命令下发等功能,那个是采用的MQTT协议借助华为云物联网平台完成数据收发,本次教程带大家完成一款基于TCP/IP协议的物联网安卓应用开发,实现TCP连接与数据收发,下一期将在此APP上进行修改,并配置ESP8266接入APP完成内网控制物联网设备、查看设备属性信息等功能,首先还是给大家先看一下APP的最终效果:

第1章 提前准备
一、Android Studio IDE(※确保模拟器网络功能正常或使用真机※)
二、 网络调试助手
(下载地址https://www.pcsoft.com.cn/soft/194484.html)
第2章 详细步骤
一、 新建工程


二、 TCP服务
1、 新建TCP服务


2、 TCP服务功能代码补充
(1) 导入可能需要的类:
import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.Looper;import java.io.IOException;import java.io.InputStream;import java.io.PrintStream;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;
(2) 修改服务代码(可左右滑动)
public class TCPService extends Service { public static Socket socket;public static PrintStream output;boolean conn = false;String ip="192.168.1.15";String port="8087";public TCPService() {}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId){MyThread myThread = new MyThread();new Thread(myThread).start();//********在最终应用时取消注释下行,用于动态改变的IP和端口的连接********//ip=intent.getStringExtra("ipaddress");//port=intent.getStringExtra("port");//System.out.println("新的TCP连接,新的IP:"+intent.getStringExtra("ipaddress")+"新的端口号:"+intent.getStringExtra("port"));//********可在其他activity中设置IP和端口号通过上面的方式进行获取******** return super.onStartCommand(intent, flags, startId);return super.onStartCommand(intent, flags, startId);}//socket连接线程class MyThread implements Runnable{@Overridepublic void run(){try {socket = new Socket();SocketAddress socAddress = new InetSocketAddress(ip ,Integer.valueOf(port));try{socket.connect(socAddress, 5000);}catch (Exception e){e.printStackTrace();System.out.println("连接失败");}if(socket.isConnected())System.out.println("连接成功");InputStream inputstream = socket.getInputStream();/* 获取输出流 */output = new PrintStream(socket.getOutputStream(), true, "utf-8");conn = true;byte buffer[] = new byte[100];//接收数组的长度int len2 ;String receiveData;//非阻塞式连接while(conn){//接收网络数据if( (len2 = inputstream.read(buffer)) != -1){receiveData = new String(buffer, 0, len2);Intent CMDintent = new Intent();CMDintent.setAction("com.example.communication.data");CMDintent.putExtra("data", buffer);//buffer为数组,receivedata为文本sendBroadcast(CMDintent);}else{break;}}output.close();socket.close();Looper.loop();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();// Looper.prepare();}}};//发送方法((可以把参数改成Byte[]):public static void send(final byte[] arr){new Thread(new Runnable() {public void run() {if (socket.isConnected()) {try {output.write(arr);} catch (IOException e) {e.printStackTrace();}}}}).start();}
3、 MainActivity中启动服务
(1) 导入可能需要的类
import androidx.appcompat.app.AlertDialog;import androidx.appcompat.app.AppCompatActivity;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.Toast;
(2) 启动服务
Intent intent=new Intent(this,TCPService.class);startService(intent);

(3) 加入联网权限
在AndroidMainfest.xml文件中加入下面这句:
<uses-permission android:name="android.permission.INTERNET" />

4、 打开TCP Service
打开网络调试助手
(1) 协议类型:“TCP Server”
(2) 本机地址:不做修改,并且在APP的TCPService中的IP地址要与此一致
(3) 端口选择:根据需要选择合适的端口,同样在APP的TCPService中的端口号要与此一致基本补充
(4)点击打开

5、 运行APP
此时我们可以看到APP已经连接上了网络调试助手

三、 界面配置

四、 手动输入IP与端口号进行连接
1.实现过程
为登陆按钮的ImageButton添加事件,获取IP地址和端口号输入框的值后启动连接,相比较于上一步的初始化连接测试,这次的IP地址和端口号是变化的,我们这使用putExtra方式将ip和端口号发送出去,在TCPService中接收
2.修改启动服务语句
此处我们将一开始测试的程序语句
Intent intent=new Intent(this,TCPService.class);startService(intent);
改为
Intent intent = new Intent(this, TCPService.class);intent.putExtra("ipaddress", ip);intent.putExtra("port", port);startService(intent);
3.添加到登陆按钮的事件代码中

4.在TCPService.java中接收IP和端口号,并启动新的连接

五、 数据的收发
1. 数据的接收
(1) 广播接收器
我们通过广播接收器进行数据接收,首先在MainActivity中新建一个接收器:
private class cmdReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {byte[] receive=intent.getByteArrayExtra("data");System.out.println("接收到数据:"+recieveData);}}
(2)注册接收器
public cmdReceiver cmdReceiver;cmdReceiver =new cmdReceiver();IntentFilter intentFilter=new IntentFilter();intentFilter.addAction("com.example.communication.data");registerReceiver(cmdReceiver,intentFilter);
(3)网络调试助手进行数据发送
由于我们在TCPService中定义了接收数据格式为100字节,大家根据自己需要进行调整。

(4)接收处理
我们在广播接收器中读取接收的数据并显示:

2.数据发送
发送的时候我们可以调用TCPService.send(buff);方法,其中buff为字节数组,例如:
//发送十六进制数据byte[] buff = {0x00,0x01,0x02,0x03};TCPService.send(buff);//发送字符串String str=”FUNIOT is very fun”;byte[] buffstr = str.getBytes();TCPService.send(buffstr);

五、 结语
接下来我们就可以连接我们的设备,使用APP进行通信,完成数据上报或命令控制等其功能,关键代码已经在文章中给出,如果需要上述文章Android Studio的工程文件,在公众号“IOT趣制作”回复关键字“TCP基础应用”即可。

我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.