2013-03-30 18 views
6

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.

Odpowiedz

2

Wyewidencjonuj http://developer.android.com/training/connect-devices-wirelessly/index.html Wymienia dwa sposoby wyszukiwania usług lokalnych - NSD i wifi direct.

+0

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

+0

Następnie wypróbuj NSD. Skanowanie nie jest drogą, administrator sieci wygląda jak atak. –

+1

Czy NSD nie używa multicastu pod maską? – anopheles

2

Sprawdź moją odpowiedź w bardzo podobnym pytaniem Android Network Discovery Service (ish) before API 14

ja nie wierzę, że multicast nie działa na Galaxy S2, jakiś czas temu, kiedy kodowanie jakąś aplikację sieciową, zrobiłem kilka testów na wielu urządzeniach, niektóre starsze jak G1, ale także na S2, S3 i Galaxy Tab 10.

Ale aby móc korzystać z multicastu, musisz go włączyć programowo.

Użyłeś tego kawałka kodu?

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

Tak, mam powyższy kod w mojej przykładowej aplikacji. Wstawię swój kompletny kod do mojego oryginalnego komentarza. Zdecydowanie mogę potwierdzić, że multiemisja działa na różnych komputerach w mojej sieci, ale mój Galaxy S2 niestety nie działa :( – anopheles

+0

Tak więc, jeśli masz dwa urządzenia z Androidem, możesz spróbować uruchomić pttdroid, który jest opensourced http://code.google.com/ p/pttdroid/i ma opcję wysyłania/odbierania danych (głos) do grup multiemisji. – MP23

Powiązane problemy