networking - Android: SSDP stuck on MulticastSocket.receive() -
tl;dr: ssdp library not receiving datagram. wireshark shows expected(?) traffic.
i using android-dlna library support ssdp in android app. goal discover custom ssdp-enabled device, ip address, make restful api calls it. works on ios, having trouble receiving datagram on android.
using wireshark, can determine ssdp search goes out, , device returns status ok, loop never gets past receive()
method:
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 data " + new string(dp.getdata())); } } catch (ioexception e) { e.printstacktrace(); } { log.e("ssdp", "closing socket"); if (sock != null) sock.close(); }
this done in anasynctask
. see following printed 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 reports following related datagrams:
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
finally, have following manifest permissions:
<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" />
what overlooking? why aren't receiving response datagram?
i know old question, tripped me up, too, maybe else stumbles on question. if not acquire multicastlock
, android filters out multicast packets, update code acquire multicastlock
, release when done.
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 data " + new string(dp.getdata())); } } catch (ioexception e) { e.printstacktrace(); } { log.e("ssdp", "closing socket"); if (sock != null) sock.close(); if(lock.isheld()) { lock.release(); } }
the following permission required (already in op's manifest file) --
<uses-permission android:name="android.permission.access_wifi_state"/> <uses-permission android:name="android.permission.change_wifi_multicast_state"/>
Comments
Post a Comment