TCP鏈接git
TCP是計算機網絡中運輸層協議,是應用層協議http協議的支撐協議。兩臺遠程主機之間能夠經過TCP/UDP協議進行通訊並交換信息,前提是,相互通訊的兩臺主機之間必須知道彼此的IP地址和端口號。github
NodeMCU做爲TCP客戶端實現局域網內點亮Led燈(經過路由器中轉) 服務器
NodeMCU能夠被配置爲一個TCP客戶端(如圖4-1),同時將一臺網絡設備(如電腦)配置爲TCP服務器端,將NodeMCU鏈接到已經配置好的TCP服務器端上後,二者便可進行通訊。網絡
通訊方法有兩種,方法一是將NodeMCU設置爲Soft AP模式,讓電腦之間鏈接到它的WiFi上以後再與它進行通訊。方法二是將NodeMCU和電腦同時鏈接到一個WiFi上,這樣作的好處是與NodeMCU通訊的設備數量不會受到較大的限制,由於將NodeMCU設置爲SoftAP模式時,最大能夠鏈接到其上的設備數爲8個。tcp
圖4-1 打開網絡調試助手,並將其設置爲TCP Server函數
首先使用方法二使二者鏈接到一塊兒並進行通訊,打開網絡調試助手,將其協議類型設置爲TCP Server,更改本地端口號爲任意值,在本次實驗中被設置爲1234。記住TCP Server的IP地址和端口號以後,將其打開(鏈接)。將程序中的IP地址和端口號換成上面設置好的值,oop
並把NodeMCU的D0端口鏈接上一個Led(如圖4-2),將程序燒錄到Node MCU中。完成以後在網絡調試助手中發送「0」或者「1」就會改變Led的狀態。spa
圖4-2 NodeMCU電路鏈接圖
計算機網絡
NodeMCU程序以下:調試
1 /*----------------------------------------------------------- 2 written by helio, 2019 3 WiFiLed.ino - NodeMCU鏈接到路由器WiFi,將其配置爲TCP 4 客戶端同時與鏈接到路由器上的Tcp服務器設備(手機或電腦) 5 創建Tcp鏈接 6 ------------------------------------------------------------*/ 7 8 const int Led = 16; 9 const char *RemoteIp = "192.168.1.105"; // 設置遠程主機Ip地址 10 const int RemotePort = 1234; // 設置遠程主機端口號 11 12 #include "ESP8266WiFi.h" 13 14 WiFiClient client; // 建立Tcp客戶端 15 void setup() 16 { 17 Serial.begin(115200); 18 Serial.println(); 19 20 WiFi.begin("CEET305", "office305"); // 設置鏈接到的WiFi名稱和密碼 21 Serial.print("Connecting..."); 22 23 while (WiFi.status() != WL_CONNECTED) 24 { 25 delay(500); 26 Serial.print("."); 27 } 28 29 Serial.println(); 30 Serial.println(WiFi.localIP()); // 打印NodeMCU的IP地址 31 32 if (!client.connect(RemoteIp, RemotePort)) // 創建tcp鏈接 33 { 34 Serial.println("Connected failed!"); 35 return; 36 } 37 38 pinMode(Led, OUTPUT); // 設置GPIO16爲輸出模式 39 digitalWrite(Led, LOW); // 初始時,GPIO16輸出低電平 40 } 41 42 void loop() 43 { 44 if (client.available()) 45 { 46 char ch = client.read(); // 讀取遠程網絡串口發來的數據 47 if (ch == '0') 48 digitalWrite(Led, LOW); 49 else if (ch == '1') 50 digitalWrite(Led, HIGH); 51 } 52 } 53
WiFiLed.ino函數解析
實例化一個 WiFiClient 對象,對象名稱爲client。WiFiClient類是在esp8266庫中已經封裝好的一個TCP客戶端,使用它能夠實現TCP客戶端的實例化,與TCP服務器的鏈接、通訊、狀態判斷等功能。隨後,經過WiFiClient類的一個成員函數 connect() 設置須要鏈接的服務器的 IP地址和端口號,並與遠程TCP服務器創建鏈接,經過其返回值判斷是否鏈接成功。鏈接成功後,便可與服務器進行通訊,經過類的成員函數 isavailable() 函數判斷是否有消息從服務器端發送過來,並根據消息的內容對NodeMCU上GPIO16口的Led燈進行控制。
NodeMCU做爲TCP服務器端實現局域網內點亮Led燈(不使用路由器)
第二種方法是將NodeMCU設置爲softAP模式,至關於一種熱點模式,設置好其WiFi的名字和密碼以後,電腦(TCP客戶端)便可經過WiFi鏈接到其上並與之進行通訊。
圖4-3 程序燒錄至NodeMCU中以後打開串口監視器
具體步驟以下,先把Led燈鏈接到NodeMCU的GPIO16口,以後將程序燒錄至NodeMCU中以後,在串口監視器中能夠看到設置成softAP模式成功,同時能夠獲知NodeMCU的IP地址。同時電腦的WiFi管理中心中也能夠看到剛剛設置的WiFi,將電腦鏈接到此WiFi。
以後,在網絡調試助手中,將協議類型設置爲TCP Client,同時將IP地址設置爲剛剛在串口監視器中獲得的IP地址(如圖4-3),端口設置爲在程序中已經設置好的端口好。完成以上步驟以後,鏈接到TCP Server,鏈接上以後立刻就會收到來自TCP Server發送來的消息「Hello from NodeMCU」(如圖4-4),在TCP Client中發送」0」或者」1」便可控制Server端-NodeMCU上的Led燈。
圖4-4 設置網絡調試助手
Node MCU的程序以下:
1 /*------------------------------------------------------------ 2 written by helio, 2019 3 SoftApLed.ino - 將NodeMCU設置爲soft-AP模式(熱點模式 4 )其餘設備能夠鏈接到該熱點,並將NodeMCU設置爲Tcp服務器 5 端,同時將其餘設備(手機,電腦)配置爲Tcp客戶端,並鏈接 6 到NodeMCU服務器上,向其發送控制消息 7 ------------------------------------------------------------*/ 8 9 #include <ESP8266WiFi.h> 10 const int Led = 16; // 將Led鏈接到GPIO16端口 11 const int LocalPort = 8266; // 設置ModeMCU端口 12 13 WiFiServer server(LocalPort); 14 void setup() 15 { 16 Serial.begin(115200); 17 Serial.println(); 18 19 Serial.print("Setting soft_AP..."); 20 if (WiFi.softAP("ESP8266", NULL)) 21 Serial.print("Ready"); 22 else 23 Serial.print("Failed"); 24 25 Serial.println(); 26 server.begin(); 27 Serial.printf("TcpServerstarted,%s", WiFi.softAPIP().toString().c_str()); 28 29 pinMode(Led, OUTPUT); 30 digitalWrite(Led, LOW); 31 } 32 33 void loop() 34 { 35 WiFiClient client = server.available(); // 等待客戶端鏈接 36 if (client) 37 { 38 client.write("Hello from NodeMCU"); 39 Serial.println("Client connected"); 40 while (client.connected()) // 當客戶端保持鏈接時,從客戶端讀取數據 41 { 42 if (client.available()) // 當客戶端發送數據時 43 { 44 char ch = client.read(); 45 if (ch == '0') 46 digitalWrite(Led, LOW); 47 else if (ch == '1') 48 digitalWrite(Led, HIGH); 49 } 50 } 51 } 52 53 client.stop(); // 斷開鏈接 54 }
SoftApLed.ino 解析
實例化一個WiFi Serve類的對象server,並設置server的端口號,隨後將Node MCU使用函數WiFi.softAP()設置爲SoftAP模式,同時經過函數WiFi.softAPIP()得到其IP地址並打印到串口上,在loop循環中,經過WiFiServer類的一個成員函數available()等待客戶端的鏈接,當有客戶端鏈接至NodeMCU以後,經過client.write()函數往客戶端發送「Hello from Node MCU」字符串並與客戶端保持鏈接,再經過WiFiClient類的一個成員函數available接收從客戶端發來的數據並經過其發送來的數據的不一樣從而控制NodeMCU上的Led燈。
閱讀原文可訪問我的博客。