2013-03-30 8 views
6

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.

Antwort

2

Auschecken http://developer.android.com/training/connect-devices-wirelessly/index.html Es erwähnt zwei Möglichkeiten, lokale Dienste zu finden - NSD und WLAN direkt.

+0

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

+0

Dann versuchen Sie NSD. Scannen ist nicht der richtige Weg, für einen Netzwerkadministrator sieht es wie ein Angriff aus. –

+1

Verwendet NSD Multicast nicht unter der Haube? – anopheles

2

Überprüfen Sie meine Antwort in sehr ähnliche Frage Android Network Discovery Service (ish) before API 14

Ich glaube nicht, dass Multicast nicht auf Galaxy S2 arbeitet, vor einiger Zeit, als ich eine Netzwerk-Anwendung wurde Codierung, machte ich einige Test auf vielen Geräten, einige ältere wie G1, aber auch auf S2, S3 und Galaxy Tab 10.

Aber um Multicast verwenden zu können, müssen Sie es programmatisch aktivieren.

Haben Sie diesen Codecode verwendet?

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

Ja, ich habe den obigen Code in meiner Beispiel-App. Ich werde meinen vollständigen Code in meinem ursprünglichen Kommentar veröffentlichen. Ich kann trotzig bestätigen, dass Multicast auf verschiedenen Computern in meinem Netzwerk funktioniert, aber mein Galaxy S2 scheitert kläglich :( – anopheles

+0

Also, wenn Sie zwei Android-Geräte haben, können Sie versuchen, Pttdroid, die http://code.google.com/ opensourced ausgeführt wird p/pttdroid/und hat die Option, Daten (Sprache) an Multicast-Gruppen zu senden/zu empfangen. – MP23