十三,ESP32使用TCP/IP

ESP32使用TCP/IP

1.简介

在本教程中,我们将学习如何使用ESP32的Internet功能。这将成为申请物联网(IoT)的基础知识。我们将学习一些概念,例如:TCP / UDP-IP,Web服务器,MQTT(消息队列遥测传输)协议。除此之外,我们还需要一个工具/应用程序来测试ESP32的Internet功能,因此我们将使用Node-RED。Node-RED是一个基于流的编程工具,由IBM的Emerging Technology Services 团队开发,现在是JS Foundation的一部分。

1.1 TCP / UDP – IP

CP和UDP是用于通过Internet将数据包发送到IP地址的协议。

TCP(传输控制协议)关心可靠性。这意味着TCP确保收件人以正确的顺序接收数据包并且没有错误。收件人将ACKnowledge发送回发送方以通知它收到了数据包。如果发送方在超时期限内没有得到确认,它将重新发送数据包给收件人,直到收件人收到数据包。重传仅在特定次数发生,而不是永远发生。许多高层应用程序协议使用TCP / IP进入Internet。它们是超文本传输​​协议(HTTP),文件传输协议(FTP),Telnet(Telnet)和简单邮件传输协议(SMTP)。TCP / IP使用客户端/服务器模型,服务器将在其中等待并侦听来自客户端的连接。

UDP(用户数据报协议)不关心可靠性。这意味着发件人不会确保收件人收到该数据包。如果收件人丢失了一些UDP数据包,则收件人无法再次请求这些数据包。但是,失去所有开销将使沟通更快。

在本次会议中,我们将学习如何将ESP32作为TCP客户端或服务器(2个演示)。我还将在此描述2个演示的要求:

– 演示8.1:当ESP32处于服务器模式时,它将等待来自客户端的连接,数据(“hello world”字符串),然后将此数据打印到终端。

– 演示8.2:当ESP32处于客户端模式时,它将创建一个连接并每隔5秒向服务器发送一个数据(一个“hello world”字符串)。

1.2节点RED

为了解决TCP / UDP,我建议我们应该使用一个名为Node-RED的工具

关于Node-RED,它是一个基于流的物联网编程。要了解更多信息,请访问:https://nodered.org/#features

如需安装,您可以按照此处提及的步骤(根据您的操作系统)进行操作:

http://nodered.org/docs/getting -started / installation.html

为了运行它,您可以按照以下步骤操作:

https//nodered.org/docs/getting-started/running运行

后,打开Web浏览器,转到地址:http: //127.0.0.1:1880/v

十三,ESP32使用TCP/IP

您可以在左侧看到,Node-RED提供了一个协议和实用程序节点列表,例如:tcp,udp,http,debug,inject,…

在本次会议中,我们只关注一些节点,如:tcp,udp,debug和inject。

– debug node:它可用于在侧栏的调试选项卡(位于Red Deploy按钮的右上角)中显示任何消息属性的输出。现在,您可以将节点拖放到FLOW工作区,然后双击它,您将看到有关它的所有信息。

十三,ESP32使用TCP/IP

– inject 节点:按下节点左侧的按钮可以将消息注入流中。您可以将其拖放到FLOW工作区以获取更多信息。这里的消息在有效负载名称下,它可以是string,boolean,json,…

十三,ESP32使用TCP/IP

– tcp输入 节点:此节点可以充当客户端或服务器模式,但在我们的情况下,我们需要将其充当服务器,接受ESP32客户端连接,接收数据并转发到调试节点进行打印。

十三,ESP32使用TCP/IP

– tcp输出节点:此节点可以充当客户端或服务器模式,但在我们的情况下,我们需要将其充当客户端。它将连接并将数据从注入节点转发到ESP32服务器。 

十三,ESP32使用TCP/IP

注意:Node-RED支持导入/导出模型功能,以便您可以在 JSON字符串格式下保存(导出)模型。然后重新打开(导入)它。这是导出功能的结果:

[{“id”:“4697139c.bf618c”,“type”:“tcp in”,“z”:“3fdd0fee.405598”,“name”:“”,“server”:“server”,“host”: “”, “口”: “8088”, “datamode”: “流”, “数据类型”: “UTF8”, “换行”: “”, “主题”: “”, “BASE64”:假的, “X” :109.5, “Y”:156, “线”:[[ “ac4b15e3.4a2c88”]]}]

十三,ESP32使用TCP/IP
十三,ESP32使用TCP/IP

这足以用于TCP / IP使用。

1.3 TCP / IP ESP32

ESP32提供了一个使ESP32成为客户端或服务器的库。您需要了解一些课程:

1.3.1 WiFi

我们使用此类创建与WiFi的连接。它是一个静态类,它有一些重要的成员函数:

– WiFi.begin(ssid,密码):你应该用你的WiFi ssid和密码替换ssid和密码。

– WiFi.status():返回WiFi的当前状态(连接与否)

– WiFi.localIP():获取ESP32的当前本地IP地址。

1.3.2 WiFiClient

我们使用此类创建TCP客户端实例。它有一些重要的成员函数:

– connect(主机,端口):连接到主机上的TCP服务器(IP地址)和端口

– 打印(data []):发送数据到服务器

– stop():停止连接

– 可用( ):检查数据是否可供读取

– 读取():读取一个字节的数据

– 读取(uint8_t * buf,size_t size):读取大小字节数据到buf

– 写入(uint8_t数据):写入一个字节数据

– write(const uint8_t * buf,size_t size):在buf中写入大小字节

– connected():是客户端连接的

1.3.3 WiFiServer

我们使用此类创建TCP Server实例。它有一些重要的成员函数:

– begin():start Server

– available():是否有客户端要连接。

– accept():接受客户端连接

– 写入(uint8_t数据):写入一个字节数据

– 写入(const uint8_t * buf,size_t size):在buf中写入大小字节

有关更多信息,可以参考WiFiClient.h和WiFiServer.h

1.4演示8.1 – ESP32是TCP服务器 – 节点RED是TCP客户端

ESP32处于服务器模式它将等待来自客户端的连接,数据(“hello world”字符串),然后将此数据打印到终端。

提示:获取PC的IP地址。使用终端中的以下命令:

– Windows操作系统:使用ipconfig命令

– Linux / Mac OS:使用ifconfig命令

1.4.1 Node-RED模型

只需导入下面的Json字符串(记得在tcp节点中更改服务器的IP地址):

[{“id”:“866fb572.d4ebc”,“type”:“tcp out”,“z “:” f5a25538.3c5518″ , “主人”: “192.168.1.105”, “口”: “8088”, “的BEServer”: “客户端”, “BASE64”:假的, “结束”:假的, “名”: “”,“x”:420.5,“y”:163,“电线”:[]}]

然后单击按钮Deploy(右上角的红色按钮)以部署模型。

注意:

– 等到在tcp节点下看到连接的字符串,然后单击inject节点上的按钮

十三,ESP32使用TCP/IP
图:TCP节点下的连接字符串

– 如果看到此错误,请等到tcp节点重新连接ESP32服务器

十三,ESP32使用TCP/IP
图:错误连接后等待TCP节点重新连接

1.4.2 ESP32端

创建Arduino项目并使用代码保存为esp32server

#include 
const char* ssid     = "tenda";
const char* password = "phong707";
/* create a server and listen on port 8088 */
WiFiServer server(8088);
void setup()
{
    Serial.begin(115200);
    Serial.print("Connecting to ");
    Serial.println(ssid);
    /* connecting to WiFi */
    WiFi.begin(ssid, password);
    /*wait until ESP32 connect to WiFi*/while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected with IP address: ");
    Serial.println(WiFi.localIP());
    /* start Server */
    server.begin();
}
void loop(){
    /* listen for client */
    WiFiClient client = server.available(); 
    uint8_t data[30]; 
    if (client) {                   
      Serial.println("new client");         
      /* check client is connected */           
      while (client.connected()) {          
          if (client.available()) {
              int len = client.read(data, 30);
              if(len < 30){
                  data[len] = '\0';  
              }else {
                  data[30] = '\0';
              }    
              Serial.print("client sent: ");            
              Serial.println((char *)data); 
          }
      } 
    }
}

十三,ESP32使用TCP/IP
图:演示8.1 的结果(ESP32是TCP服务器)

1.5演示8.2 – ESP32是TCP客户端 – 节点RED是TCP服务器

1.5.1 Node-RED模型

只需导入下面的Json字符串(记得在tcp节点中更改服务器的IP地址):

[{“id”:“4697139c.bf618c”,“type”:“tcp in”,“z “:” 3fdd0fee.405598″ , “名”: “”, “服务器”: “服务器”, “主人”: “”, “口”: “8088”, “datamode”: “流”, “数据类型”: “UTF8”, “换行”: “”, “主题”: “”, “BASE64”:假, “×”:109.5, “Y”:156, “线”:[[ “ac4b15e3.4a2c88”]]} ]

1.5.2 ESP32

创建Arduino项目并保存为esp32client,代码如下:

#include 
/* change ssid and password according to yours WiFi*/
const char* ssid     = "tenda";
const char* password = "phong707";
/*
 * This is the IP address of your PC
 * [Wins: use ipconfig command, Linux: use ifconfig command]
*/
const char* host = "192.168.1.106";
const int port = 8088;
void setup()
{
    Serial.begin(115200);
    Serial.print("Connecting to ");
    Serial.println(ssid);
    /* connect to your WiFi */
    WiFi.begin(ssid, password);
    /* wait until ESP32 connect to WiFi*/while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
    Serial.println("");
    Serial.println("WiFi connected with IP address: ");
    Serial.println(WiFi.localIP());
}
void loop()
{
    delay(5000);
    Serial.print("connecting to ");
    Serial.println(host);
    /* Use WiFiClient class to create TCP connections */
    WiFiClient client;
    
    if (!client.connect(host, port)) {
        Serial.println("connection failed");
        return;
    }
    /* This will send the data to the server */
    client.print("hello world");
    client.stop();
}

十三,ESP32使用TCP/IP
图:演示8.2的结果(ESP32TCP的客户端)
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Arduino
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论