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...
와이어 샤크는 다음과 같은 관련 데이터 그램을보고 : 나는 로그 캣 에 인쇄 된 다음 참조 내려다 보는가? 왜 응답 데이터 그램을받지 못합니까?
유일한 차이점은 내 코드 사이에서 볼 수 있으며, 당신은 (대신 DatagramPacket의 DP = sock.receive'입니다 -
다음 권한은 (이미 OP의 매니페스트 파일에) 필요);'나는 바이트 배열을 버퍼로 사용하고'DatagramPacket dp = new DatagramPacket (buf, buf.length); '를 사용한다. 바이트 배열은 단순히'byte [] buf = new byte [1024];'입니다. 그런 다음'mSSDPSocket.receive (dp);를 호출합니다. 여기서'mSSDPSocket'은 제 MulticastSocket입니다. – Squonk