ESP8266作為TCPServer與其他裝置建立一個tcp網路進行區域網通訊
阿新 • • 發佈:2019-01-30
1.把一個8266作為服務端,其他的多個8266或者其他裝置(手機、PC等)作為客戶端,建立一個TCP網路
2.用8266建立熱點讓其他裝置進行連線
3.具體操作實現:
a. 建立8266wifi(熱點)並設定wifi密碼
b. 設定埠號並獲取AP模式下的IP
c. 其他的多個8266或者其他裝置(手機、PC等)作為客戶端,找到服務端8266發出的WIFI後,通過密碼進行連線
d. PC機通過TCP網路助手連線到8266服務端,即可傳送指令到8266服務端,通過串列埠等資訊,可知server與client兩端已經建成通訊
#include <ESP8266WiFi.h> #define MAX_SRV_CLIENTS 3 //最大同時連線數,即可接入的裝置數量的最大值, //8266 tcpserver只能接入5個(此資料不確定,網上是這麼說的) WiFiServer server(8266); //埠號,範圍 0-65535 WiFiClient serverClients[MAX_SRV_CLIENTS]; const char WiFiAPPSW[] = "12345678"; //設定AP模式下模組所發出的WIFI的密碼 char data[1500]; int ind = 0; void setupWiFi() { WiFi.mode(WIFI_AP); uint8_t mac[WL_MAC_ADDR_LENGTH]; WiFi.softAPmacAddress(mac); String macID = String(mac[WL_MAC_ADDR_LENGTH - 3], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) + String(mac[WL_MAC_ADDR_LENGTH - 1], HEX); macID.toUpperCase(); //設定AP模式下的WIFI名稱:12345678_ + MAC地址後六位 String AP_NameString = "12345678" + macID; char AP_NameChar[AP_NameString.length() + 1]; memset(AP_NameChar, AP_NameString.length() + 1, 0); for (int i=0; i<AP_NameString.length(); i++) AP_NameChar[i] = AP_NameString.charAt(i); WiFi.softAP(AP_NameChar, WiFiAPPSW); Serial.println(); Serial.print ( "IP address: " ); Serial.println ( WiFi.softAPIP() ); server.begin(); } void setup() { Serial.begin(115200); Serial.println ("\nBegin now!!!"); setupWiFi(); } void loop() { uint8_t i; //檢測伺服器端是否有活動的客戶端連線 if (server.hasClient()) { for (i = 0; i < MAX_SRV_CLIENTS; i++) //查詢空閒或者斷開連線的客戶端,並置為可用 { if (!serverClients[i] || !serverClients[i].connected()) { if (serverClients[i]) serverClients[i].stop(); //未連線,就釋放 serverClients[i] = server.available(); //分配新的 // Serial.print("New client: "); Serial.println(i); continue; } } //若沒有可用客戶端,則停止連線 WiFiClient serverClient = server.available(); serverClient.stop(); } //檢查客戶端的資料 for (i = 0; i < MAX_SRV_CLIENTS; i++) { if (serverClients[i] && serverClients[i].connected()) { if (serverClients[i].available()) { Serial.println("Connected to client !!! "); //從Telnet客戶端獲取資料 while (serverClients[i].available()) { data[ind] = serverClients[i].read(); //讀取client端傳送的字元 ind++; } for(int j=0;j < ind; j++) { Serial.print(data[j]); } Serial.println(); ind = 0; serverClients[i].print("OK! Got your request."); //在client端回覆 } } } }