基於socket通訊的物聯網程式設計
搗鼓了一下午終於實現了在區域網中基於socket的物聯網通訊O(∩_∩)O!
本次使用的是NodeMCU開發板,封裝了ESP8266WiFi模組,由於NodeMCU官方推薦使用lua來寫,並且沒有統一的IDE,這個就比較捉急,對比所有的開發手段,還是arduino IDE配合ESP8266庫來使用比較方便,免去了韌體燒錄這一步驟。
下載安裝ESP8266WiFi庫應該不難,百度都能有。 具體就是點選 Arduino->Preferences,然後彈出
將這個地址 http://arduino.esp8266.com/stable/package_esp8266com_index.json
部署好了全部的開發環境後,我們最終需要實現物聯網的通訊,但是實現方法有很多,官方提供的方法是基於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,那麼就需要進行動態域名解析,註冊一個花生殼賬號(現在好像還是免費的)。後期實現物聯網的遠距離控制可能會使用到哦。