十三,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] = '

给TA打赏
共{{data.count}}人
人已打赏
ESP32ESP32-基础

十二,ESP32将数据存储到SD卡

2018-9-8 12:44:46

ESP32ESP32-基础

十四,ESP32 中使用中断

2018-9-15 23:46:38

16 条回复 A文章作者 M管理员
  1. ZreDays

    请问,您的这个教程适用与NodeMcu ESP8266么?
    正在研究将 NodeMcu 采集到的j传感器数据,和树莓派上的web应用进行通讯
    您的文章给了我启发 ✗咧嘴笑✗

    • Luca

      直接使用不了哦,需要修改一些东西

  2. 老鐘

    程式的開頭#include改成#include

    另外修改
    ssid = “你家的ssid”;
    password=”你家的password”;

    • 老鐘

      include要加WiFi.h

    • Luca

      是的 尖括号被系统自动过滤掉了

  3. 老鐘

    更正
    #include改成#include

    • 老鐘

      加了大於小於符號的文字出不來

    • Luca

      感谢指正,尖括号被系统过滤掉了

  4. pauline97

    您好 我想问一下我是在云服务器上部署的node-red 那主机号是不是服务器的ip?

    • Luca

      外网想访问的话,可能需要做个反向代理,可以试试nginx的反向代理进行内网域名转发,有相应的教程网上

    • pauline97

      谢谢 我还想问一下esp32作为客户端连接服务器的时候 tcp in类型是监听的时候 tcp是可以连接的 串口监视器一直在connecting这个状态是连接上了吗
      还有为什么tcp in类型选择连接的时候 显示已断开啊 串口监视器显示连接失败

  5. pauline97

    谢谢 我还想问一下esp32作为客户端连接服务器的时候 tcp in类型是监听的时候 tcp是可以连接的 串口监视器一直在connecting这个状态是连接上了吗
    还有为什么tcp in类型选择连接的时候 显示已断开啊 串口监视器显示连接失败

    • Luca

      connecting是还没连上,正在连接中,可以试试用一些软件试试能不能连接到服务器,再用esp32作为客户端进行连接

    • pauline97

      微信小程序能连接到服务器上,服务器的日志和node-red显示这样

    • pauline97

      node-red

  6. 清凉小年

    在学

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();