2014-04-07 13 views
3

TL : DR : SSDP library 데이터 그램을 수신하지 않습니다. Wireshark는 예상 트래픽 (?)을 표시합니다.Android : SSDP가 MulticastSocket.receive()에 붙어 있습니다.


나는 android-dlna library을 사용하여 Android 앱에서 SSDP를 지원합니다. 목표는 맞춤 SSDP 지원 장치를 찾고 IP 주소를 얻은 다음 RESTful API 호출을 수행하는 것입니다. 이것은 iOS에서 잘 작동하지만 Android에서 데이터 그램을받는 데 문제가 있습니다. 와이어 샤크를 사용

, 나는 SSDP 검색이 꺼지고 것을 결정하고, 상태 확인을 사용하여 장치를 반환하지만,이 루프는 결코 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.

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 

마지막으로, 내가 가지고있는 다음과 같은 매니페스트 권한 : I 오전 무엇

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

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... 

와이어 샤크는 다음과 같은 관련 데이터 그램을보고 : 나는 로그 캣 에 인쇄 된 다음 참조 내려다 보는가? 왜 응답 데이터 그램을받지 못합니까?

+0

유일한 차이점은 내 코드 사이에서 볼 수 있으며, 당신은 (대신 DatagramPacket의 DP = sock.receive'입니다 -

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의 매니페스트 파일에) 필요);'나는 바이트 배열을 버퍼로 사용하고'DatagramPacket dp = new DatagramPacket (buf, buf.length); '를 사용한다. 바이트 배열은 단순히'byte [] buf = new byte [1024];'입니다. 그런 다음'mSSDPSocket.receive (dp);를 호출합니다. 여기서'mSSDPSocket'은 제 MulticastSocket입니다. – Squonk

답변

1

나는 이것이 오래된 질문이라는 것을 알고있다. 그러나 그것은 나 또한 위로했다. 그래서 아마도 이것은이 질문에 비틀 거리는 다른 누군가를 도울 것이다. MulticastLock을 얻지 못하면 Android가 멀티 캐스트 패킷을 걸러 내기 때문에 코드를 업데이트하여 MulticastLock을 획득하고 완료되면 해제하십시오.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>