我正在使用非OS SDK v2.0 for esp8266。
我加入了一个多播组。
然后我收到一条消息(发送给多播)。
我想回复发件人,但在struct espconn
中,udp.remote_ip
是多播群组的地址,而不是发件人。
如何获取发件人的IP地址?
编辑:
Receive函数有一个void* arg
参数,该参数已转换为struct espconn
。
答案 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;
}