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

    最新版安卓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

 

 

  • 11
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
ESP8266是一款低成本、低功耗的Wi-Fi模块,非常适合用于物联网设备的开发。在ESP8266上进行TCP通信可以实现设备与设备之间的数据传输和远程控制等功能。下面是ESP8266 TCP通信编程的介绍: 1. 首先需要连接ESP8266模块到Wi-Fi网络中,通过AT指令可以实现。具体操作可以参考ESP8266 AT指令手册。 2. 在ESP8266上进行TCP通信需要使用TCP客户端或TCP服务器,可以使用AT+CIPSTART指令建立TCP连接。例如建立TCP客户端连接的命令为: AT+CIPSTART="TCP","IP地址",端口号 其中IP地址为目标设备的IP地址,端口号为目标设备上TCP服务器的端口号。 3. 连接成功后,可以使用AT+CIPSEND指令发送数据。例如发送字符串“Hello World”: AT+CIPSEND=11 Hello World 其中11为字符串“Hello World”的字节数。发送成功后,目标设备上的TCP服务器就可以接收到这个字符串数据。 4. 接收数据也需要使用AT指令,可以使用AT+CIPRECVDATA指令来接收数据。例如接收10个字节的数据: AT+CIPRECVDATA=10 接收到的数据会返回到终端程序中,可以通过串口接收到。 5. 在进行TCP通信时,需要注意ESP8266的缓存区大小,如果缓存区满了就会导致数据发送或接收失败。可以使用AT+CIPBUFRESET指令来清空缓存区。 以上就是ESP8266 TCP通信编程的基本介绍。当然,为了方便使用,也可以使用ESP8266的SDK进行开发,提供了更加丰富的API接口。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IOT趣制作

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值