Android: определение типа безопасности беспроводных сетей в диапазоне (без подключения к ним)

Я могу перечислить все Wi-Fi-сети в диапазоне (используя startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResults) и получить их значения SSID и BSSID, но я не могу понять, как определить тип безопасности каждой сети.

В моем основном объекте:

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

В моем объекте scanReceiver:

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

И снова в моем основном объекте:

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

Код работает, поскольку scanComplete в конечном итоге вызывается, и я могу успешно перечислить все соседние Wi-Fi-сети и получить их SSID и BSSID, но я не могу понять, как определить их тип безопасности.

Есть ли способ сделать это?

Спасибо заранее.

Ответ 1

Я думаю, вы можете найти его в исходном коде Settings.apk.

Сначала вы должны позвонить wifiManager.getConfiguredNetworks() или wifiManager.getScanResults(), затем используйте два метода ниже: (найдите их в 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;
}

Надеюсь, что это будет полезно.

Ответ 2

Вам нужно проанализировать строку возможностей ScanResult в методе scanComplete. В соответствии с Документация разработчика Android:

ScanResult.capabilities описывает аутентификацию, управление ключами и схемы шифрования, поддерживаемые точкой доступа.

Возможно, вы сможете использовать или, по крайней мере, использовать в качестве примера - статические вспомогательные методы, доступные в классе AccessPointState.

Ответ 3

Большое спасибо,... ты сделал мой день...

У меня есть что добавить. Без сканирования для сетей можно получить текущую связанную конфигурационную информацию Wi-Fi (особенно шифрование и управление ключами) следующим образом:

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

Ответ 4

Тип безопасности каждой сети находится в столбце "Возможности" результатов сканирования.

Итак, чтобы получить тип безопасности для вас, добавьте это в свою часть кода.

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

    }
}

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