首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android: SSDP卡在MulticastSocket.receive()上

Android: SSDP卡在MulticastSocket.receive()上
EN

Stack Overflow用户
提问于 2014-04-07 18:38:37
回答 1查看 1.6K关注 0票数 3

SSDP库没有接收数据报。Wireshark节目预计(?)交通。

我正在使用android库来支持安卓应用程序中的SSDP。目标是发现一个自定义的支持SSDP的设备,获取它的IP地址,然后对它进行RESTful API调用。这在iOS上运行得很好,但我在接收安卓上的数据报时遇到了一些困难。

使用Wireshark,我可以确定SSDP搜索退出,设备返回状态OK,但是这个循环从未通过receive()方法:

代码语言:javascript
复制
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

代码语言:javascript
复制
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报告了以下相关数据报:

代码语言:javascript
复制
    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

最后,我拥有以下Manifest权限:

代码语言:javascript
复制
<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" />

我在看什么?为什么我没有收到回复数据报?

EN

回答 1

Stack Overflow用户

发布于 2015-09-26 03:11:34

我知道这是个老掉牙的问题,但它也把我绊倒了,所以也许这会帮助其他人在这个问题上绊倒。如果您没有获得一个MulticastLock,Android会过滤多播数据包,所以更新代码以获取MulticastLock,并在完成时释放它。

代码语言:javascript
复制
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的清单文件中) --

代码语言:javascript
复制
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22920420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档