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程序如下:

 /*-----------------------------------------------------------
                        written by helio, 2019
 WiFiLed.ino - NodeMCU连接到路由器WiFi,将其配置为TCP
 客户端同时与连接到路由器上的Tcp服务器设备(手机或电脑)
 建立Tcp连接
 ------------------------------------------------------------*/

 ;
 const char *RemoteIp = "192.168.1.105"; // 设置远程主机Ip地址
 ; // 设置远程主机端口号

 #include "ESP8266WiFi.h"

 WiFiClient client; // 创建Tcp客户端
 void setup()
 {
   Serial.begin();
   Serial.println();

   WiFi.begin("CEET305", "office305");  // 设置连接到的WiFi名称和密码
   Serial.print("Connecting...");

   while (WiFi.status() != WL_CONNECTED)
   {
     delay();
     Serial.print(".");
   }

   Serial.println();
   Serial.println(WiFi.localIP()); // 打印NodeMCU的IP地址

   if (!client.connect(RemoteIp, RemotePort)) // 建立tcp连接
   {
     Serial.println("Connected failed!");
     return;
   }

   pinMode(Led, OUTPUT); // 设置GPIO16为输出模式
   digitalWrite(Led, LOW); // 初始时,GPIO16输出低电平
 }

 void loop()
 {
   if (client.available())
   {
     char ch = client.read(); // 读取远程网络串口发来的数据
     ')
       digitalWrite(Led, LOW);
     ')
       digitalWrite(Led, HIGH);
   }
 }
                 

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的程序如下:

 /*------------------------------------------------------------
                     written by helio, 2019
 SoftApLed.ino - 将NodeMCU设置为soft-AP模式(热点模式
 )其他设备可以连接到该热点,并将NodeMCU设置为Tcp服务器
 端,同时将其他设备(手机,电脑)配置为Tcp客户端,并连接
 到NodeMCU服务器上,向其发送控制消息
 ------------------------------------------------------------*/

 #include <ESP8266WiFi.h>
 ;          // 将Led连接到GPIO16端口
 ; // 设置ModeMCU端口

 WiFiServer server(LocalPort);
 void setup()
 {
   Serial.begin();
   Serial.println();

   Serial.print("Setting soft_AP...");
   if (WiFi.softAP("ESP8266", NULL))
     Serial.print("Ready");
   else
     Serial.print("Failed");  

   Serial.println();
   server.begin();
   Serial.printf("TcpServerstarted,%s", WiFi.softAPIP().toString().c_str());

   pinMode(Led, OUTPUT);
   digitalWrite(Led, LOW);
 }

 void loop()
 {
   WiFiClient client = server.available(); // 等待客户端连接
   if (client)
   {
     client.write("Hello from NodeMCU");
     Serial.println("Client connected");
     while (client.connected())  // 当客户端保持连接时,从客户端读取数据
     {
       if (client.available()) // 当客户端发送数据时
       {
         char ch = client.read();
         ')
           digitalWrite(Led, LOW);
         ')
           digitalWrite(Led, HIGH);
       }
     }
   } 

   client.stop();  // 断开连接
 }

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

阅读原文可访问个人博客

NodeMCU学习(四):与其他设备通信的更多相关文章

  1. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  2. Linux 系统编程 学习:05-进程间通信2:System V IPC(2)

    Linux 系统编程 学习:05-进程间通信2:System V IPC(2) 背景 上一讲 进程间通信:System V IPC(1)中,我们介绍了System IPC中有关消息队列.共享内存的概念 ...

  3. C++学习笔记22:设备

    设备类型 设备文件的性质 设备文件不是普通的磁盘文件 读写设备的数据需要与相应的设备驱动器通信 设备文件的类型 字符设备:读写串行数据字节流,如串口.终端等 块设备:随机读写固定尺寸数据块,如磁盘设备 ...

  4. TweenMax动画库学习(四)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  5. Android笔记5-与USB HID 设备通信(一)

    1.了解 支持USB 主机(host)或者从机(accessary )模式最终是取决于设备的硬件,而与平台版本无关.我们可以通过usesfeature这个方法来查询自己的设备是否支持USB主从.   ...

  6. Azure IoT 技术研究系列3-设备到云、云到设备通信

    上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub 本文中我们继续深入研究,设备到云.云到 ...

  7. SVG 学习<四> 基础API

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  8. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  9. 网络协议栈学习(一)socket通信实例

    网络协议栈学习(一)socket通信实例 该实例摘自<linux网络编程>(宋敬彬,孙海滨等著). 例子分为服务器端和客户端,客户端连接服务器后从标准输入读取输入的字符串,发送给服务器:服 ...

随机推荐

  1. sqlite 字符串拼接

    select path || '%'  from t_category where depth = 0 and type = 0 用'||'拼接字符串 比如path是/1001/的话 那结果就是/10 ...

  2. 十个强大的DevOps基础设施自动化工具,不容错过

    Devops基础设施自动化的工具 有许多工具用于基础设施自动化.使用哪个工具决定于体系结构和基础设施的需求.下面我们列出了一些伟大的工具,用于不同类别配置管理.编制.持续集成.监控等. 1.Chef ...

  3. Spark 集群搭建

    0. 说明 Spark 集群搭建 [集群规划] 服务器主机名 ip 节点配置 s101 192.168.23.101 Master s102 192.168.23.102 Worker s103 19 ...

  4. VS网站开发的发布部署的不同情况说明

    VS网站开发有两种模式: 1.网站模式 2.应用模式 其中,网站模式的发布,要考虑勾选“使用固定命名和单页程序集”   如下图   网站模式: 新建网站的网站模式   新建网站的网站模式第二步   应 ...

  5. Windows:服务已经标记为删除

    解决办法: 方法一:运行删除服务项命令的时候,服务管理窗口未关闭,关闭服务管理窗口即可: 方法二:删除服务的注册表项,路径为: HKEY_LOCAL_MACHINE\SYSTEM\CurrentCon ...

  6. 在Linux服务器上运行Jupyter notebook server教程

    在Linux服务器上运行Jupyter notebook server教程 很多deep learning教程都推荐在jupyter notebook运行python代码,方便及时交互.但只在本地运行 ...

  7. 【Alpha 冲刺】 12/12

    今日任务总结 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成app端api编写 已完成 JAVA后端跨域访问没有处理(目前已解决),导致前端localhost请求失败而误以为自己操作失误 ...

  8. 2-4 R语言基础 列表

    #列表list > l1 <- list("a",2,10L,3+4i,TRUE) #每个元素没有名字> l1[[1]][1] "a" [[2 ...

  9. oc 的 协变性与逆变性

    ?协变性与逆变性是类型关系在范畴论的定义.是类型的继承关系在高阶类型中的定义? __kindof只是在统一继承体系下方便了类型转化,提供了使用时语法上的便捷:但是对于类型转换是否正确不做判定: kin ...

  10. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-2-Compose 命令说明

    Compose 命令说明 1)命令对象与格式 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中 的服务或者容器.如果没有特别的说明,命令对象将是项目,这意味着项目中所有 ...