현재 SDK> = 16을 사용하는 Android 앱을 개발 중입니다. Wi-Fi를 사용하는 LAN에서 다른 Android 기기 (이후 iOS 기기)를 검색 할 수 있어야합니다.로컬 네트워크에서 기기 검색
내 첫 번째 추측은 삼성 Galaxy S2에서 작동하지 않는 멀티 캐스트를 사용하는 것입니다. 패킷은 동일한 기기에서 전송되었을 때만 수신됩니다.
나의 두 번째 추측은 제한된 IP 주소 범위를 사용하여 네트워크를 적극적으로 스캔하고 적절한 응답을 기다리는 것입니다. 불행히도 이것은 네트워크가 DHCP를 사용하여 IP 주소를 처리한다는 것을 의미합니다.
위의 솔루션 중 어느 것도 완벽한 솔루션으로 보이지 않습니다. 내 첫번째 추측에 대한
내 현재 솔루션 : 라인 socket.receive (RECV)에 차단하는
public class MulticastReceiver extends AsyncTask<Activity, Integer, String> {
private static final String host = "224.1.1.1";
private static final int port = 5007;
private static final String TAG = "MulticastReceiver";
protected String doInBackground(Activity... activities) {
WifiManager wm = (WifiManager)activities[0].getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.acquire();
String message = "Nothing";
if (multicastLock.isHeld()) {
Log.i(TAG, "held multicast lock");
}
try {
InetAddress addr = InetAddress.getByName(host);
MulticastSocket socket = new MulticastSocket(port);
socket.setTimeToLive(4);
socket.setReuseAddress(true);
socket.joinGroup(addr);
byte[] buf = new byte[5];
DatagramPacket recv = new DatagramPacket(buf, buf.length, addr, port);
socket.receive(recv);
message = new String(recv.getData());
socket.leaveGroup(addr);
socket.close();
} catch (Exception e) {
message = "ERROR " + e.toString();
}
multicastLock.release();
return message;
}
}
이 코드의 결과; 타임 아웃을 지정하면 타임 아웃 예외가 발생합니다.
하지만 Wi-Fi를 사용하면 로컬 네트워크 연결이 끊어지는 것을 직접적으로 알 수 있습니다. 그렇습니까? 나는 여전히 다른 장치를 발견하는 동안 인터넷에 액세스 할 수 있기를 원합니다. 또한 테스트 목적으로 비 안드로이드 OS를 실행하는 로컬 시스템을 발견 할 수 있으면 좋을 것입니다. – anopheles
그런 다음 NSD를 시도하십시오. 검사는 가야 할 길은 아니지만 네트워크 관리자에게는 공격과 같습니다. –
NSD에서 멀티 캐스트를 사용하지 않습니까? – anopheles