2011-03-08 10 views
12

Estoy creando una aplicación que puede transferir datos entre un dispositivo móvil y uno Wi-Fi ... El móvil tiene el AP habilitado (a través del código) y otro dispositivo se conecta a este red específica ... ¿Cómo puedo detectar a través del código para ver los detalles de los dispositivos conectados a la red (AP)? ** ¿Hay una solución para esto?Aplicación Android Dispositivo Wi-Fi: conectividad AP

He visto una aplicación llamada Wi-Fi Hot Spot en HTC Desire que hace esta funcionalidad de mostrar las direcciones IP de los dispositivos conectados a la red. ¿Cómo se puede lograr esto?

Salida Review: Sprint Mobile Hotspot on HTC EVO 4G.

Muestra una aplicación que realmente puede mostrar los usuarios conectados. ¿Cómo podemos hacer eso programáticamente? ¿Hay una API para eso?

Para crear un punto de acceso:

private void createWifiAccessPoint() { 
    if (wifiManager.isWifiEnabled()) 
    { 
     wifiManager.setWifiEnabled(false); 
    } 
    Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); //Get all declared methods in WifiManager class 
    boolean methodFound = false; 

    for (Method method: wmMethods){ 
     if (method.getName().equals("setWifiApEnabled")){ 
      methodFound = true; 
      WifiConfiguration netConfig = new WifiConfiguration(); 
      netConfig.SSID = "\""+ssid+"\""; 
      netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 
      //netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
      //netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 
      //netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
      //netConfig.preSharedKey = password; 
      //netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
      //netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
      //netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
      //netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 

      try { 
       boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig,true); 
       //statusView.setText("Creating a Wi-Fi Network \""+netConfig.SSID+"\""); 
       for (Method isWifiApEnabledmethod: wmMethods) 
       { 
        if (isWifiApEnabledmethod.getName().equals("isWifiApEnabled")){ 
         while (!(Boolean)isWifiApEnabledmethod.invoke(wifiManager)){ 
         }; 
         for (Method method1: wmMethods){ 
          if(method1.getName().equals("getWifiApState")){ 
           int apstate; 
           apstate = (Integer)method1.invoke(wifiManager); 
           //      netConfig = (WifiConfiguration)method1.invoke(wifi); 
           //statusView.append("\nSSID:"+netConfig.SSID+"\nPassword:"+netConfig.preSharedKey+"\n"); 
          } 
         } 
        } 
       } 

       if(apstatus) 
       { 
        System.out.println("SUCCESSdddd"); 
        //statusView.append("\nAccess Point Created!"); 
        //finish(); 
        //Intent searchSensorsIntent = new Intent(this,SearchSensors.class); 
        //startActivity(searchSensorsIntent); 
       } 
       else 
       { 
        System.out.println("FAILED"); 

        //statusView.append("\nAccess Point Creation failed!"); 
       } 
      } 
      catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } 
      catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } 
      catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    if (!methodFound){ 
     //statusView.setText("Your phone's API does not contain setWifiApEnabled method to configure an access point"); 
    } 
} 
+0

Eso no es correcto, el punto de acceso WiFi en el HTC Desire no se muestran los dispositivos que están conectados a la misma red WiFi que el deseo pero se abre un punto WiFi propio (y por lo tanto una red WiFi) y actúa como un punto de acceso propio. Es por eso que puede mostrar los dispositivos conectados, porque es su propia red. – theomega

+0

Ok ... estoy programado para establecer un punto de acceso Wifi ... ¿Ahora podré detectar los dispositivos conectados a esta red? –

+0

¿Dónde se rescata el Access-Point? ¿En un dispositivo que no es Android? Entonces sí. En Android, será bastante difícil sin acceso de root obtener los datos en una aplicación normal. – theomega

Respuesta

5

Se puede hacer ping al dispositivo si se conoce su nombre de host o la dirección IP.

Runtime runtime = Runtime.getRuntime(); 
    Process proc = runtime.exec("ping -c 1 " + hostname); 
    proc.waitFor(); 

que podría hacer una comprobación de la dirección IP, tratando todas las direcciones IP en la red para una respuesta usando un ping como la de arriba o tratando de conectarse a través de TCP o UDP.

Si conoce la dirección MAC, puede usar la tabla ARP.

Si tiene algún software propio ejecutándose en los dispositivos, puede enviar paquetes UDP en cada dispositivo y escucharlos en su dispositivo Android. Consulte Sending and receiving UDP broadcast packets in Android sobre cómo hacer esto.

+0

¿No hay ningún otro valor para verificar los dispositivos conectados a la red? Para poder repetir el recorrido y encontrar el requerido ... –

+1

Ver mi edición anterior. – theomega

+0

EN mi requerimiento, tengo un controlador wifi que se conectará al dispositivo (tome por ejemplo un móvil en el que tengo la aplicación instalada, tengo AP habilitado y desde el otro dispositivo que he conectado a esta red) ... ahora ¿Cómo averiguo en el dispositivo (aplicación instalada), los dispositivos conectados a la red ... el envío de paquetes UDP requeriría que instale otra aplicación en el otro dispositivo ... de todos modos ... ¿cómo escucho los paquetes UDP? –

7

Puede leer el archivo /proc/net/arp para leer todas las entradas ARP. Vea el ejemplo en la entrada del blog Android: Howto find the hardware MAC address of a remote host. En la tabla ARP, busque todos los hosts que pertenecen a su red Wi-Fi en función de la dirección IP.

Aquí hay un código de ejemplo, que cuenta la cantidad de hosts conectados al AP. Este código asume que una entrada ARP es para el teléfono conectado a la red y las restantes son de hosts conectados al AP.

private int countNumMac() 
{ 
    int macCount = 0; 
    BufferedReader br = null; 
    try { 
     br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line; 
     while ((line = br.readLine()) != null) { 
      String[] splitted = line.split(" +"); 
      if (splitted != null && splitted.length >= 4) { 
       // Basic sanity check 
       String mac = splitted[3]; 
       if (mac.matches("..:..:..:..:..:..")) { 
        macCount++; 
       } 
      } 
     } 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     try { 
      br.close(); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    if (macCount == 0) 
     return 0; 
    else 
     return macCount-1; //One MAC address entry will be for the host. 
} 
+0

hey ... increíble :) esto funcionó ... muchas cosas ... –

+1

¿Cómo sabías que tenías que acceder a este archivo?/Proc/net/arp ... ¿alguna fuente para esto? –

+1

/proc es un sistema de archivos estándar de Linux que proporciona mucha información sobre el kernel. Puede encontrar detalles sobre/proc/net en http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html. La búsqueda en Google de/proc le dará mucha información. – Paul

2

Puede utilizar accesspoint:

WifiApControl apControl = WifiApControl.getInstance(context); 

// These are cached and may no longer be connected, see 
// WifiApControl.getReachableClients(int, ReachableClientListener) 
List<WifiApControl.Client> clients = apControl.getClients() 
Cuestiones relacionadas