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();
}
これはすべて で行われます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
最後に、次のマニフェスト権限があります。
<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" />
私は何を見落としていますか?応答データグラムを受信していないのはなぜですか?