Attualmente sto sviluppando un'applicazione Android utilizzando SDK> = 16 che dovrebbe essere in grado di rilevare diversi dispositivi Android (in seguito anche dispositivi iOS) in una rete locale utilizzando la radio WiFi.Rilevamento di dispositivi nella rete locale
La mia prima ipotesi è stata quella di utilizzare il multicast che risultava non funzionante sul mio Samsung Galaxy S2: i pacchetti vengono ricevuti solo se inviati dallo stesso dispositivo.
La mia seconda ipotesi è scansionare attivamente la rete utilizzando un intervallo di indirizzi IP limitato e attendere una risposta adeguata. Sfortunatamente, ciò implica che la rete utilizza DHCP per indirizzare gli indirizzi IP.
Nessuna delle soluzioni di cui sopra sembra essere la soluzione perfetta.
Il mio attuale soluzione per il mio prima ipotesi:
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;
}
}
risultati di questo codice in blocco sulla linea socket.receive (RECV); Se si specifica un timeout, ricevo un'eccezione di timeout.
Ma wifi diretto implica che si perde la connessione alla rete locale, non è vero? Voglio comunque poter accedere a Internet mentre scopro altri dispositivi. Anche a scopo di test, sarebbe bello poter anche scoprire una macchina locale che esegue un sistema operativo non Android. – anopheles
Quindi provare NSD. La scansione non è la strada da percorrere, per un amministratore di rete sembra un attacco. –
NSD non usa multicast sotto il cofano? – anopheles