0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP8266的UDP广播详解

电子设计 来源:电子设计 作者:电子设计 2020-12-26 02:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

先来看看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,看网络调试助手里的参数如何修改。

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信协议
    +关注

    关注

    28

    文章

    1096

    浏览量

    42348
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1433

    浏览量

    83772
  • UDP
    UDP
    +关注

    关注

    0

    文章

    335

    浏览量

    35528
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    ESP32/ESP8266开发板单向多对一ESP-NOW无线通信

    本实验通过ESP-NOW无线通信协议实现多个ESP32/ESP 8266开发板向ESP32开发板发送数据。例如可以应用于从多个远程传感器上收
    的头像 发表于 03-30 10:14 187次阅读
    <b class='flag-5'>ESP</b>32/<b class='flag-5'>ESP8266</b>开发板单向多对一<b class='flag-5'>ESP</b>-NOW无线通信

    ESP32/ESP8266开发板单向一对多ESP-NOW无线通信

    通过ESP-NOW无线通信协议实现ESP32开发板向多个ESP32/ESP 8266开发板发送数据。
    的头像 发表于 03-13 09:23 287次阅读
    <b class='flag-5'>ESP</b>32/<b class='flag-5'>ESP8266</b>开发板单向一对多<b class='flag-5'>ESP</b>-NOW无线通信

    ESP8266系列】WT8266-S3模组规格书

    核心处理器ESP8266在较小尺寸封装中集成了业界领先的TensilicaL106超低功耗32位微型MCU,带有16位精简模式,主频支持80MHz和160MHz,支
    的头像 发表于 02-05 18:04 239次阅读
    【<b class='flag-5'>ESP8266</b>系列】WT<b class='flag-5'>8266</b>-S3模组规格书

    ESP8266系列】WT8266-S5模组规格书

    处理器ESP8266在较小尺寸封装中集成了业界领先的TensilicaL106超低功耗32位微型MCU,带有16位精简模式,主频支持80MHz和160MHz,支持
    的头像 发表于 02-05 18:03 364次阅读
    【<b class='flag-5'>ESP8266</b>系列】WT<b class='flag-5'>8266</b>-S5模组规格书

    ESP8266系列】WT8266-S6模组规格书

    处理器ESP8266在较小尺寸封装中集成了业界领先的TensilicaL106超低功耗32位微型MCU,带有16位精简模式,主频支持80MHz和160MHz,支持R
    的头像 发表于 02-05 18:03 379次阅读
    【<b class='flag-5'>ESP8266</b>系列】WT<b class='flag-5'>8266</b>-S6模组规格书

    ESP8266系列】WT8266-S1模组产品介绍

    WT8266-S1WiFi模块是由启明云端科技开发的、低功耗高性价比的嵌入式无线网络控制模块。可满足智能电网、楼宇自动化、安防、智能家居、远程医疗等物联网应用的需求。该模块核心处理器ESP8266
    的头像 发表于 01-29 18:22 682次阅读
    【<b class='flag-5'>ESP8266</b>系列】WT<b class='flag-5'>8266</b>-S1模组产品介绍

    ESP8266系列】WT8266-S6模组产品介绍

    处理器ESP8266在较小尺寸封装中集成了业界领先的TensilicaL106超低功耗32位微型MCU,带有16位精简模式,主频支持80MHz和160MHz,支持R
    的头像 发表于 01-29 18:22 455次阅读
    【<b class='flag-5'>ESP8266</b>系列】WT<b class='flag-5'>8266</b>-S6模组产品介绍

    无需安装!在浏览器里就能玩转ESP32/ESP8266,这个神器绝了!

    无需安装!在浏览器里就能玩转ESP32/ESP8266,这个神器绝了!【往期精选】十年嵌入式最深的痛,不是Bug,而是抓不到日志!vivo宣布原生支持HomeAssistant生态设备接入(含
    的头像 发表于 01-10 10:01 1392次阅读
    无需安装!在浏览器里就能玩转<b class='flag-5'>ESP</b>32/<b class='flag-5'>ESP8266</b>,这个神器绝了!

    晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) ESP8285/ESP8266芯片案例

    【应用】国产26MHz频率晶振应用于物联网WIFI物联网模块(串口转WiFi模块),Espressif(乐鑫)ESP8285/ESP8266芯片匹配测试OKESP8285其实是ESP8266的升级版
    的头像 发表于 11-21 15:37 4969次阅读
    晶科鑫 | 国产26MHz晶振匹配Espressif(乐鑫) <b class='flag-5'>ESP</b>8285/<b class='flag-5'>ESP8266</b>芯片案例

    ESP8266ESP32开发板常见的2种下载方式

    ESP32和ESP8266是性价比很高而且使用较为广泛的的Wi-Fi模块,在物联网(IoT)领域的DIY项目中可以首先考虑这2款产品。 两款芯片都属于32位处理器。ESP32是低功耗双核80MHz
    的头像 发表于 11-10 20:30 1393次阅读
    <b class='flag-5'>ESP8266</b>和<b class='flag-5'>ESP</b>32开发板常见的2种下载方式

    ESP8266ESP32开发板常见的2种下载方式

    原文链接:https://www.yourcee.com/newsinfo/2924258.html ESP32与ESP8266简介 ESP32和ESP8266是性价比很高而且使用较为
    发表于 10-24 18:04

    esp8266 udp server 端口监听错误的原因?

    1、使用esp8266 at组件+sal socket实现使用udpserver_sample.c demo代码 udp server,通信失败 2、跟踪代码发现 packegs 里面
    发表于 09-23 07:03

    请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗

    请问一下我想用ESP8685直接替换ESP8266而不用写程序,可以让ESP8685直接通过之前ESP8266的外挂的flash运行程序吗
    发表于 09-17 12:06

    STM32+esp8266连接机智云,上传温湿度数据并控制继电器开关(平台配置、代码生成、代码移植)

    本教程将详细介绍如何将STM32微控制器与ESP8266Wi-Fi模块连接到机智云平台,实现温湿度数据的上传与继电器的远程控制。通过此过程,您将学会如何配置机智云平台,烧录ESP8266固件,移植
    的头像 发表于 07-15 18:54 1441次阅读
    STM32+<b class='flag-5'>esp8266</b>连接机智云,上传温湿度数据并控制继电器开关(平台配置、代码生成、代码移植)

    ESP8266烧录与机智云一键配网教程

    ESP8266模块因其低成本和高性能,广泛应用于智能家居和工业自动化等领域。机智云平台提供了一键配网功能,简化了设备的联网过程。本教程将详细介绍如何使用ESP8266进行烧录,并通过机智云实现一键配
    的头像 发表于 05-24 11:04 2408次阅读
    <b class='flag-5'>ESP8266</b>烧录与机智云一键配网教程