esp8266 接收udp广播_ESP8266_11 ESP8266的UDP广播
在之前的章节中讨论了ESP8266中的station模式,在那个主题中描述得较为平淡无奇,并未展示任何吸引人的应用或功能延伸。或许我可以深入探讨一下
在本节中首先关注ESP8266的UDP通信,在深入探讨其广播机制之前,请问您了解什么是UDP通信的问题?
提到UDP时,自然会提及另一个相关的协议——TCP。无需深入讨论它们的定义细节,我们主要关注它们的应用场景。从实用角度来看,TCP/IP体系中的UDP和TCP在数据传输方面扮演着关键角色。
主要区别在于,在TCP通信中,双方必须通过三次握手过程建立连接。发送方每次发送数据前都会向接收方确认是否成功收到数据。该通信方式的优势在于其安全性,在传输速度方面存在不足。相对而言,在传输速度方面存在不足
UDP在发送时,无论是否存在接收端,不论接收到的数据是否完整,只要发送出去。与TCP相比,UDP的安全性稍逊一筹,但速度更快。
但不能说安全性差就不能使用它。例如视频、音频等不重要的数据则通常采用UDP进行传输
UDP包的最大长度是多少?
65535个字节。但是除掉IP头(20字节)和UDP头(8字节)之后,剩余65507个字节。
UDP如何广播?
IP 255.255.255.255 为广播地址,往这个地址发数据,局域网中的所有机器都可以收到。
在对UDP有基本了解后,我们来完成ESP8266的UDP广播任务。本节内容基于上一节的内容进行了一些修改,因此如果能熟练掌握上一节的知识点,那么这一小节的学习将会相对轻松。具体操作过程虽然步骤较多一些,但其实并不复杂,主要分为六个步骤完成。
1
包含头文件
#include "espconn.h"
#include "mem.h"
主要是"espconn.h",涉及到UDP通讯所需的各种数据结构。
2
设置工作模式及相关参数
wifi_set_opmode(0x03); // station+ soft-ap模式
struct softap_config config; //定义AP参数结构体,
wifi_softap_get_config(&config); //获取当前AP模式的参数
os_memcpy(config.ssid,"ESP8266",strlen("ESP8266")); //修改AP名称
os_memcpy(config.password,"123456789",strlen("123456789")); //修改AP密码
config.ssid_len=strlen("ESP8266"); //修改 AP名称的长度
wifi_softap_set_config(&config); //使修改后的参数生效
此时,若将程序烧录进去,可观察到当前环境下存在一个ESP8266的wifi,通过输入密码‘123456789’即可完成连接。
3
扫描并连接当前环境下的wifi
与前一节相同,完成对目前无线网络配置的扫描和识别。我这里已建立好'家庭无线网络名称',请替换成你的家庭无线网络名称。
4
连接成功后,设置UDP相关参数
跟上一节相比,这里要对Wifi_conned();进行修改。
首先头文件中定义一个结构体形式的ESPCONN描述符:
struct espconn user_udp_espconn;
关于espconn,SDK中给出的定义如下:
/** A espconn descriptor */
struct espconn {
/** type of the espconn (TCP, UDP) */
enum espconn_type type;
/** current state of the espconn */
enum espconn_state state;
union {
esp_tcp *tcp;
esp_udp *udp;
} proto;
/** A callback function that is informed about events for this espconn */
espconn_recv_callback recv_callback;
espconn_sent_callback sent_callback;
uint8 link_cnt;
void *reverse;
};
可以看到,不论是TCP通讯还是UDP通讯,都需要使用这个结构体;同时,在结构体内设置相应的发送和接收回调函数。
接下来就是一个UDP参数的设置过程:
wifi_set_broadcast_if(STATIONAP_MODE);
设置UDP广播包的发送接口,默认soft-ap。这里选择的是station和soft-ap。
参数:1、station 2、soft-ap 3、station和soft-ap
user_udp_espconn.type=ESPCONN_UDP; //设置为UDP通信
//开辟UDP参数需要的空间
user_udp_espconn.proto.udp=(esp_udp *)os_zalloc(sizeof(esp_udp));
//设置本地端口和远程端口
user_udp_espconn.proto.udp->local_port=2525;
user_udp_espconn.proto.udp->remote_port=1024;
//设置远程IP
const char udp_remote_ip[4]={255,255,255,255};
os_memcpy(user_udp_espconn.proto.udp->remote_ip,udp_remote_ip,4);
//设置发送完成和接收完成的回调函数
espconn_regist_recvcb(&user_udp_espconn,user_udp_recv_cb);
espconn_regist_sentcb(&user_udp_espconn,user_udp_sent_cb);
//使UDP参数生效
espconn_create(&user_udp_espconn);
//UDP发送函数
user_udp_send();
5
定义发送完成和接收完成的回调函数
void ICACHE_FLASH_ATTR user_udp_sent_cb(void *arg)
{
os_printf("SEND SUCCESS!");
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer,(os_timer_func_t *)user_udp_send,0);
os_timer_arm(&test_timer,1000,0);
}
串口打印:SEND SUCCESS! 然后延时1秒,调用UDP发送函数。
串口为何无法发送中文?SDK 3.0版本中对中文支持情况似乎并不理想,请感兴趣者自行尝试解决。
void ICACHE_FLASH_ATTR user_udp_recv_cb(void *arg,
char *pdata,
unsigned short len)
{
os_printf("udp have received data:%s",pdata);
}
把收到的数据,串口打印出来。
6
定义UDP发送函数
void ICACHE_FLASH_ATTR user_udp_send(void)
{
char hwaddr[6];
char DeviceBuffer[40]={0};
wifi_get_macaddr(STATION_IF,hwaddr);
os_sprintf(DeviceBuffer,"DEVICE MAC ADDRESS IS:"MACSTR"!!
ESP8266 IOT!",MAC2STR(hwaddr));
espconn_send(&user_udp_espconn,DeviceBuffer,os_strlen(DeviceBuffer));
}
利用wifi_get_macaddr函数采集该模式下的MAC地址,并使用espconn_sent函数将其输出至目标设备
函数定义
sint8 espconn_send(
struct espconn *espconn,
uint8 *psent,
uint16 length
)
参数:
struct espconn *espconn : 对应网络传输的结构体
uint8 *psent : 发送的数据
uint16 length : 数据长度
程序修改成功后会执行一系列自动化操作:保存操作(即执行保存步骤)、删除旧文件(即清理工作)、进行编译处理(即完成编译阶段)以及处理下载环节;完成后将设备重新上电运行。在操作过程中需要用到串口助手和网络调试助手这两个辅助工具以观察运行结果。

打开网络调试助手:

如图,依次设置相关的参数。
如何确认显示的MAC地址是否正确?进入路由器管理界面后查看已连接设备的MAC地址:

如此,说明发送端(路由下的8266)和接收端(路由下的PC)成功进行通信。
如果这时候网络调试助手发送数据:hello。
串口助手会收到如下信息:

到此为止,UDP广播已经完成。建议您尝试将当前电脑与8266设备进行连接,并查看网络调试助手中的参数设置,请确认是否已正确配置相关选项.
ESP8266_前言
ESP8266_01搭建开发环境
ESP8266_02程序的编译与下载
ESP8266_03 SDK与Makefile的基本用法
ESP8266_04管脚控制与软件定时器
ESP8266_05 ESP8266有几个串口?
ESP8266_06硬件定时器与IO中断
ESP8266_07基于PWM的呼吸灯
ESP8266_08基于flash的数据掉电保护
ESP8266_09基于IIC控制的OLED屏幕
ESP8266_10 ESP8266的STATION模式
