2011-07-28 27 views
20

Tôi có thể liệt kê tất cả các mạng wifi trong phạm vi (sử dụng startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResults) và nhận giá trị SSID và BSSID của chúng, nhưng tôi không thể tìm ra cách xác định loại bảo mật của mỗi mạng.android: Xác định loại bảo mật của mạng wifi trong phạm vi (không kết nối với chúng)

Trong đối tượng chính của tôi:

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

Trong đối tượng scanReceiver tôi:

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

Và một lần nữa trong đối tượng chính của tôi:

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

Mã công trình trong chừng mực scanComplete mà cuối cùng được được gọi và tôi có thể liệt kê thành công tất cả các mạng wifi lân cận và nhận SSID và BSSID của họ, bu Tôi không thể tìm ra cách xác định loại bảo mật của họ.

Có cách nào để thực hiện việc này không?

Xin cảm ơn trước.

Trả lời

22

Bạn cần phải phân tích cú pháp chuỗi khả năng của ScanResult trong phương thức scanComplete. Theo Android developer documentation,:

ScanResult.capabilities mô tả xác thực, quản lý chủ chốt, và chương trình mã hóa được hỗ trợ bởi các điểm truy cập.

Bạn có thể sử dụng - hoặc ít nhất là sử dụng làm ví dụ - các phương thức trợ giúp tĩnh có sẵn trong lớp AccessPointState.

+1

Cảm ơn! Câu trả lời chính xác. – twaddington

+0

Lớp AccessPointState có một số mã tuyệt vời để diễn giải các khả năng trong ScanResult – Xample

+0

Các tệp này có thể được nhập trực tiếp hay là một phần của một số gói khác? – Sohaib

1

Các loại bảo mật của mỗi mạng là trong khả năng cột của kết quả quét.

Vì vậy, để có loại bảo mật cho bạn, hãy thêm mã này vào phần mã của bạn.

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

    } 
} 

Dù sao, đây là một số mã nguồn nhanh. Tôi sẽ hoàn toàn recomment câu trả lời của Ayj mặc dù, vì nó là một phản ứng đặc biệt và đầy đủ hơn.

7

Cảm ơn rất nhiều, ... bạn đã thực hiện một ngày của tôi ...

Tôi có gì đó để thêm tại đây. Nếu không quét tìm mạng, người dùng có thể nhận thông tin cấu hình wifi hiện đang được kết nối (đặc biệt là mã hóa và quản lý khóa) như sau,

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

hoạt động của mình cảm ơn bạn Pragnesh –

31

Tôi nghĩ bạn có thể tìm thấy nó trong mã nguồn của Settings.apk.

Trước tiên, bạn nên gọi wifiManager.getConfiguredNetworks() hoặc wifiManager.getScanResults(), sau đó sử dụng hai phương thức dưới đây: (tìm thấy chúng trong 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; 
} 

Hy vọng điều này là hữu ích.

+1

nơi tôi có thể tìm thấy mã nguồn? – YoungCoconutCode

+0

Bạn có nên kiểm tra WPA không? – YoungCoconutCode

+2

ngoại trừ mã này sẽ không thành công cho mạng được định cấu hình nếu mạng được định cấu hình là WPA2_PSK .... Phương pháp sẽ trả về SECURITY_NONE, dĩ nhiên là sai ... Android API thậm chí ẩn quyền truy cập vào KeyMgmt.WPA2_PSK, nhưng config.allowedKeyManagement vẫn là 0 , rất nhiều không có cách nào để phát hiện chính xác các mạng WPA2 được lưu trữ trong các mạng được định cấu hình ... – Lukas1

Các vấn đề liên quan