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灯。

   阅读原文可访问我的博客

相关文章
相关标签/搜索