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

猜你喜欢

转载自blog.csdn.net/weixin_43351158/article/details/125809770