您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息
三六零分类信息网 > 佳木斯分类信息网,免费分类信息发布

ESP8266的UDP广播

2019/9/20 16:38:27发布162次查看

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

佳木斯分类信息网,免费分类信息发布

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录