NodeMCU學習(四):與其餘設備通訊

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 ServerIP地址和端口號以後,將其打開(鏈接)。將程序中的IP地址和端口號換成上面設置好的值,oop

  並把NodeMCUD0端口鏈接上一個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 對象,對象名稱爲clientWiFiClient類是在esp8266庫中已經封裝好的一個TCP客戶端,使用它能夠實現TCP客戶端的實例化,與TCP服務器的鏈接、通訊、狀態判斷等功能。隨後,經過WiFiClient類的一個成員函數 connect() 設置須要鏈接的服務器的 IP地址和端口號,並與遠程TCP服務器創建鏈接,經過其返回值判斷是否鏈接成功。鏈接成功後,便可與服務器進行通訊,經過類的成員函數 isavailable() 函數判斷是否有消息從服務器端發送過來,並根據消息的內容對NodeMCUGPIO16口的Led燈進行控制。

NodeMCU做爲TCP服務器端實現局域網內點亮Led燈(不使用路由器)

  第二種方法是將NodeMCU設置爲softAP模式,至關於一種熱點模式,設置好其WiFi的名字和密碼以後,電腦(TCP客戶端)便可經過WiFi鏈接到其上並與之進行通訊。

 

4-3 程序燒錄至NodeMCU中以後打開串口監視器

  具體步驟以下,先把Led燈鏈接到NodeMCUGPIO16口,以後將程序燒錄至NodeMCU中以後,在串口監視器中能夠看到設置成softAP模式成功,同時能夠獲知NodeMCUIP地址。同時電腦的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燈。

   閱讀原文可訪問我的博客

相關文章
相關標籤/搜索