2013-03-30 17 views
6

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.

risposta

2

Check out http://developer.android.com/training/connect-devices-wirelessly/index.html Si parla di due modi di trovare servizi locali - NSD e wifi diretti.

+0

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

+0

Quindi provare NSD. La scansione non è la strada da percorrere, per un amministratore di rete sembra un attacco. –

+1

NSD non usa multicast sotto il cofano? – anopheles

2

leggi la mia risposta in domanda molto simile Android Network Discovery Service (ish) before API 14

Non belive che multicast non funziona su Galaxy S2, qualche tempo fa, quando ero codifica alcune applicazioni di rete, ho fatto diversi test su molti dispositivi, alcuni più vecchi come G1 ma anche su S2, S3 e Galaxy Tab 10.

Ma per poter utilizzare multicast è necessario abilitarlo programmaticamente.

Hai usato questo pezzo di codice?

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if(wifi != null){ 
WifiManager.MulticastLock lock = wifi.createMulticastLock("Log_Tag"); 
lock.acquire(); 
} 
+0

Sì, ho il codice sopra riportato nella mia app di esempio. Pubblicherò il mio codice completo nel mio commento originale. Con sicurezza posso confermare che il multicast funziona su diversi computer sulla mia rete, ma il mio Galaxy S2 fallisce miseramente :( – anopheles

+0

Quindi, se hai due dispositivi Android puoi provare a eseguire pttdroid, che è openourced http://code.google.com/ p/pttdroid/e ha un'opzione per inviare/ricevere dati (voce) ai gruppi multicast. – MP23

Problemi correlati