在之前的教程中,UDP协议的优点超过TCP / IP讨论了在物联网中的应用。UDP协议的开销很小,只有8个字节,这使得它更适合在物联网中使用。本项目将演示UDP协议在物联网中的应用。本课题将ESP8266 Wi-Fi调制解调器配置为UDP服务器,将笔记本电脑配置为UDP Client。客户端和服务器将通过同一个Wi-Fi路由器进行通信,因此,ESP板将作为本地服务器。UDP客户端可以在应用程序的帮助下在特定的端口上发送数据到服务器数据包发件人。
ESP模块工作为服务器检查从特定端口上的客户端接收的UDP数据包。当到达有效数据包时,将向客户端发送一个确认数据包,以连接到已发送的同一端口。响应于接收数据包和发送确认,ESP调制解调器在LED上切换为成功客户端 - 服务器通信的视觉指示。此应用程序非常有用,因为它会通过UDP协议演示服务器/客户端通信。
可以说,本项目设计的物联网设备是一个简单的UDP服务器,带有LED指示灯。它是由LED与ESP-8266 Wi-Fi模块接口而设计的。Wi-Fi模块和LED灯通过USB到串行转换器的帮助持续供电。Wi-Fi模块需要加载一个可以通过UDP协议接收数据并响应确认的固件。Arduino UNO用于ESP8266模块上的固件代码的刷新。ESP模块还可以使用像CP2102这样的FTDI转换器进行代码闪烁。固件本身在Arduino IDE中编写。
所需的组件,
图1:基于UDP协议的客户端服务器通信所需的组件列表
需要软件 -
•Arduino IDE
框图,
图2:ESP8266 UDP服务器和数据包发件人UDP客户端通信的框图
电路连接,
首先,需要在ESP8266板上加载固件代码。在本教程中,固件代码使用Arduino IDE编写。通过Arduino UNO加载到ESP8266板。本项目使用的是通用的ESP8266板。这个板没有任何自举电阻,没有电压调节器,没有复位电路,没有usb串行适配器。ESP8266模块采用3.3 V电源供电,电流大于等于250ma。因此,使用CP2102 USB到串行适配器提供3.3 V电压和足够的电流,使ESP8266在各种情况下可靠运行。
ESP8266 Wi-Fi模块是一个自包含的SOC,具有集成的TCP / IP协议栈,可以访问Wi-Fi网络。ESP8266能够托管应用程序或从另一个应用程序处理器加载所有Wi-Fi网络功能。每个ESP8266模块都使用AT命令设置固件进行预编程。该模块有两种型号 - ESP-01和ESP-12。ESP-12具有16个引脚可用于接口,而ESP-01仅可用8个引脚。ESP-12具有以下引脚配置 -
图3 ESP8266 ESP-12模块引脚配置表
图4 ESP8266 ESP-12模块引脚配置表
ESP-01模型用于该项目。ESP-01型号具有以下引脚配置 -
图5:ESP8266 ESP-01模块引脚配置表
模块的芯片启用和VCC引脚连接到3.3 V DC,而接地销连接到共同的接地。芯片使能引脚通过10K上拉电阻连接到VCC。复位引脚通过触觉开关通过触觉开关连接到地,默认情况下,通过10K拉动电阻将PIN提供VCC。模块的TX和RX引脚连接到Arduino UNO的RX和TX引脚。模块的GPIO-0引脚通过触觉开关连接到接地,其中引脚通过默认提供10K拉压电阻。
这些上拉电阻作为分压器电路,保护ESP8266板免受高压。Arduino板工作在5V和3.3 V, ESP8266工作在3.3 V。虽然Arduino板本身是通过其3.3 V电源引脚供电,这个分压器电路进一步增加了对任何电压冲击的保护。使用上拉电阻增加了电路的稳定性。通过这些电路连接,Arduino板本身就充当了串行适配器的USB接口。Arduino UNO与ESP8266模块用于引导加载的电路连接如下-
图6:Arduino与ESP8266模块之间的电路连接表
在编译代码时,必须按下GPIO0和RESET开关。上传程序时,必须松开RESET开关,同时要按下GPIO0编程开关,才能进入编程模式。在上传代码之后,编程开关也应该被释放。
在Arduino IDE中写下固件代码,并通过USB电缆将Arduino板与PC连接。打开Arduino IDE并转到工具 - >端口,然后选择Arduino Board(Arduino Uno)。它可能看起来像/ dev / ttyabm0(arduino / genuino uno)。选择正确的端口名称。端口名称在不同IDE设置中可以不同。然后通过导航到工具 - >串行监视器并将波特率设置为每秒115200波特的波特率打开串行监视器。通过'处于'和'AT + GMR'命令,以测试Arduino和ESP-01模块之间的连接。尝试不同的设置,了解串行显示器的“线路结束”选项,如NL&CR。尝试不同的组合,直到ESP模块开始使用串行监视器正确交互。
下载Python,皮普和ESPtool。如果ESP模块有任何情况,请擦除预加载的固件。按照ESPTOOL指示串行监视器中的命令将固件代码闪烁到ESP-01模块。查看以下链接以编写使用eSptool-闪烁固件代码的正确命令 -
对于上传程序,必须释放复位开关,而GPIO0编程开关必须按下。加载代码后,也应释放编程开关。通过这种方式,可以使用Arduino Board作为FTDI转换器将固件代码加载到ESP8266。必须注意的是,每个GND都需要常见的是完成电路。GPIO2是Bootloader模式的替代Tx。
删除连接。现在ESP模块已准备安装到项目电路中。在项目电路中,ESP8266与CP2102适配器和LED接口。
CP2102是一个单芯片USB到UART桥。用于为ESP模块提供电源。它也可以用于引导加载。一个CP2102 IC有以下引脚配置-
图7:列出CP2102 IC引脚配置的表
图8:列出CP2102 IC引脚配置的表
图9:CP2102 IC的表列表引脚配置
ESP板连接在CP2102上,用于引导加载和使用。将ESP-01 TX引脚连接到CP2102的RX引脚上进行引导加载,将ESP的RX引脚连接到CP2102的TX上进行引导加载,以便双方都能发送和接收数据。ESP8266-01需要3.3 V电源供电,因此ESP的VCC连接到CP2102的3V3上,两者的gnd需要相互连接。ESP8266的复位引脚连同10k的上拉电阻(bootstrap电阻)连接到CP2102的RTS引脚。GPIO0为编程引脚,用于将ESP-01送入编程模式。GPIO0连同10K上拉电阻连接到CP2102的DTR引脚上。ES-01的CHPD引脚上拉10K电阻。ESP模块与CP2102之间的电路连接情况汇总如下表-
图10 ESP8266 ESP-01 Module与CP2102 IC之间的电路连接表
ESP模块与CP2102适配器连接后,必须将适配器连接到PC上,并按照Arduino演示的方法加载ESP模块的固件代码。
加载代码后,ESP模块会自动使用固件中给出的SSID访问Wi-Fi点。ESP模块上有LED。LED的阳极引脚与GPIO2用220欧姆串联电阻连接,阴极引脚与GND连接。ESP模块现在已经准备好通过Wi-Fi路由器接收UDP协议的数据,并将控制LED指示与UDP客户端成功通信。
图11:ESP8266 UDP Server原型
笔记本电脑,数据包发送方作为UDP Client。事实上,任何其他支持UDP的客户端都可以使用。将报文发送方设置为UDP客户端,首先打开报文发送方,在需要的字段中写下输入参数。在名称字段中,可以写入任何名称,以便能够惟一地标识客户端。在ASCII字段中,写实际的数据报必须被发送,在地址中,写UDP服务器的IP地址和服务器正在侦听的端口。就是这么简单。安装并启动数据包发送方应用程序。填写所需字段后,客户端就可以将数据报发送到服务器了。
图12:报文发送端UDP客户端截图
电路是如何工作的
在此设置中,ESP调制解调器作为UDP服务器。它装载了一个固件,可以接收UDP协议上的数据,并在响应发送回一个确认在同一端口。笔记本电脑是作为UDP客户端使用包发送应用程序发送数据报。与UDP Client通信成功后,ESP modem上的固件代码点亮LED。
在基于UDP服务器的ESP8266的固件代码中,Wi-Fi连接由可用的路由器发起,UDP连接使用标准库功能建立。一个名为WifiUDP.h的库被导入到ESP代码中,用于管理UDP连接并通过它接收数据。一旦UDP数据包成功接收,代码发送一个确认在同一端口,并设置LED连接引脚为HIGH。下面的流程图演示了在ESP8266 UDP server -上的UDP连接和数据管理
图13:ESP8266 UDP服务器连接与数据管理流程图
在笔记本电脑端,UDP连接和数据传递完全由包发送程序管理。
编程指南,
ESP8266调制解调器被编程为UDP服务器。ESP代码中引入了WifiUDP.h,用于管理UDP连接,并通过该连接接收数据。一个wifiUDP对象被实例化用于UDP例程的编程。指定服务器侦听的UDP端口。为了接收任何消息,将设置一个缓冲区,以便不遗漏任何消息。当客户端发送消息时,服务器将通过发送另一个包来确认客户端。
WiFiUDP Udp;
unsigned int localUdpPort = 5291;
char incomingPacket [255];
char replypacekt [] =“欢迎来到这里!”;
声明后,Wi-Fi连接启动。ESP8266 Wi-Fi用于连接服务器和接入点(Internet)。下面的代码声明了Wi-Fi的SSID和密码。
const char* ssid = "检测到病毒";
Const char* password = " 123456789 ";
以下功能用于启动Wi-Fi连接。
WiFi。开始(ssid、密码);//启动ESP8266网络连接
当与Internet建立连接后,服务器将通过以下功能监听指定端口的入站报文
udp.begin(localudpport);
这样,服务器就在指定的端口上建立了与Internet的连接。现在服务器已经准备好监听任何消息。当服务器接收到客户端请求并根据接收到的请求进行响应时。服务器将等待接收传入的数据包。当服务器接收到数据包时,它将其存储到缓冲区并用于进一步处理。在整个过程中,一旦收到数据包,代码就会打印出发送方的IP地址和端口,以及收到的数据包的长度。如果包不是空的,它的内容也会被打印出来。下面的代码设法接收数据包-
//侦听传入的UDP数据包
int packetSize = Udp.parsePacket();
/ /收到包吗?是的!
如果(packetSize)
{
系列。printf(" Received %d bytes from %s, port %dn ", packetSize,
.c_str .toString Udp.remoteIP () () (), UDP.remotePort ());
int len = Udp。读(incomingPacket, 255);
If (len > 0)
{
incomingPacket (len) = 0;}
系列。printf(" UDP包内容:%sn ",传入数据包);
每当从UDP客户端发送消息时,UDP服务器通过发送确认消息向该客户端确认。对于每个接收的数据包,使用以下函数发送确认数据包 -
Udp.remotePort Udp.beginPacket (Udp.remoteIP () ());
Udp.write (replyPacekt);
Udp.endpacket();
必须注意,使用udp.remoteip()和udp.remoteport()将回复发送到发件人的IP和端口。
因此,服务器在等待接收报文,当客户端发送报文时,服务器根据IP地址和端口号进行识别,然后在接收到报文后,发送确认报文通知客户端。通过这种方式,建立了服务器-客户端通信。当传输数据成功时,服务器将LED连接引脚设置为HIGH,点亮LED,直观地表明UDP通信成功。
在下一个教程中,学习关于CoAP协议。
项目源代码
###/ /程序#包括#包括 const char* ssid = "检测到病毒";Const char* password = "techshlok";Int status_led = 2;WiFiUDP Udp;unsigned int localUdpPort = 5219;//本地端口监听char ReceivedMessage[255];// buffer for incoming packets char Acknowledge[] = "收到你的消息:";//返回一个应答字符串void setup() {Serial.begin(115200);pinMode (status_led、输出);以(); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("Wi-Fi connected!"); Udp.begin(localUdpPort); Serial.printf("I am listening at IP %s, UDP port %dn", WiFi.localIP().toString().c_str(), localUdpPort); } void loop() { int packetSize = Udp.parsePacket(); if (packetSize) { // receive incoming UDP message Serial.printf("Received %d message from %s, port %dn", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); int len = Udp.read(ReceivedMessage, 255); if (len > 0) { ReceivedMessage[len] = 0; } Serial.printf("UDP message: %sn", ReceivedMessage); digitalWrite(status_led, HIGH); delay(1000); digitalWrite(status_led, LOW); // send back a reply, to the IP address and port we got the packet from Udp.beginPacket(Udp.remoteIP(), Udp.remotePort()); Udp.write(Acknowledge); Udp.endPacket(); } } ###