2011-07-28 22 views
20

Puedo enumerar todas las redes wifi en rango (usando startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResults) y obtener sus valores SSID y BSSID, pero no puedo entender cómo determinar el tipo de seguridad de cada red.android: Determine el tipo de seguridad de redes wifi en rango (sin conectarse a ellas)

En mi objetivo principal:

IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
    registerReceiver(scanReceiver, intentFilter); 
    ((WifiManager)getSystemService(Context.WIFI_SERVICE)).startScan(); 

En mi scanReceiver objeto:

public void onReceive(Context c, Intent intent) { 
    if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())){ 
     mainObject.scanComplete(); 
    } 
} 

Y de nuevo en mi objetivo principal:

public void scanComplete() 
{ 
    List<ScanResult> networkList = ((WifiManager)getSystemService.(Context.WIFI_SERVICE)).getScanResults(); 
    for (ScanResult network : networkList) 
    { 
     <do stuff> 
    } 
} 

el código funciona en la medida en que scanComplete finalmente consigue llamado, y puedo enumerar con éxito todas las redes wifi cercanas y obtener su SSID y BSSID, bu t No puedo averiguar cómo determinar su tipo de seguridad.

¿Hay alguna manera de hacerlo?

Gracias de antemano.

Respuesta

22

Necesitas analizar la cadena de las capacidades de la ScanResult en el método scanComplete. De acuerdo con la Android developer documentation,:

ScanResult.capabilities describe la autenticación, gestión de claves, y esquemas de cifrado soportados por el punto de acceso.

Es posible que pueda utilizar, o al menos utilizar como ejemplo, los métodos estáticos de ayuda disponibles en la clase AccessPointState.

+1

Gracias! Gran respuesta. – twaddington

+0

La clase AccessPointState tiene un gran código para interpretar las capacidades en un ScanResult – Xample

+0

¿Se pueden importar estos archivos directamente o es parte de algún otro paquete? – Sohaib

1

el tipo de seguridad de cada red es en la columna de las capacidades de los resultados del análisis.

Así que para obtener el tipo de seguridad para usted, agregue esto a su parte de su código.

public void scanComplete() 
{ 
    List<ScanResult> networkList = ((WifiManager)getSystemService.(Context.WIFI_SERVICE)).getScanResults(); 
    for (ScanResult network : networkList) 
    { 
     String Capabilities = network.capabilities; 

     //Then you could add some code to check for a specific security type. 
     if(Capabilities.contains("WPA")) 
    { 
      // We know there is WPA encryption 
     } 
     else if(Capabilities.contains("WEP")) 
     { 
     // We know there is WEP encryption 
     } 
     else 
     { 
     // Another type of security scheme, open wifi, captive portal, etc.. 
     } 

    } 
} 

De todas formas, aquí hay un código fuente rápido. Recomiendo totalmente la respuesta de Ayj, ya que es una respuesta excepcional y más completa.

7

Muchas gracias, ... que hizo que mi día ...

que tienen algo que añadir aquí. Sin la exploración de las redes, se puede obtener la información de configuración Wi-Fi conectado actualmente (especialmente cifrado y gestión de claves) de la siguiente manera,

WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
List<ScanResult> networkList = wifi.getScanResults(); 
if (networkList != null) { 
    for (ScanResult network : networkList) 
    { 
     String Capabilities = network.capabilities;   
     Log.w (TAG, network.SSID + " capabilities : " + Capabilities); 
    } 
} 
+0

funciona Pragnesh –

31

creo que se puede encontrar en el código fuente de Settings.apk.

Primero debe llamar wifiManager.getConfiguredNetworks() o wifiManager.getScanResults(), a continuación, utilizar los dos métodos siguientes: (encontrarlos en AccessPoint class "com.android.settings.wifi"):

static int getSecurity(WifiConfiguration config) { 
    if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { 
     return SECURITY_PSK; 
    } 
    if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) || 
      config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { 
     return SECURITY_EAP; 
    } 
    return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE; 
} 

static int getSecurity(ScanResult result) { 
    if (result.capabilities.contains("WEP")) { 
     return SECURITY_WEP; 
    } else if (result.capabilities.contains("PSK")) { 
     return SECURITY_PSK; 
    } else if (result.capabilities.contains("EAP")) { 
     return SECURITY_EAP; 
    } 
    return SECURITY_NONE; 
} 

la esperanza que esto sea útil.

+1

¿dónde puedo encontrar el código fuente? – YoungCoconutCode

+0

¿No debería estar también buscando WPA? – YoungCoconutCode

+2

excepto que este código fallará para las redes configuradas si la red configurada es WPA2_PSK .... El método devolvería SECURITY_NONE, lo que por supuesto es incorrecto ... Android API incluso oculta el acceso a KeyMgmt.WPA2_PSK, pero config.allowedKeyManagement es de todos modos 0 , así que prácticamente no hay manera de detectar correctamente las redes WPA2 que están almacenadas en redes configuradas ... – Lukas1

Cuestiones relacionadas