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 ответить, хотя, поскольку это исключительный ответ и более полный.