2017-03-13 34 views
1

我正在研究esp8266,nonos sdk v 2.0.0_16_08_10,原生c。 我正在通過wireshark監控網絡。在esp8266上發送多播?

我想通過udp發送多播消息。

接收udp組播工作。 發送udp單播作品。 發送udp多播不起作用。

在我的udp發送回調函數中,表示發送了消息,但是我不能通過wireshark捕獲它。

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

加入組播組:

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信道:

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:端口:

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); 
} 
+2

請參閱[如何創建最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve) –

+0

對不起,我認爲這個信息足夠了。將很快添加代碼。 –

+0

@InvaderZim,如果有必要的環境感興趣的人可以簡單地複製粘貼並立即運行你的代碼,看看你看到了什麼,它會有所幫助。 – sigjuice

回答

1

經過在互聯網上的大量搜索後,我發現soft-ap會導致多播發送問題。

我的代碼從閃存中讀取配置,所以我硬編碼了ap配置爲NULL,並且多播現在正在發送而沒有問題。

,應避免以下功能:

wifi_set_opmode(STATIONAP_MODE) 
wifi_set_opmode(SOFTAP_MODE) 
wifi_softap_foo 

我還發現,軟AP DHCP專門造成這個問題,有時當它沒有打開我可以把組播報文,但有時我不能。

我發現的信息是針對Arduino的,但似乎也適用於本機c。

相關問題