这期我们介绍ESP32UDP通信的使用方法, UDP大家可能有些陌生,但是他是在网络通信中的一种通信协议。学会这个功能,对我们今后在网络应用开发方面有一定的帮助。
目录
一、什么是UDP
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去! UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。 例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。 QQ就使用UDP发消息,因此有时会出现收不到消息的情况。 TCP协议和UDP协议各有所长、各有所短,适用于不同要求的通信环境。
通俗点讲UDP就是一个 ERP32进行网络通信的一个通信协议。我们可以在esp32单片机机中利用WiFi模块的功能建立一个网络连接,我们可以通过网络串口助手发送数据,并由esp32来接收到。这样我们就完成了网络数据的发送与接收。下面我们来看一看具体的代码应该如何使用。
二、原理和操作流程
首先我们准备自己家里的无线网的名称和密码,查看自己家里网络的IP地址。其次在电脑中下载网络串口助手,将通信协议设置为UDP模式。
我们让ESP32单片机连接到家里的网络,在把串口助手下载到电脑上。让自己的电脑和ESP32单片机都连接到同一个网络。
到这里准备工作完成。
具体代码
#include <WiFi.h>
#include <WiFiUdp.h> //引用以使用UDP
const char *ssid = "********";
const char *password = "********";
WiFiUDP Udp; //创建UDP对象
unsigned int localUdpPort = 2333; //本地端口号
void setup()
{
Serial.begin(115200);
Serial.println();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (!WiFi.isConnected())
{
delay(500);
Serial.print(".");
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(WiFi.localIP());
Udp.begin(localUdpPort); //启用UDP监听以接收数据
}
void loop()
{
int packetSize = Udp.parsePacket(); //获取当前队首数据包长度
if (packetSize) //如果有数据可用
{
char buf[packetSize];
Udp.read(buf, packetSize); //读取当前包数据
Serial.println();
Serial.print("Received: ");
Serial.println(buf);
Serial.print("From IP: ");
Serial.println(Udp.remoteIP());
Serial.print("From Port: ");
Serial.println(Udp.remotePort());
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); //准备发送数据
Udp.print("Received: "); //复制数据到发送缓存
Udp.write((const uint8_t*)buf, packetSize); //复制数据到发送缓存
Udp.endPacket(); //发送数据
}
}
三.代码解析
首先我们声明,两个库,第1个是我们WiFi功能的正常库,第2个便是 Udp的,我们可以用它来使用UDP功能。其次我们输入自己家里的WiFi的名称和密码。
接下来创建UDP对象和本地的端口号。在主函数里面,我们首先打开串口,设置不脱离和效果的打印功能。然后我们调用WiFi功能中的sta模式建立一个连接,或者是说一个WiFi的接入点。接下来是具体的逻辑代码,用来实现应用和服务器的连接。并启用udp来监听接收的数据。并在loop函数中我们获取数据的长度。读取当前数据包的数据以及设置相约缓存和发送数据的功能。下面是经过测试后的,实例演示。
四.遇到的问题
细心的朋友可能已经发现了,我们可以通过电脑的网络串口助手,向ESP32单片机发送数据,并且ESP32单片机也可以接收到数据,并显示串口号和地址,但是当我从ERP32的窗口监视器中发送数据,让电脑的串口助手接收的时候,是无法接收到的。这个问题首先我想到的是程序的问题,但经过程序的排查,我发现是程序是没有问题的。具体情况我还在查找中,如果小伙伴谁知道这个问题的原因,可以在下方评论。