C++ 从openWRT路由器发现Philips色调的upnp

C++ 从openWRT路由器发现Philips色调的upnp,c++,openwrt,upnp,philips-hue,C++,Openwrt,Upnp,Philips Hue,当我从我的电脑发送以下数据包时,我收到了hue的回复 sprintf(wrbuf,"%s","M-SEARCH* HTTP/1.0\r\n HOST: 239.255.255.250:1900\r\n MAN: \"ssdp:discover\"\r\n MX: 4\r\n ST: libhue:idl\r\n\r\n"); sendto(sd,&wrbuf,sizeof(wrbuf),0,(struct sockaddr *)&serv,(socklen_t)len); 答

当我从我的电脑发送以下数据包时,我收到了hue的回复

sprintf(wrbuf,"%s","M-SEARCH* HTTP/1.0\r\n HOST: 239.255.255.250:1900\r\n MAN: \"ssdp:discover\"\r\n MX: 4\r\n ST: libhue:idl\r\n\r\n");

sendto(sd,&wrbuf,sizeof(wrbuf),0,(struct sockaddr *)&serv,(socklen_t)len);
答复如下

recived: HTTP/1.1 200 OK
CACHE-CONTROL: max-age=100
EXT:
LOCATION: "ipofhue:80/description.xml"
SERVER: FreeRTOS/6.0.5, UPnP/1.0, IpBridge/0.1
ST: upnp:rootdevice
USN: uuid:2f402f80-da50-11e1-9b23-0017880a6643::upnp:rootdevice
虽然如果从我的openWRT路由器发送相同的数据包,我不会从hue得到任何响应

我的PC IP是10.10.10.130,hue IP是10.10.10.109,我的路由器br lan IP是10.10.10.254。 我不认为我需要从我的路由器运行miniupnpd,因为如果我运行它,它开始从路由器响应,我只需要从运行在hue hub上的upnp服务器得到回复,而我没有得到回复


openwrt工具链不允许M-SEARCH数据包到达wan端口。它只是忽略该数据包。内核日志说IGMP消息来自我自己。忽略。Feb 4 06:18:55 user.info sysinit:组239.255.255.250的源地址172.22.xx.xx不在上游VIF的任何有效网络中

在我看来,数据包是通过互联网而不是本地局域网传输的。我认为在调用sendto()之前,需要专门绑定到BR-LAN IP。例如:

int sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
struct sockaddr_in sin = {};
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr("10.10.10.254");
sin.sin_port = 0;
bind(sd, (struct sockaddr *)&sin, sizeof(sin));

设备是否确实发送数据包?如果没有发送数据包,则顺理成章的是色调没有响应,您会看到现在看到的行为。是的,设备确实在发送数据包,发送到返回成功。@MSaltershave您在网络上验证了吗?当事情表现不正常时,你应该比平时更加多疑。另外,当OpenWRT发送数据包时,网络上的数据包看起来有什么不同吗?@MSalters是正确的:启动wireshark,确保你认为正在发生的事情是真的。此外,M-SEARCH在我看来似乎格式不正确:“M-SEARCH”和“*”之间应该有一个空格,并且行的开头不应该有空格。您使用的搜索目标对UPnP无效。我在Wireshark上找不到包含M-search命令的数据包,您建议的更改已实现@jku