TCP連接 TCP是電腦網路中運輸層協議,是應用層協議http協議的支撐協議。兩台遠程主機之間可以通過TCP/UDP協議進行通信並交換信息,前提是,相互通信的兩台主機之間必須知道彼此的IP地址和埠號。 NodeMCU作為TCP客戶端實現區域網內點亮Led燈(通過路由器中轉) NodeMCU可以被 ...
TCP連接
TCP是電腦網路中運輸層協議,是應用層協議http協議的支撐協議。兩台遠程主機之間可以通過TCP/UDP協議進行通信並交換信息,前提是,相互通信的兩台主機之間必須知道彼此的IP地址和埠號。
NodeMCU作為TCP客戶端實現區域網內點亮Led燈(通過路由器中轉)
NodeMCU可以被配置為一個TCP客戶端(如圖4-1),同時將一臺網路設備(如電腦)配置為TCP伺服器端,將NodeMCU連接到已經配置好的TCP伺服器端上後,兩者即可進行通信。
通信方法有兩種,方法一是將NodeMCU設置為Soft AP模式,讓電腦之間連接到它的WiFi上之後再與它進行通信。方法二是將NodeMCU和電腦同時連接到一個WiFi上,這樣做的好處是與NodeMCU通信的設備數量不會受到較大的限制,因為將NodeMCU設置為SoftAP模式時,最大可以連接到其上的設備數為8個。
圖4-1 打開網路調試助手,並將其設置為TCP Server
首先使用方法二使兩者連接到一起併進行通信,打開網路調試助手,將其協議類型設置為TCP Server,更改本地埠號為任意值,在本次實驗中被設置為1234。記住TCP Server的IP地址和埠號之後,將其打開(連接)。將程式中的IP地址和埠號換成上面設置好的值,
並把NodeMCU的D0埠連接上一個Led(如圖4-2),將程式燒錄到Node MCU中。完成之後在網路調試助手中發送“0”或者“1”就會改變Led的狀態。
圖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燈。
閱讀原文可訪問個人博客。