当前位置:   article > 正文

ESP8266_11 ESP8266的UDP广播_esp8266 udp广播

esp8266 udp广播

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

         上一节说的是ESP8266的station模式,但这个模式讲的比较枯燥,既没有实现什么酷炫的应用,也没有引申出什么好玩的功能。别急,我想想…

         这一节先看看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、包含头文件

  1. #include "espconn.h"
  2. #include "mem.h"

       主要是"espconn.h",涉及到UDP通讯所需的各种数据结构。

       2、设置工作模式及相关参数

  1. wifi_set_opmode(0x03);          // station+ soft-ap模式
  2. struct softap_config config;    //定义AP参数结构体,
  3. wifi_softap_get_config(&config);   //获取当前AP模式的参数
  4. os_memcpy(config.ssid,"ESP8266",strlen("ESP8266"));         //修改AP名称
  5. os_memcpy(config.password,"123456789",strlen("123456789"));      //修改AP密码
  6. config.ssid_len=strlen("ESP8266");         //修改 AP名称的长度
  7. wifi_softap_set_config(&config);             //使修改后的参数生效

       此时,如果把程序烧录进去,可以看到当前环境下有一个ESP8266的wifi,输入密码“123456789”可以连接。

       3、扫描并连接当前环境下的wifi

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

       4、连接成功后,设置UDP相关参数

       跟上一节相比,这里要对Wifi_conned();进行修改。

       首先头文件中定义一个结构体形式的ESPCONN描述符:

 struct espconn user_udp_espconn;

       关于espconn,SDK中给出的定义如下:

  1. /** A espconn descriptor */
  2. struct espconn {
  3.     /** type of the espconn (TCP, UDP) */
  4.     enum espconn_type type;
  5.     /** current state of the espconn */
  6.     enum espconn_state state;
  7.     union {
  8.         esp_tcp *tcp;
  9.         esp_udp *udp;
  10.     } proto;
  11.     /** A callback function that is informed about events for this espconn */
  12.     espconn_recv_callback recv_callback;
  13.     espconn_sent_callback sent_callback;
  14.     uint8 link_cnt;
  15.     void *reverse;
  16. };

         可以看到,无论是TCP通讯还是UDP通讯,都要用到这个结构体,同时,要在结构体内设置相应的发送、接收回调函数。

         接下来就是一个UDP参数的设置过程:

         wifi_set_broadcast_if(STATIONAP_MODE);

         设置UDP广播包的发送接口,默认soft-ap。这里选择的是station和soft-ap。

         参数:1、station   2、soft-ap        3、station和soft-ap

  1.          user_udp_espconn.type=ESPCONN_UDP;      //设置为UDP通信
  2. //开辟UDP参数需要的空间
  3.          user_udp_espconn.proto.udp=(esp_udp *)os_zalloc(sizeof(esp_udp));
  4.          //设置本地端口和远程端口
  5.          user_udp_espconn.proto.udp->local_port=2525;
  6.          user_udp_espconn.proto.udp->remote_port=1024;
  7.          //设置远程IP
  8.          const char udp_remote_ip[4]={255,255,255,255};
  9.          os_memcpy(user_udp_espconn.proto.udp->remote_ip,udp_remote_ip,4);
  10.          //设置发送完成和接收完成的回调函数
  11.          espconn_regist_recvcb(&user_udp_espconn,user_udp_recv_cb);
  12.          espconn_regist_sentcb(&user_udp_espconn,user_udp_sent_cb);
  13.          //使UDP参数生效
  14.          espconn_create(&user_udp_espconn);
  15.          //UDP发送函数
  16.          user_udp_send();

 

         5、定义发送完成和接收完成的回调函数

  1. void ICACHE_FLASH_ATTR user_udp_sent_cb(void *arg)
  2. {
  3.          os_printf("SEND SUCCESS!\r\n");
  4.          os_timer_disarm(&test_timer);
  5.          os_timer_setfn(&test_timer,(os_timer_func_t *)user_udp_send,0);
  6.          os_timer_arm(&test_timer,1000,0);
  7. }

         串口打印:SEND SUCCESS!   然后延时1秒,调用UDP发送函数。

         为什么串口不发送中文?SDK3.0的版本,串口对中文的支持好像不太好,有兴趣的自己试一下。

 

  1. void ICACHE_FLASH_ATTR user_udp_recv_cb(void *arg,
  2. char *pdata,
  3. unsigned short len)
  4. {
  5.          os_printf("udp have received data:%s\r\n",pdata);
  6. }

         把收到的数据,串口打印出来。

 

         6、定义UDP发送函数

  1. void ICACHE_FLASH_ATTR user_udp_send(void)
  2. {
  3.          char hwaddr[6];
  4.          char DeviceBuffer[40]={0};
  5.          wifi_get_macaddr(STATION_IF,hwaddr);
  6.          os_sprintf(DeviceBuffer,"DEVICE MAC ADDRESS IS:"MACSTR"!!\r\n
  7.          ESP8266 IOT!\r\n",MAC2STR(hwaddr));
  8.          espconn_send(&user_udp_espconn,DeviceBuffer,os_strlen(DeviceBuffer));
  9. }

         通过wifi_get_macaddr函数获取station模式下的MAC地址,并通过espconn_sent函数打印出来。

         函数定义

  1. sint8 espconn_send(
  2. struct espconn *espconn,
  3. uint8 *psent,
  4. uint16 length
  5. )

         参数:

struct espconn *espconn : 对应网络传输的结构体

uint8 *psent : 发送的数据

uint16 length : 数据长度

 

       程序修改完成,保存、清理、编译、下载一条龙,然后重新上电。这里,需要借助串口助手和网络调试助手两个工具来查看效果。效果如下所示:

         打开网络调试助手:

         如图,依次设置相关的参数。

         怎么知道显示的MAC地址对不对?打开路由器的管理界面,看当前连接设备的MAC地址:

 

         如此,说明发送端(路由下的8266)和接收端(路由下的PC)成功进行通信。

         如果这时候网络调试助手发送数据:hello。

         串口助手会收到如下信息:

         至此,UDP广播说完了。你们可以试一下让当前电脑连接8266,看网络调试助手里的参数如何修改。

 

单片机爱好者

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/391428
推荐阅读
相关标签
  

闽ICP备14008679号