gpt4 book ai didi

c++ - upnp 从 openWRT 路由器发现 Philips hue

转载 作者:太空宇宙 更新时间:2023-11-04 13:46:11 28 4
gpt4 key购买 nike

当我从我的 PC 发送以下数据包时,我收到了 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 收到任何响应。

我的电脑 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 消息来 self 自己。无视。 Feb 4 06:18:55 user.info sysinit:组 239.255.255.250 的源地址 172.22.xx.xx 不在上游 VIF 的任何有效网络中。 –

最佳答案

在我看来,数据包是通过 Internet 而不是本地 LAN 传输的。我认为您需要在调用 sendto() 之前专门绑定(bind)到 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));

关于c++ - upnp 从 openWRT 路由器发现 Philips hue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25849188/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com