Ich entwickle gerade eine Android-App mit SDK> = 16, die in der Lage sein soll, verschiedene Android-Geräte (später auch iOS-Geräte) in einem lokalen Netzwerk mit dem WiFi-Radio zu entdecken.Geräteerkennung im lokalen Netzwerk
Meine erste Vermutung war Multicast zu verwenden, die auf meinem Samsung Galaxy S2 nicht funktionierte: Pakete werden nur empfangen, wenn sie vom selben Gerät gesendet werden.
Meine zweite Vermutung ist das aktive Scannen des Netzwerks mit einem begrenzten IP-Adressbereich und warten auf eine ordnungsgemäße Antwort. Leider bedeutet dies, dass das Netzwerk DHCP verwendet, um die IP-Adressen zu adressieren.
Keine der oben genannten Lösungen scheint die perfekte Lösung zu sein.
Meine aktuelle Lösung für meine erste Vermutung:
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;
}
}
Dieser Code führt zu einer Blockierung der Linie socket.receive (recv); Wenn ich eine Zeitüberschreitung festlege, erhalte ich eine Zeitüberschreitungsausnahme.
Aber WiFi direkt bedeutet, dass Sie die Verbindung zu Ihrem lokalen Netzwerk verlieren, nicht wahr? Ich möchte immer noch auf das Internet zugreifen können, während ich andere Geräte entdecke. Auch zu Testzwecken wäre es schön, in der Lage zu sein, auch eine lokale Maschine zu entdecken, auf der ein nicht-androides Betriebssystem läuft. – anopheles
Dann versuchen Sie NSD. Scannen ist nicht der richtige Weg, für einen Netzwerkadministrator sieht es wie ein Angriff aus. –
Verwendet NSD Multicast nicht unter der Haube? – anopheles