执行 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 程序,它允许您发送数据包并查看返回的响应。

我正在通过端口1900239.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的主要内容,如果未能解决你的问题,请参考以下文章

DynamoDb:扫描查询不会返回所有数据

请问使用了小A家庭版后如何解决迅雷DHT和UPnP未启动问题拜托了各位 谢谢

获取 Cling 中的所有 DLNA 根存储目录?

图像轮廓之形状匹配

SAP HUM 拆包之后的HU号码依旧存在

在 Python 中通过 UPnP 转发端口