Obecnie tworzę aplikację dla Androida za pomocą SDK> = 16, która powinna być w stanie wykryć różne urządzenia z Androidem (później także urządzenia iOS) w sieci lokalnej za pomocą radia WiFi.Wykrywanie urządzeń w sieci lokalnej
Moim pierwszym domysłem było użycie multicastu, który okazał się niedziałający na moim Samsung Galaxy S2: pakiety są odbierane tylko wtedy, gdy są wysyłane z tego samego urządzenia.
Moim drugim domysłem jest aktywne skanowanie sieci przy użyciu ograniczonego zakresu adresów IP i oczekiwanie na właściwą odpowiedź. Niestety, oznacza to, że sieć wykorzystuje DHCP do adresowania adresów IP.
Żadne z powyższych rozwiązań nie wydaje się być idealnym rozwiązaniem.
Moje obecne rozwiązanie dla mojego pierwszego odgadnięcia:
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;
}
}
Wyniki tego kodu w blokowaniu na socket.receive linii (recv); Jeśli określę limit czasu, otrzymam wyjątek limitu czasu.
Ale wifi direct oznacza utratę połączenia z siecią lokalną, czyż nie? Nadal chcę mieć dostęp do Internetu podczas odkrywania innych urządzeń. Również w celach testowych dobrze byłoby móc odkryć lokalną maszynę z systemem innym niż Android. – anopheles
Następnie wypróbuj NSD. Skanowanie nie jest drogą, administrator sieci wygląda jak atak. –
Czy NSD nie używa multicastu pod maską? – anopheles