3

TL;DR: SSDP ライブラリがデータグラムを受信して​​いません。Wireshark は予想される (?) トラフィックを示します。


Android アプリで SSDP をサポートするためにandroid-dlna ライブラリを使用しています。目標は、カスタムの 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();
}

これはすべて で行われますAsyncTasklogcatに次のように表示されます。

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

最後に、次のマニフェスト権限があります。

<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" />

私は何を見落としていますか?応答データグラムを受信して​​いないのはなぜですか?

4

1 に答える 1

1

これは古い質問であることは知っていますが、私もつまずいたので、この質問につまずいた他の誰かを助けるかもしれません. を取得しない場合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 のマニフェスト ファイルにあります) --

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
于 2015-09-26T03:11:34.493 に答える