esp8266 udp广播(esp8266 udp发送)

esp8266 udp广播(esp8266 udp发送)p span 先来看看 ESP8266 的 UDP 通讯 主要看它的广播模式 说这个 需要先了解 UDP 通讯是什么 span p p 说到 UDP 伴随而来的还有另一个东西 就是 TCP 这里不说定义 只说应用 简单来说 这两者都是网络 span 通信 span 中常用的通信协议 lt p

大家好,我是讯享网,很高兴认识大家。




讯享网

<p> <span>先来看看ESP8266的UDP通讯,主要看它的广播模式。说这个,需要先了解UDP通讯是什么?</span></p> <p> 说到UDP,伴随而来的还有另一个东西,就是TCP。这里不说定义,只说应用。简单来说,这两者都是网络<span>通信</span>中常用的通信协议。</p> <p> 最主要的区别,TCP通讯比较稳定,它和接收端要进行三次握手,接收端有没有收到数据,都能知道。优点是安全,缺点是和UDP相比,速度慢。<span>UDP在发送时,不管有没有接收方,也不管接收方有没有收到,只要把数据发出去,就完了。所以,相比TCP,安全性差一些,速度要快一些。</span></p> <p> 但并不是说安全性差,就不能用,像视频、音频等一些无关紧要的数据,都可以用UDP来进行传输。</p> <p> <strong>UDP包的最大长度是多少?</strong></p> <p> 65535个字节。但是除掉IP头(20字节)和UDP头(8字节)之后,剩余65507个字节。</p> <p> <strong>UDP如何广播?</strong></p> <p> IP 255.255.255.255 为广播地址,往这个地址发数据,局域网中的所有机器都可以收到。</p> <p> 对UDP有一个基本了解之后,咱们来进行ESP8266的UDP广播。本节程序是在上一节程序基础上修改的,所以如果你上一节看懂了,这一节是很简单的。使用步骤多一点,但是并不麻烦,分为6步。</p> <p> 1.<span>包含头文件</span></p> <p> #include "espconn.h"</p> <p> #include "mem.h"</p> <p> 主要是"espconn.h",涉及到UDP通讯所需的各种数据结构。</p> <p> 2.<span>设置工作模式及相关参数</span></p> <p> wifi_set_opmode(0x03);          // station+ soft-ap模式</p> <p> struct softap_config config;    //定义AP参数结构体,</p> <p> wifi_softap_get_config(&config);   //获取当前AP模式的参数</p> <p> os_memcpy(config.ssid,"ESP8266",strlen("ESP8266"));         //修改AP名称</p> <p> os_memcpy(config.password,"",strlen(""));      //修改AP密码</p> <p> config.ssid_len=strlen("ESP8266");         //修改 AP名称的长度</p> <p> wifi_softap_set_config(&config);             //使修改后的参数生效</p> <p> 此时,如果把程序烧录进去,可以看到当前环境下有一个ESP8266的wifi,输入密码“”可以连接。</p> <p> 3.<span>扫描并连接当前环境下的wifi</span></p> <p> 跟上一节一样,扫描当前环境下的wifi,并进行连接。我这里连接我家里的“shatanliu”,你要改成你自己的。</p> <p> 4.<span>连接成功后,设置UDP相关参数</span></p> <p> 跟上一节相比,这里要对Wifi_conned();进行修改。</p> <p> 首先头文件中定义一个结构体形式的ESPCONN描述符:</p> <p> struct espconn user_udp_espconn;</p> <p> 关于espconn,SDK中给出的定义如下:</p> <p> / A espconn descriptor */</p> <p> struct espconn {</p> <p> / type of the espconn (TCP, UDP) */</p> <p> enum espconn_type type;</p> <p> / current state of the espconn */</p> <p> enum espconn_state state;</p> <p> union {</p> <p> esp_tcp *tcp;</p> <p> esp_udp *udp;</p> <p> } proto;</p> <p> / A callback function that is informed about events for this espconn */</p> <p> espconn_recv_callback recv_callback;</p> <p> espconn_sent_callback sent_callback;</p> <p> uint8 link_cnt;</p> <p> void *reverse;</p> <p> };</p> <p> 可以看到,无论是TCP通讯还是UDP通讯,都要用到这个结构体,同时,要在结构体内设置相应的发送、接收回调函数。</p> <p> 接下来就是一个UDP参数的设置过程:</p> <p> wifi_set_broadcast_if(STATIONAP_MODE);</p> <p> 设置UDP广播包的发送接口,默认soft-ap。这里选择的是station和soft-ap。</p> <p> 参数:1、station   2、soft-ap        3、station和soft-ap</p> <p> user_udp_espconn.type=ESPCONN_UDP;      //设置为UDP通信</p> <p> //开辟UDP参数需要的空间</p> <p> user_udp_espconn.proto.udp=(esp_udp *)os_zalloc(sizeof(esp_udp));</p> <p> //设置本地端口和远程端口</p> <p> user_udp_espconn.proto.udp->local_port=2525;</p> <p> user_udp_espconn.proto.udp->remote_port=1024;</p> <p> //设置远程IP</p> <p> const char udp_remote_ip[4]={255,255,255,255};</p> <p> os_memcpy(user_udp_espconn.proto.udp->remote_ip,udp_remote_ip,4);</p> <p> //设置发送完成和接收完成的回调函数</p> <p> espconn_regist_recvcb(&user_udp_espconn,user_udp_recv_cb);</p> <p> espconn_regist_sentcb(&user_udp_espconn,user_udp_sent_cb);</p> <p> //使UDP参数生效</p> <p> espconn_create(&user_udp_espconn);</p> <p> //UDP发送函数</p> <p> user_udp_send();</p> <p> 5.<span>定义发送完成和接收完成的回调函数</span></p> <p> void ICACHE_FLASH_ATTR user_udp_sent_cb(void *arg)</p> <p> {</p> <p> os_printf("SEND SUCCESS!");</p> <p> os_timer_disarm(&test_timer);</p> <p> os_timer_setfn(&test_timer,(os_timer_func_t *)user_udp_send,0);</p> <p> os_timer_arm(&test_timer,1000,0);</p> <p> }</p> <p> 串口打印:SEND SUCCESS!   然后延时1秒,调用UDP发送函数。</p> <p> 为什么串口不发送中文?SDK3.0的版本,串口对中文的支持好像不太好,有兴趣的自己试一下。</p> <p> void ICACHE_FLASH_ATTR user_udp_recv_cb(void *arg,</p> <p> char *pdata,</p> <p> unsigned short len)</p> <p> {</p> <p> os_printf("udp have received data:%s",pdata);</p> <p> }</p> <p> 把收到的数据,串口打印出来。</p> <p> 6.<span>定义UDP发送函数</span></p> <p> void ICACHE_FLASH_ATTR user_udp_send(void)</p> <p> {</p> <p> char hwaddr[6];</p> <p> char DeviceBuffer[40]={0};</p> <p> wifi_get_macaddr(STATION_IF,hwaddr);</p> <p> os_sprintf(DeviceBuffer,"DEVICE MAC ADDRESS IS:"MACSTR"!!</p> <p> ESP8266 IOT!",MAC2STR(hwaddr));</p> <p> espconn_send(&user_udp_espconn,DeviceBuffer,os_strlen(DeviceBuffer));</p> <p> }</p> <p> 通过wifi_get_macaddr函数获取station模式下的MAC地址,并通过espconn_sent函数打印出来。</p> <p> 函数定义</p> <p> sint8 espconn_send(</p> <p> struct espconn *espconn,</p> <p> uint8 *psent,</p> <p> uint16 length</p> <p> )</p> <p> 参数:</p> <p> struct espconn *espconn : 对应网络传输的结构体</p> <p> uint8 *psent : 发送的数据</p> <p> uint16 length : 数据长度</p> <p> 程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里,需要借助串口助手和网络调试助手两个工具来查看效果。效果如下所示:</p> <p>  </p> <p> 打开网络调试助手:</p> <p>  </p> <p> 如图,依次设置相关的参数。</p> <p> 怎么知道显示的MAC地址对不对?打开<span>路由器</span>的管理界面,看当前连接设备的MAC地址:</p> <p>  </p> <p> 如此,说明发送端(路由下的8266)和接收端(路由下的PC)成功进行通信。</p> <p> 如果这时候网络调试助手发送数据:hello。</p> <p> 串口助手会收到如下信息:</p> <p>  </p> <p> 至此,UDP广播说完了。你们可以试一下让当前电脑连接8266,看网络调试助手里的参数如何修改。</p> 

讯享网
小讯
上一篇 2025-04-27 15:37
下一篇 2025-04-30 23:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/142510.html