执行 UPNP 扫描不会返回 Philips Hue Bridge
Posted
技术标签:
【中文标题】执行 UPNP 扫描不会返回 Philips Hue Bridge【英文标题】:Performing a UPNP scan is not returning the Philips Hue Bridge 【发布时间】:2016-08-27 17:13:28 【问题描述】:我正在尝试实现我自己的 UpNP 扫描,它大部分都在工作,为了证明不是我,我有一个 Windows 程序,它允许您发送数据包并查看返回的响应。
我正在通过端口1900
向239.255.255.250
发送一个数据包,并且我正在发送以下数据:
M-SEARCH * HTTP/1.1
Host: 239.255.255.250:1900
Man: "ssdp:discover"
MX: 10
ST: ssdp:all
仅供参考,在我的 Java 代码 (android) 中,我有以下内容,但我得到的响应与数据包测试器应用程序相同:
try
byte[] sendData = new byte[1024];
//byte[] receiveData = new byte[1024];
byte[] receiveData;
String mSearch = "M-SEARCH * HTTP/1.1\r\nHost: 239.255.255.250:1900\r\nMan: \"ssdp:discover\"\r\nMX: 10\r\nST: ssdp:all\r\n\r\n";
sendData = mSearch.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("239.255.255.250"), 1900);
DatagramSocket clientSocket = new DatagramSocket();
clientSocket.send(sendPacket);
while (keepGoing)
receiveData = new byte[1024];
receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String response = new String(receivePacket.getData());
if (response == null || response.length() == 0)
keepGoing = false;
else
iupnpScan.updateText(response);
iupnpScan.complete(true);
return true;
catch (UnknownHostException ex)
Log.e("MainActivity", "Unknown Host Exception: " + ex.toString());
catch (SocketException ex)
Log.e("MainActivity", "Socket Exception: " + ex.toString());
catch (IOException ex)
Log.e("MainActivity", "IO Exception: " + ex.toString());
iupnpScan.complete(false);
return false;
我收到了一些设备返回,例如我的智能电视、路由器和 NAS,但飞利浦 Hue 桥接器从未在回复中返回。
飞利浦 Hue Bridge 是否以不同的方式实施 UpNP?我所能看到的只是他们现在发回的关于找到它所需的任何响应。
【问题讨论】:
您正在使用相当大的 MX 值。 10 秒对 UPnP 1.0 有效,但 v1.1 建议使用 [1..5] 范围内的值 - 您可以尝试将 MX 值减小到 5 秒,以排除飞利浦设备因格式错误而拒绝您的 MSEARCH。另请注意,某些 UPnP 设备会忽略 MSEARCH,而是依赖于发送频繁的多播 ALIVE 通知。您可以尝试收听多播通知以及单播 MSEARCH 响应,看看是否有帮助。 谢谢 我尝试将 MX 值更改为 5,但没有区别。有趣的是,我有一个来自 coherence.beebits.net/wiki/… 的 UPNP Inspector for Windows,但 Bridge 也没有出现 当我使用 upnp 时,我发现大多数本机包/库在响应发现请求方面非常不一致。如果您可以运行一个小测试,请尝试使用网络链接库或网络车库,如果您的嵌入式设备仍然没有响应发现请求,则您的设备可能存在问题。 也只是为了调试,我做的大部分时间是广泛使用wireshark来分析PC上upnp数据包的流向。 谢谢,我一直在使用wireshark 和多个不同的软件来发送数据包并进行特定的UPNP 搜索,它们的行为方式与我自己的代码相同。从 Wireshark 我可以看到我的飞利浦 Hue 桥接器不断响应 NOTIFY 数据包,但从未响应 UPNP 扫描。在我看来,Philips Hue Bridge 没有正确支持 UPNP 规范。 【参考方案1】:我也在为这种行为而苦苦挣扎。经过反复试验,我意识到 Hue Bridge 似乎不理解 ssdp:discover 值周围的"
。这些引号也没有出现在 IETF 草案中:https://datatracker.ietf.org/doc/html/draft-cai-ssdp-v1-03
以下请求对我来说是成功的:
M-SEARCH * HTTP/1.1
ST: ssdp:all
MX: 3
MAN: ssdp:discover
HOST: 239.255.255.250:1900
这是我得到的回复:
HTTP/1.1 200 OK
HOST: 239.255.255.250:1900
EXT:CACHE-CONTROL: max-age=100
LOCATION: http://192.168.xxx.xxx:80/description.xml
SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/1.16.0
hue-bridgeid: 001788FFFE29D301
ST: urn:schemas-upnp-org:device:basic:1
USN: uuid:2f402f80-da50-11e1-9b23-00178829d301
【讨论】:
【参考方案2】:虽然Philips site表示支持UPnP,但不知道是真是假。
我会尝试扫描整个网络并逐个 IP 测试 IP。是的,我知道,这不是标准所说的,但现实有时是疯狂的。
这个发现已经在外面实现了this way。
我过去编写了一个网络搜索程序(寻找 Raspberry PI),我可以使用的最佳方法是将 MAC 地址与我已知的地址开始匹配。幸运的是,Philips publish their MAC addresses range。
【讨论】:
以上是关于执行 UPNP 扫描不会返回 Philips Hue Bridge的主要内容,如果未能解决你的问题,请参考以下文章