在esp8266中从多播消息中查找源地址?

时间:2017-01-24 13:41:19

标签: ip multicast esp8266

我正在使用非OS SDK v2.0 for esp8266。

我加入了一个多播组。

然后我收到一条消息(发送给多播)。

我想回复发件人,但在struct espconn中,udp.remote_ip是多播群组的地址,而不是发件人。

如何获取发件人的IP地址?

编辑: Receive函数有一个void* arg参数,该参数已转换为struct espconn

1 个答案:

答案 0 :(得分:1)

旧方法不再工作,但我找到了一种方法来查找远程ip和端口。

新代码:

    struct espconn* udp_ch;
    remot_info  *premot =   NULL;
    udp_ch = arg;

    if  (espconn_get_connection_info(udp_ch,&premot,0) == ESPCONN_OK){
        os_printf("%d.%d.%d.%d:%d\n", premot->remote_ip[0], premot->remote_ip[1], premot->remote_ip[2], premot->remote_ip[3], premot->remote_port);
    }
    else{
        os_printf("Get info fail\n");
    }

这正是我之前搜索的内容。就目前而言,据我所知,它运作良好。

OLD:

我找到了找到ip的方法,但我认为不应该这样做。直到我发现更好,我会用它。

我做的第一件事是从void* arg打印前256个十六进制值。 我注意到我的地址是在一堆零之前发生的。

在单播时,0的起始位置是128。

我目前正在使用此功能:

uint32_t udp_get_addr(void* arg){
    uint32_t adr = 0;

    uint16_t pos;
    uint8_t* data = (uint8_t*) arg;

    //unicast?
    for(pos = 128; pos<144; pos++){
        if(data[pos] != 0){
            adr = 1;
            break;
        }
    }

    //multicast
    if(adr == 1)
        pos = 172;
    else
        pos = 124;

    adr = data[pos]<<24 | data[pos+1]<<16 | data[pos+2]<<8 | data[pos+3];

    return adr;
} 

我知道这种方法很糟糕,而且有很多事情可以改善,但是现在,这样做了。

EDIT2:

我也需要源端口。它位于地址前4个字节。我目前使用的新功能:

#define SRC_ADDR_U 120
#define SRC_ADDR_M 168 
uint32_t udp_src_addr(void* arg, uint8_t isMulticast){
    uint32_t res;
    uint8_t* tmp = (uint8_t*) arg;
    uint16_t pos;
    if(isMulticast) pos = SRC_ADDR_M+4;
    else pos = SRC_ADDR_U+4;

    res = (tmp[pos+3] << 24) | (tmp[pos+2] << 16) | (tmp[pos+1] << 8) | tmp[pos];
    return res;
}
uint16_t udp_src_port(void* arg, uint8_t isMulticast){
    uint32_t res;
    uint8_t* tmp = (uint8_t*) arg;
    uint16_t pos;
    if(isMulticast) pos = SRC_ADDR_M;
    else pos = SRC_ADDR_U;

    res = (tmp[pos+1] << 8) | tmp[pos];
    return res;
}