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

Popular posts from this blog

apache - Remove .php and add trailing slash in url using htaccess not loading css -

javascript - jQuery show full size image on click -