基于socket通信的物联网编程

    捣鼓了一下午终于实现了在局域网中基于socket的物联网通信O(∩_∩)O!

    本次使用的是NodeMCU开发板,封装了ESP8266WiFi模块,由于NodeMCU官方推荐使用lua来写,并且没有统一的IDE,这个就比较捉急,对比所有的开发手段,还是arduino IDE配合ESP8266库来使用比较方便,免去了固件烧录这一步骤。

    下载安装ESP8266WiFi库应该不难,百度都能有。 具体就是点击 Arduino->Preferences,然后弹出基于socket通信的物联网编程_第1张图片

将这个地址  http://arduino.esp8266.com/stable/package_esp8266com_index.json填写在“附加开发板管理器网址”就行了,然后到开发板管理器,即:工具->开发板->开发板管理器   在搜索栏直接写esp8266,然后安装这个库就行了。

    部署好了全部的开发环境后,我们最终需要实现物联网的通信,但是实现方法有很多,官方提供的方法是基于web服务器,通过http协议进行通信,但是如果在持续传递大量数据的情况下,这个方法似乎有点不合适,例如我们需要用A开发板控制B开发板,此时,A中发送的数据是连续的,不间断的,那么基于socket比较合理。下面就实现一个比较简单的socket通信功能。

    首先,要实现开发板之间的通信,必须有服务端(Server)客户端(Client),我们先实现服务端的代码:

#include 

//会话服务端
const char* ssid = "Your_SSID";              //改为你的ssid名(WiFi名称)
const char* password = "Your_WiFipassword";  //你的Wifi密码
String text = "" ;
WiFiServer server(80);                       //创建服务端,并且定义端口
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(100);
  WiFi.begin(ssid,password);
  Serial.println("WiFi连接中");
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  server.begin();
  Serial.println("WiFi连接成功!!");
  Serial.print("IP-> ");
  Serial.print(WiFi.localIP());            //获取在局域网中的IP
  Serial.println();
  
}
void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient client = server.available();
  if(!client){
     Serial.println("等待客户端接入!");
     delay(100);            
     return ;
  }
  Serial.println("新客户端连接进来了!");
  
  while(client){
      if(client.read() != -1 ){
        while(client.available() > 0){
          text += char(client.read()); //小技巧,实现字节转换字符串,并且比readString()方法更加快速
          delay(2);                   //延迟,给缓冲池一定的读取时间
        }
      client.print("hello我是服务端");       //向客户端发送消息
      
      Serial.print("读到了客户端的数据!-> ");
      Serial.println(text);
      text = "" ;
    }
    client.flush();
  }
}

以上就是服务端的部署代码,具体思路:

1、我们必须需要先连接AP(Access Point,WiFi接入节点)。

2、我们需要知道服务端在局域网中的IP,这样客户端才能连接它。

3、服务端必须启动起来,当然必须监听一个端口才行。

4、等待客户端接入。

5、接受客户端发送的数据。

6、处理数据(回发数据或者进行其他的GPIO控制等操作)。

如果连接一旦中断,那么服务端又需要持续监听着端口,等待下一位客户的到访。


客户端实现如下:

#include 


//会话客户端
const char* ssid = "Your_SSID";
const char* password = "Your_Password";
const char* ServerIP = "ServerIP" ;        //你的服务端的IP
const int port = 80 ;                      //你的服务端开放的端口
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(100);
  WiFi.begin(ssid,password);
  Serial.println("WiFi连接中");
  while(WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi连接成功!!");
  Serial.print("IP-> ");
  Serial.print(WiFi.localIP());
  Serial.println();
  
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(2000);
  Serial.println("连接服务端");
  WiFiClient client;
  if(!client.connect(ServerIP,port)){
    Serial.println("连接失败");
    return ;
  }

  client.print("hello你好吗我是客户端\n");
  
}

以上就是客户端的部署代码,具体思路:

1、和服务端一样需要先连接AP。

2、启动客户端并连接服务端,注意需要正确填写IP和端口。

3、进行消息发送。

客户端的实现相对比较简单。

实现了上面的服务端和客户端后,我们可以使用socket调试工具,来进行测试,为了方便这个小工具就不自己写了( ̄┰ ̄*),直接用现成的工具,xSocket这个工具,在App Store上有哦!

基于socket通信的物联网编程_第2张图片

就是这个工具。

        总结,本次基于socket的通信基本能实现开发板之间的信息交互,但是只能基于局域网中,如果在不同的网段,需要设置路由器的端口映射,如果外网没有固定的IP,那么就需要进行动态域名解析,注册一个花生壳账号(现在好像还是免费的)。后期实现物联网的远距离控制可能会使用到哦。

你可能感兴趣的:(基于socket通信的物联网编程)