gpt4 book ai didi

Android:SSDP 卡在 MulticastSocket.receive() 上

转载 作者:太空狗 更新时间:2023-10-29 14:15:07 26 4
gpt4 key购买 nike

长话短说:SSDP library没有收到数据报。 Wireshark 显示预期的(?)流量。


我正在使用 android-dlna library在 Android 应用程序中支持 SSDP。目标是发现支持 SSDP 的自定义设备,获取其 IP 地址,然后对其进行 RESTful API 调用。这在 iOS 上运行良好,但我在 Android 上接收数据报时遇到一些问题。

使用 Wireshark,我可以确定 SSDP 搜索结束,设备返回状态为 OK,但此循环永远不会通过 receive() 方法:

SSDPSearchMsg search = new SSDPSearchMsg(SSDP.ST_ContentDirectory);
Log.e("SSDP", search.toString());

SSDPSocket sock = null;

try {
sock = new SSDPSocket();
sock.send(search.toString());

while (true) {
Log.e("SSDP", "Receive...");//only called once (stuck here)
DatagramPacket dp = sock.receive();
Log.e("SSDP", "Datagram Received with data " + new String(dp.getData()));
}
} catch (IOException e) {
e.printStackTrace();
}
finally {
Log.e("SSDP", "Closing Socket");
if (sock != null)
sock.close();
}

这一切都是在AsyncTask 中完成的。我看到以下打印到 logcat:

SSDP    M-SEARCH * HTTP/1.1
SSDP Host:239.255.255.250:1900
SSDP Man:"ssdp:discover"
SSDP ST:urn:schemas-upnp-org:service:ContentDirectory:1
SSDP MX:3
SSDP
SSDP Receive...

Wireshark 报告以下相关数据报:

    Source      Destination    Protocol    Length    Info
---------------------------------------------------------------------------
192.168.1.7 239.255.255.250 SSDP 175 M-SEARCH * HTTP/1.1
192.168.1.1 192.168.1.7 SSDP 356 HTTP/1.1 200 OK

最后,我有以下 list 权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />

我忽略了什么?为什么我没有收到响应数据报?

最佳答案

我知道这是一个老问题,但它也让我绊倒了,所以也许这会帮助其他偶然发现这个问题的人。如果您没有获得 MulticastLock , Android 过滤掉组播数据包,因此更新代码以获取 MulticastLock 并在完成后释放它。

final WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock = wifi.createMulticastLock("ssdp");
try {
lock.acquire();
sock = new SSDPSocket();
sock.send(search.toString());

while (true) {
Log.e("SSDP", "Receive...");//only called once (stuck here)
DatagramPacket dp = sock.receive();
Log.e("SSDP", "Datagram Received with data " + new String(dp.getData()));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
Log.e("SSDP", "Closing Socket");
if (sock != null)
sock.close();
if(lock.isHeld()) {
lock.release();
}
}

需要以下权限(已在 OP 的 list 文件中)--

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>

关于Android:SSDP 卡在 MulticastSocket.receive() 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22920420/

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