从openWRT路由器发现飞利浦色调的upnp

upnp discovery of Philips hue from openWRT router

本文关键字:色调 upnp 飞利浦 发现 openWRT 路由器      更新时间:2023-10-16

当我从电脑发送以下数据包时,我收到了来自hue的响应。

sprintf(wrbuf,"%s","M-SEARCH* HTTP/1.0rn HOST: 239.255.255.250:1900rn MAN: "ssdp:discover"rn MX: 4rn ST: libhue:idlrnrn");
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,色调IP是10.10.10109&我的路由器br lan IP是10.10.10.254。我不认为我需要从路由器运行miniupnpd,因为如果我运行它,它会从路由器开始响应,我只需要从运行在hue hub上的upnp服务器得到回复,而我没有得到回复。

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

在我看来,数据包是通过Internet而不是本地LAN发送的。我认为在调用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));