esp8266 udp广播(esp8266 udp发送)

esp8266 udp广播(esp8266 udp发送)先来看看 ESP8266 的 UDP 通讯 主要看它的广播模式 说这个 需要先了解 UDP 通讯是什么 说到 UDP 伴随而来的还有另一个东西 就是 TCP 这里不说定义 只说应用 简单来说 这两者都是网络 通信 中常用的通信协议 最主要的区别 TCP 通讯比较稳定 它和接收端要进行三次握手 接收端有没有收到数据 都能知道 优点是安全 缺点是和 UDP 相比 速度慢 UDP 在发送时 不管有没有接收方 也不管接收方有没有收到 只要把数据发出去 就完了 所以 相比 TCP 安全性差一些 速度要快一些



先来看看ESP8266的UDP通讯,主要看它的广播模式。说这个,需要先了解UDP通讯是什么?

说到UDP,伴随而来的还有另一个东西,就是TCP。这里不说定义,只说应用。简单来说,这两者都是网络通信中常用的通信协议。

最主要的区别,TCP通讯比较稳定,它和接收端要进行三次握手,接收端有没有收到数据,都能知道。优点是安全,缺点是和UDP相比,速度慢。UDP在发送时,不管有没有接收方,也不管接收方有没有收到,只要把数据发出去,就完了。所以,相比TCP,安全性差一些,速度要快一些。

但并不是说安全性差,就不能用,像视频、音频等一些无关紧要的数据,都可以用UDP来进行传输。

UDP包的最大长度是多少?

65535个字节。但是除掉IP头(20字节)和UDP头(8字节)之后,剩余65507个字节。

UDP如何广播?

IP 255.255.255.255 为广播地址,往这个地址发数据,局域网中的所有机器都可以收到。

对UDP有一个基本了解之后,咱们来进行ESP8266的UDP广播。本节程序是在上一节程序基础上修改的,所以如果你上一节看懂了,这一节是很简单的。使用步骤多一点,但是并不麻烦,分为6步。

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

跟上一节一样,扫描当前环境下的wifi,并进行连接。我这里连接我家里的“shatanliu”,你要改成你自己的。

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发送函数。

为什么串口不发送中文?SDK3.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函数获取station模式下的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,看网络调试助手里的参数如何修改。

编程小号
上一篇 2025-01-29 16:06
下一篇 2025-03-21 19:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/12220.html