esp8266的TCP通信基础教程(结合手机APP)

您所在的位置:网站首页 手机app模块化开发 esp8266的TCP通信基础教程(结合手机APP)

esp8266的TCP通信基础教程(结合手机APP)

2024-07-15 09:17| 来源: 网络整理| 查看: 265

    最新版安卓TCP助手Android studio工程分享:Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换) 原创

    在上一期教程中,我们完成了基于TCP协议的物联网安卓应用开发,本期我们使用Arduino IDE对esp8266进行编程,完成对esp8266设备在TCP协议下的控制。

   此次实验的配置是将esp8266配置为TCP的服务器模式,手机APP作为客户端进行通信,如果大家有需要调整配置,将esp8266配置为TCP的客户端,手机APP作为服务器端,可以进入公众号进行私信,有需求的话会再更新一期。下面先带大家看一下最终效果:

【8266TCP测试APP下载】: http://www.funiot.xyz:8888/down/9H4I3mk0kQfd

(复制链接后在浏览器打开,或见文章末尾获取源码等资源)

开发过程:

a742031186f5b10d9253ac6b32eb38fa.png

1. 连接wifi

3ba7cc69525f6531351121dce946fa46.png

void WIFI_Init(char* wifi_ssid,char* wifi_password) { uint8_t times = 0; //用于记录单次连接WiFi的超时时间 WiFi.begin(wifi_ssid, wifi_password);//开始连接wifi Serial.println(""); Serial.print("正在连接wifi:"); Serial.print(wifi_ssid); while (WiFi.status()!= WL_CONNECTED && times++ < 51)//检查连接情况,等待WiFi连接成功,超时跳出 { delay(200); Serial.print("."); } if(times == 51)//10s内未连接成功 { Serial.print("WIFI:"); Serial.print(wifi_ssid); Serial.println(" 连接失败,请检查WiFi是否开启,或WIFI名称和密码是或否匹配,或按复位键重新尝试连接。"); times=0; while(1) delay(500); //阻塞 } Serial.println(""); Serial.print("连接成功,IP地址:"); Serial.println(WiFi.localIP());//获取IP }

2. 创建TCP服务器

e9857b0891ad9c68b146829fa8bf0e66.png

#define MAX_TCPSERVICE_CLIENTS_NUM 2 //可连接的客户端数量最大值,标号从0开始 WiFiServer server(SERVICE_PORT); //绑定服务器端口号 WiFiClient serverClients[MAX_TCPSERVICE_CLIENTS_NUM]; //记录最大数量的客户端 server.begin(); //启动服务器 server.setNoDelay(true); //禁用Nagle算法,即消息直接发送,不合并小消息 Serial.println("等待客户端接入......");

3. 等待客户端连接与数据接收

a5958918fc16c46ec60259981806331d.png

void loop() { uint8_t i; if (server.hasClient()) //如果有客户端接入 { Serial.println("客户端接入"); for(i = 0; i < MAX_TCPSERVICE_CLIENTS_NUM; i++)//遍历连接的客户端 { if ((!serverClients[i])|| (!serverClients[i].connected()))//启用连接的客户端 { if(serverClients[i]) serverClients[i].stop(); serverClients[i] = server.available(); //客户端接入后发送客户端一个“Connected!”,客户端接收到可用于验证是否接入成功 serverClients[i].print("Connected!"); continue; } } WiFiClient serverClient = server.available(); //如果未检查到客户端,则停止连接 serverClient.stop(); } for(i = 0; i < MAX_TCPSERVICE_CLIENTS_NUM; i++) //处理客户端发送的数据 { if (serverClients[i] && serverClients[i].connected()) { if(serverClients[i].available()){ while(serverClients[i].available()) //通道有数据,逐一读取并合并成字符串 { rec_str += char(serverClients[i].read()); } Serial.print("接收到客户端的数据:"); Serial.print(rec_str); //串口发送接收的数据 Serial.println(""); //换行 serverClients[i].print(rec_str); //向客户端回传接收的数据,以检验通信完整性 //客户端断开时会发送一个”Disconnect!“,设备可由此及时判断掉线 if(rec_str=="Disconnect!") Serial.println("客户端断开"); else Data_Handle(rec_str); //数据处理 rec_str=""; //清空接收数据缓存 } } } }

4. 数据处理

b4d6735a9fda9a3b0e8aaa509c4fc411.png

void Data_Handle(String strdata) { Serial.println("开始数据处理"); if(strdata=="LEDON") { Serial.println("灯光:打开"); digitalWrite(LEDPin, LOW); } else if(strdata=="LEDOFF") { Serial.println("灯光:关闭"); digitalWrite(LEDPin, HIGH); } Serial.println("数据处理完成"); }

2、 安卓部分

android源码与上一期的内容基本相似,只是在数据接收处理部分由字节改为字符串。

基于TCP/IP协议的物联网安卓应用开发基础教程(Android Studio开发)

 

TCPService:

//非阻塞式连接 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为文本 CMDintent.putExtra("data", receiveData);//buffer为数组,receivedata为文本 sendBroadcast(CMDintent); }else{ break; } }

接收处理部分:

 private class cmdReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {           //取消字节字符串转换,直接读取 String recieveData=intent.getStringExtra("data"); if(recieveData!=null) { textView_ctrl_rec.setText("接收到数据:"+recieveData); } } }

3、源码获取:

    非常简短的一个项目,上面的源码可以实现本次实验的功能,如果需要上述资源,公众号“IOT趣制作”回复关键字“8266tcp”即可获取Arduino和Android Studio工程源码以及安卓APK安装包。

e484941f73524bf98f74bea05f2af154.png

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3