UDP简介
UDP协议是一种无需建立连接就可以发送封装的IP数据出去的方式,相比较于TCP协议来说无需先建立连接之后再进行发送数据,UDP属于一种面向事务的简单不可靠信息传送服务,我们在使用ESP32进行UDP通信时相对于TCP连接来说由于协议简单数据传输会更为迅速,但是相对的数据也容易丢失,所以UDP传输信息相对来说不那么可靠,下面我们将使用ESP32发出热点之后用电脑与ESP32进行简单的UDP通信
UDP通信
程序流程
我们下面将编写一个包含UDP通信数据接收和数据发送的程序以方便我们学习,我们在电脑上打开UDP通信软件向ESP32发送数据,ESP32将会把接收到的数据原样返回到电脑上
上面是我们本次程序的大致流程,下面我们看到ESP32使用UDP通信部分基础函数
UDP函数参考
uint8_t begin(IPAddress a, uint16_t p)
函数功能:启动监听来自与于某个地址发送给某个端口的数据或者监听某个端口的数据
参数
a
为监听的IP地址
p
为监听的端口号
int parsePacket()
函数功能:获取接收数据信息
返回值:如果有数据包可用,则返回队首数据包长度,否则返回
0
IPAddress remoteIP()
函数功能:获取目标设备的
IP地址
返回值:
目标IP地址
uint16_t remotePort()
函数功能:获取目标设备的
端口号
返回值:
目标端口号
int read(char* buffer, size_t len)
函数功能:读取数据
int beginPacket(IPAddress ip, uint16_t port)
函数功能:准备发送数据
参数
ip
为目标IP
port
为目标端口号
int endPacket()
函数功能:发送数据
void stop()
函数功能:停止监听,释放资源
贴上代码
我们了解完一些需要用到的函数之后,我们开始看到代码部分,注释都打上了,可以看注释来学习程序
#include <WiFi.h> //wifi功能需要的库
WiFiUDP Udp;//声明UDP对象
const char* wifi_SSID="ESP32_Udp"; //存储AP的名称信息
const char* wifi_Password="ESP32_1234"; //存储AP的密码信息
uint16_t udp_port=1122; //存储需要监听的端口号
char incomingPacket[255]; //存储Udp客户端发过来的数据
void setup() {
// put your setup code here, to run once:
Serial.begin(115200); //开启串口,波特率为115200
WiFi.softAP(wifi_SSID,wifi_Password); //打开ESP32热点
Serial.print("\n开发板IP地址为:");
Serial.print(WiFi.softAPIP()); //串口输出模块IP地址
Udp.begin(udp_port);//启动UDP监听这个端口
}
void loop() {
// put your main code here, to run repeatedly:
/*接收发送过来的Udp数据*/
int Data_length=Udp.parsePacket(); //获取接收的数据的长度
if(Data_length) //如果有数据那么Data_length不为0,无数据Data_length为0
{
int len = Udp.read(incomingPacket, 255); //读取数据,将数据保存在数组incomingPacket中
if (len > 0) //为了避免获取的数据后面乱码做的判断
{
incomingPacket[len] = 0;
}
/*将接受到的数据发送回去*/
Udp.beginPacket(Udp.remoteIP(),Udp.remotePort()); //准备发送数据到目标IP和目标端口
Udp.print("receive data:"); //将数据receive data:放入发送的缓冲区
Udp.println(incomingPacket); //将接收到的数据放入发送的缓冲区
Udp.endPacket(); //向目标IP目标端口发送数据
}
}
程序烧录验证
将以上程序烧录进ESP32之后,我们在网上找一个可以进行UDP通信的软件进行通信测试,成功之后以上程序可以作为以后写UDP通信程序的模板进行使用
烧录程序之后打开串口监视器,按下复位键可以看到返回的IP地址如下图所示
在用电脑上位机进行通信的时候需要注意两个参数,一个是上面获取的IP地址,一般都会是默认的192.168.4.1,另一个是我们在程序里面设置的监听端口号,我们上面设置的端口号会需要用到,wifi的账号密码就不说了再前面的文章中有相关的说明
上面用到的软件以及程序等可以在下方留言邮箱获取,都整理好了
总结
ESP32在进行UDP通信的时候需要注意目标IP、目标端口号和监听IP和监听端口号几个参数之间容易弄混,ESP32在使用arduino开发环境进行UDP通信时还是较为简单,可以直接套用以上模板进行通信,本期和UDP通信相关的就到这里了,有问题大家可以一起在评论区交流沟通!