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
您可以在左侧看到,Node-RED提供了一个协议和实用程序节点列表,例如:tcp,udp,http,debug,inject,…
在本次会议中,我们只关注一些节点,如:tcp,udp,debug和inject。
– debug node:它可用于在侧栏的调试选项卡(位于Red Deploy按钮的右上角)中显示任何消息属性的输出。现在,您可以将节点拖放到FLOW工作区,然后双击它,您将看到有关它的所有信息。
– inject 节点:按下节点左侧的按钮可以将消息注入流中。您可以将其拖放到FLOW工作区以获取更多信息。这里的消息在有效负载名称下,它可以是string,boolean,json,…
– tcp输入 节点:此节点可以充当客户端或服务器模式,但在我们的情况下,我们需要将其充当服务器,接受ESP32客户端连接,接收数据并转发到调试节点进行打印。
– tcp输出节点:此节点可以充当客户端或服务器模式,但在我们的情况下,我们需要将其充当客户端。它将连接并将数据从注入节点转发到ESP32服务器。
注意: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”]]}]
这足以用于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节点上的按钮
– 如果看到此错误,请等到tcp节点重新连接ESP32服务器
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] = '
请问,您的这个教程适用与NodeMcu ESP8266么?
正在研究将 NodeMcu 采集到的j传感器数据,和树莓派上的web应用进行通讯
您的文章给了我启发 ✗咧嘴笑✗
直接使用不了哦,需要修改一些东西
程式的開頭#include改成#include
另外修改
ssid = “你家的ssid”;
password=”你家的password”;
include要加WiFi.h
是的 尖括号被系统自动过滤掉了
更正
#include改成#include
加了大於小於符號的文字出不來
感谢指正,尖括号被系统过滤掉了
您好 我想问一下我是在云服务器上部署的node-red 那主机号是不是服务器的ip?
外网想访问的话,可能需要做个反向代理,可以试试nginx的反向代理进行内网域名转发,有相应的教程网上
谢谢 我还想问一下esp32作为客户端连接服务器的时候 tcp in类型是监听的时候 tcp是可以连接的 串口监视器一直在connecting这个状态是连接上了吗
还有为什么tcp in类型选择连接的时候 显示已断开啊 串口监视器显示连接失败
谢谢 我还想问一下esp32作为客户端连接服务器的时候 tcp in类型是监听的时候 tcp是可以连接的 串口监视器一直在connecting这个状态是连接上了吗
还有为什么tcp in类型选择连接的时候 显示已断开啊 串口监视器显示连接失败
connecting是还没连上,正在连接中,可以试试用一些软件试试能不能连接到服务器,再用esp32作为客户端进行连接
微信小程序能连接到服务器上,服务器的日志和node-red显示这样
node-red
在学