11

我正在尝试实现我自己的 UpNP 扫描,它大部分都在工作,并且为了证明不是我,我有一个 Windows 程序,它允许您发送数据包并查看返回的响应。

我正在向239.255.255.250端口发送数据包,1900并且正在发送以下数据:

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?我所能看到的只是他们现在发回的关于找到它所需的任何响应。

4

2 回答 2

2

虽然飞利浦网站指出它支持 UPnP,但我不知道这是否属实。

我会尝试扫描整个网络并按 IP 测试 IP。是的,我知道,这不是标准所说的,但现实有时是疯狂的。

这个发现已经以这种方式实现了。

我在过去编写了网络搜索(寻找 Raspberry PI),我可以使用的最佳方法是将 MAC 地址与我已知的地址开始匹配。幸运的是,飞利浦公布了他们的 MAC 地址范围

于 2016-05-11T14:35:54.153 回答
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
于 2016-12-22T19:52:31.980 回答