首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在esp8266上发送多播?

在esp8266上发送多播?
EN

Stack Overflow用户
提问于 2017-03-13 18:37:00
回答 1查看 1.9K关注 0票数 2

我正在开发esp8266,nonos sdk v 2.0.0_16_08_10,原生c。我正在通过wireshark监控网络。

我正在尝试通过udp发送多播消息。

接收udp多播是可行的。发送udp单播是可行的。发送udp多播不起作用。

在我的udp发送回调函数中,它指示消息已发送,但我无法通过wireshark捕获它。

组播IP地址: 224.0.1.187组播端口: 5683

加入组播组:

代码语言:javascript
复制
uint32_t mip = wifi_get_ip();
if(mip == 0){
    os_printf("ERROR MULTICAST JOIN mip==0\n");
    return;
}

ip_addr_t local, remote;
remote.addr = ocf_mgroup.ip.full;
local.addr = mip;

os_printf("multicast result = %d\n", espconn_igmp_join(&local, &remote));

打开UDP通道:

代码语言:javascript
复制
uint8_t ICACHE_FLASH_ATTR udp_open(uint8_t ch_no, uint8_t ch_id, uint32_t src_addr, uint16_t src_port, uint32_t dst_addr, uint16_t dst_port){
    //ALLOC MEM
    udp_conn[ch_no] = (struct espconn*) os_malloc(sizeof(struct espconn));
    udp_info[ch_no] = (esp_udp*) os_malloc(sizeof(esp_udp));

    //CHANNEL
    //ports
    udp_info[ch_no]->remote_port = dst_port;
    udp_info[ch_no]->local_port = src_port;
    //ips
    udp_info[ch_no]->remote_ip[0] = (dst_addr) & 0xff;
    udp_info[ch_no]->remote_ip[1] = (dst_addr >> 8) & 0xff;
    udp_info[ch_no]->remote_ip[2] = (dst_addr >> 16) & 0xff;
    udp_info[ch_no]->remote_ip[3] = (dst_addr >> 24) & 0xff;
    udp_info[ch_no]->local_ip[0] = (src_addr) & 0xff;
    udp_info[ch_no]->local_ip[1] = (src_addr >> 8) & 0xff;
    udp_info[ch_no]->local_ip[2] = (src_addr >> 16) & 0xff;
    udp_info[ch_no]->local_ip[3] = (src_addr >> 24) & 0xff;

    //connection
    udp_conn[ch_no]->type = ESPCONN_UDP;
    udp_conn[ch_no]->state = ESPCONN_NONE;
    udp_conn[ch_no]->proto.udp = udp_info[ch_no];
    udp_conn[ch_no]->link_cnt = ch_id;

    //HANDLERS
    espconn_regist_recvcb(udp_conn[ch_no], udp_receive_handler);
    //on send successfull
    espconn_regist_sentcb(udp_conn[ch_no], udp_send_handler);

    //CRAETE
    return espconn_create(udp_conn[ch_no]);
}

正在将消息发送到ip:端口:

代码语言:javascript
复制
uint8_t ICACHE_FLASH_ATTR udp_send_cfg(uint8_t ch_no, uint8_t* data, uint16_t len, uint32_t dst_ip, uint16_t dst_port){
    udp_conn[ch_no]->proto.udp->remote_port = dst_port;

    udp_conn[ch_no]->proto.udp->remote_ip[0] = dst_ip & 0xFF;
    udp_conn[ch_no]->proto.udp->remote_ip[1] = (dst_ip >> 8) & 0xFF;
    udp_conn[ch_no]->proto.udp->remote_ip[2] = (dst_ip >> 16) & 0xFF;
    udp_conn[ch_no]->proto.udp->remote_ip[3] = (dst_ip >> 24) & 0xFF;

    return espconn_sent(udp_conn[ch_no], data, len);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 22:36:23

经过在互联网上的广泛搜索,我发现软ap导致了组播发送问题。

我的代码从闪存读取配置,因此我硬编码ap配置为空,并且多播现在可以正常发送。

因此,请避免使用以下函数:

代码语言:javascript
复制
wifi_set_opmode(STATIONAP_MODE)
wifi_set_opmode(SOFTAP_MODE)
wifi_softap_foo

我还发现软ap dhcp特别导致了这个问题,有时我可以在它没有打开的时候发送多播消息,但有时我不能。

我找到的信息是针对Arduino的,但似乎也适用于原生c语言。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42761524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档