【发布时间】: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 规范。
标签: java android upnp philips-hue