1. 程式人生 > >基於socket通訊的物聯網程式設計

基於socket通訊的物聯網程式設計

    搗鼓了一下午終於實現了在區域網中基於socket的物聯網通訊O(∩_∩)O!

    本次使用的是NodeMCU開發板,封裝了ESP8266WiFi模組,由於NodeMCU官方推薦使用lua來寫,並且沒有統一的IDE,這個就比較捉急,對比所有的開發手段,還是arduino IDE配合ESP8266庫來使用比較方便,免去了韌體燒錄這一步驟。

    下載安裝ESP8266WiFi庫應該不難,百度都能有。 具體就是點選 Arduino->Preferences,然後彈出

將這個地址  http://arduino.esp8266.com/stable/package_esp8266com_index.json

填寫在“附加開發板管理器網址”就行了,然後到開發板管理器,即:工具->開發板->開發板管理器   在搜尋欄直接寫esp8266,然後安裝這個庫就行了。

    部署好了全部的開發環境後,我們最終需要實現物聯網的通訊,但是實現方法有很多,官方提供的方法是基於web伺服器,通過http協議進行通訊,但是如果在持續傳遞大量資料的情況下,這個方法似乎有點不合適,例如我們需要用A開發板控制B開發板,此時,A中傳送的資料是連續的,不間斷的,那麼基於socket比較合理。下面就實現一個比較簡單的socket通訊功能。

    首先,要實現開發板之間的通訊,必須有服務端(Server)客戶端(Client)

,我們先實現服務端的程式碼:

#include <ESP8266WiFi.h>

//會話服務端
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 <ESP8266WiFi.h>


//會話客戶端
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的通訊基本能實現開發板之間的資訊互動,但是隻能基於區域網中,如果在不同的網段,需要設定路由器的埠對映,如果外網沒有固定的IP,那麼就需要進行動態域名解析,註冊一個花生殼賬號(現在好像還是免費的)。後期實現物聯網的遠距離控制可能會使用到哦。