2013-03-30 3 views
6

В настоящее время я разрабатываю приложение для Android с использованием SDK> = 16, которое должно быть в состоянии обнаружить различные устройства Android (позже также устройства iOS) в локальной сети с использованием радио Wi-Fi.Обнаружение устройств в локальной сети

Мое первое предположение заключалось в использовании многоадресной передачи, которая оказалась недействительной на моей Samsung Galaxy S2: пакеты принимаются только при отправке с того же устройства.

Мое второе предположение - активно сканировать сеть с использованием ограниченного диапазона IP-адресов и ждать надлежащего ответа. К сожалению, это означает, что сеть использует DHCP для адреса IP-адресов.

Ни одно из вышеперечисленных решений, по-видимому, не является идеальным решением.

Мое текущее решение для моего первого предположения:

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; 
    } 
} 

Этот код приводит к блокировке на линии socket.receive (ПРИЕМ); Если я укажу тайм-аут, я получаю исключение тайм-аута.

ответ

2

Отъезд http://developer.android.com/training/connect-devices-wirelessly/index.html В нем упоминаются два способа поиска местных услуг - NSD и wifi direct.

+0

Но wifi direct подразумевает, что вы потеряете соединение с вашей локальной сетью, не так ли? Я все еще хочу иметь доступ к Интернету, открывая другие устройства. Также для целей тестирования было бы неплохо также обнаружить локальную машину, на которой работают не-андроиды. – anopheles

+0

Тогда попробуйте NSD. Сканирование - это не путь, к сетевому администратору это похоже на атаку. –

+1

Не использует NSD многоадресную рассылку под капотом? – anopheles

2

Проверьте мой ответ на очень похожий вопрос Android Network Discovery Service (ish) before API 14

Я не верю, что многоадресного не работает на Galaxy S2, некоторое время назад, когда я кодирования некоторые сетевые приложения, я сделал несколько тестов на многих устройствах, некоторые старые как G1, но также и на S2, S3 и Galaxy Tab 10.

Но для использования многоадресной передачи вы должны включить ее программно.

Вы использовали этот код?

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

Да, у меня есть код выше в моем примере приложения. Я напишу свой полный код в своем оригинальном комментарии. Я вызывающе могу подтвердить, что многоадресная рассылка работает на разных компьютерах в моей сети, но моя Galaxy S2 терпит неудачу :( – anopheles

+0

Итак, если у вас есть два Android-устройства, вы можете попробовать запустить pttdroid, который открывается на http://code.google.com/ p/pttdroid/и имеет возможность отправлять/получать данные (голос) в многоадресные группы. – MP23

Смежные вопросы