2012-04-20 5 views
4

В моем приложении мне нужно сканировать локальную подсеть (192.168.1. *), Чтобы собрать список MAC-адресов всех подключенных устройств.Сканирование подсети Android

Я в настоящее время используют следующую стратегию:

  1. запуска одновременно команды 255 пинг с Runtime.exec("ping -c 1 <addr>")
  2. использования waitFor() на каждом из возвращенного процесса, чтобы собрать код выхода
  3. близкие входные потоки процессов и уничтожить их
  4. файл /proc/net/arp и проанализировать MAC-адреса

В большинстве случаев это работает очень хорошо и обеспечивает быструю проверку.

Но на некоторых устройствах (например, android 1.5, а иногда и на> = 4.0) выполнение застревает при создании процесса (после того, как несколько из них были успешно запущены), и нет возможности убить текущий поток.

Вы видите что-нибудь, что я мог бы попытаться решить эту проблему? Или любая другая стратегия, которая не займет слишком много времени?

ответ

7

Это можно решить, используя пул потоков, выполняющий метод INetAddress.isReachable() (вместо запуска команды ping в собственных процессах).

private static final int NB_THREADS = 10; 

public void doScan() { 
    Log.i(LOG_TAG, "Start scanning"); 

    ExecutorService executor = Executors.newFixedThreadPool(NB_THREADS); 
    for(int dest=0; dest<255; dest++) { 
     String host = "192.168.1." + dest; 
     executor.execute(pingRunnable(host)); 
    } 

    Log.i(LOG_TAG, "Waiting for executor to terminate..."); 
    executor.shutdown(); 
    try { executor.awaitTermination(60*1000, TimeUnit.MILLISECONDS); } catch (InterruptedException ignored) { } 

    Log.i(LOG_TAG, "Scan finished"); 
} 

private Runnable pingRunnable(final String host) { 
    return new Runnable() { 
     public void run() { 
      Log.d(LOG_TAG, "Pinging " + host + "..."); 
      try { 
       InetAddress inet = InetAddress.getByName(host); 
       boolean reachable = inet.isReachable(1000); 
       Log.d(LOG_TAG, "=> Result: " + (reachable ? "reachable" : "not reachable")); 
      } catch (UnknownHostException e) { 
       Log.e(LOG_TAG, "Not found", e); 
      } catch (IOException e) { 
       Log.e(LOG_TAG, "IO Error", e); 
      } 
     } 
    }; 
} 
Смежные вопросы