android wifi總結

大體能夠分爲四個主要的類ScanResult wifiConfiguration WifiInfo WifiManager
(1)ScanResult,主要是經過wifi 硬件的掃描來獲取一些周邊的wifi 熱點的信息。
在咱們進行wifi 搜索的時候,通常會搜到這些信息,首先是接入點名字、接入點信息的強弱、還有接入點使用的安全模式,是WPA、WPE。
打開這個類,咱們能夠看到如下幾個信息
BSSID 接入點的地址,這裏主要是指小範圍幾個無線設備相鏈接所獲取的地址,好比說兩臺筆記本經過無線網卡進行鏈接,雙方的無線網卡分配的地址。
SSID 網絡的名字,當咱們搜索一個網絡時,就是靠這個來區分每一個不一樣的網絡接入點。
Capabilities 網絡接入的性能,這裏主要是來判斷網絡的加密方式等。
Frequency 頻率,每個頻道交互的MHz 數。
Level 等級,主要來判斷網絡鏈接的優先數。
這裏只提供了一個方法,就是將得到信息編程字符串toString()。
(2)wifiConfiguration 在咱們連通一個wifi 接入點的時候,須要獲取到的一些信息。你們能夠跟咱們有線的設備進行對比一下。
這裏的數據相對來講比較複雜一下。
六個子類
WifiConfiguration.AuthAlgorthm 用來判斷加密方法。
WifiConfiguration.GroupCipher 獲取使用GroupCipher 的方法來進行加密。
WifiConfiguration.KeyMgmt 獲取使用KeyMgmt 進行。
WifiConfiguration.PairwiseCipher 獲取使用WPA 方式的加密。
WifiConfiguration.Protocol 獲取使用哪種協議進行加密。
wifiConfiguration.Status 獲取當前網絡的狀態。
對於上述加密感興趣的朋友,能夠在網上搜索相關的內容。
(3)WifiInfo 在咱們的wifi 已經連通了之後,能夠經過這個類得到一些已經連通的wifi 鏈接的信息獲取當前連接的信息,這裏信息就比較簡單了,這裏簡單介紹一下這裏的方法:
getBSSID() 獲取BSSID
getDetailedStateOf() 獲取客戶端的連通性
getHiddenSSID() 得到SSID 是否被隱藏
getIpAddress() 獲取IP 地址
getLinkSpeed() 得到鏈接的速度
getMacAddress() 得到Mac 地址
getRssi() 得到802.11n 網絡的信號
getSSID() 得到SSID
getSupplicanState() 返回具體客戶端狀態的信息
(4)wifiManager 這個不用說,就是用來管理咱們的wifi 鏈接,這裏已經定義好了一些類,能夠供咱們使用。這裏來講相對複雜,裏面的內容比較多,可是經過字面意思,咱們仍是能夠得到不少相關的信息。這個類裏面預先定義了許多常量,咱們能夠直接使用,不用再次建立。
這裏仍是簡單介紹一下這裏的方法:
addNetwork(WifiConfiguration config) 經過獲取到的網絡的連接狀態信息,來添加網絡
calculateSignalLevel(int rssi , int numLevels) 計算信號的等級
compareSignalLevel(int rssiA, int rssiB) 對比鏈接A 和鏈接B
createWifiLock(int lockType, String tag) 建立一個wifi 鎖,鎖定當前的wifi 鏈接
disableNetwork(int netId) 讓一個網絡鏈接失效
disconnect() 斷開鏈接
enableNetwork(int netId, Boolean disableOthers) 鏈接一個鏈接
getConfiguredNetworks() 獲取網絡鏈接的狀態
getConnectionInfo() 獲取當前鏈接的信息
getDhcpInfo() 獲取DHCP 的信息
getScanResulats() 獲取掃描測試的結果
getWifiState() 獲取一個wifi 接入點是否有效
isWifiEnabled() 判斷一個wifi 鏈接是否有效
pingSupplicant() ping 一個鏈接,判斷是否能連通
ressociate() 即使鏈接沒有準備好,也要連通
reconnect() 若是鏈接準備好了,連通
removeNetwork() 移除某一個網絡
saveConfiguration() 保留一個配置信息
setWifiEnabled() 讓一個鏈接有效
startScan() 開始掃描
updateNetwork(WifiConfiguration config) 更新一個網絡鏈接的信息
此外wifiManaer 還提供了一個內部的子類,也就是wifiManagerLock,WifiManagerLock 的做用是這樣的,在普通的狀態下,若是咱們的wifi 的狀態處於閒置,那麼網絡的連通,將會暫時中斷。可是若是咱們把當前的網絡狀態鎖上,那麼wifi 連通將會保持在必定狀態,固然接觸鎖定以後,就會恢復常態

可是關於連接加密的wifi如今尚未成功……android

 

首先附上一個工具類,有各類WIFI操做方法:編程

public class WifiAdmin { 
    // 定義WifiManager對象  
    private WifiManager mWifiManager; 
    // 定義WifiInfo對象  
    private WifiInfo mWifiInfo; 
    // 掃描出的網絡鏈接列表  
    private List<ScanResult> mWifiList; 
    // 網絡鏈接列表  
    private List<WifiConfiguration> mWifiConfiguration; 
    // 定義一個WifiLock  
    WifiLock mWifiLock; 
 
    // 構造器  
    public WifiAdmin(Context context) { 
        // 取得WifiManager對象  
        mWifiManager = (WifiManager) context 
                .getSystemService(Context.WIFI_SERVICE); 
        // 取得WifiInfo對象  
        mWifiInfo = mWifiManager.getConnectionInfo(); 
    } 
 
    // 打開WIFI  
    public void openWifi() { 
        if (!mWifiManager.isWifiEnabled()) { 
            mWifiManager.setWifiEnabled(true); 
        } 
    } 
 
    // 關閉WIFI  
    public void closeWifi() { 
        if (mWifiManager.isWifiEnabled()) { 
            mWifiManager.setWifiEnabled(false); 
        } 
    } 
 
    // 檢查當前WIFI狀態  
    public int checkState() { 
        return mWifiManager.getWifiState(); 
    } 
 
    // 鎖定WifiLock  
    public void acquireWifiLock() { 
        mWifiLock.acquire(); 
    } 
 
    // 解鎖WifiLock  
    public void releaseWifiLock() { 
        // 判斷時候鎖定  
        if (mWifiLock.isHeld()) { 
            mWifiLock.acquire(); 
        } 
    } 
 
    // 建立一個WifiLock  
    public void creatWifiLock() { 
        mWifiLock = mWifiManager.createWifiLock("Test"); 
    } 
 
    // 獲得配置好的網絡  
    public List<WifiConfiguration> getConfiguration() { 
        return mWifiConfiguration; 
    } 
 
    // 指定配置好的網絡進行鏈接  
    public void connectConfiguration(int index) { 
        // 索引大於配置好的網絡索引返回  
        if (index > mWifiConfiguration.size()) { 
            return; 
        } 
        // 鏈接配置好的指定ID的網絡  
        mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, 
                true); 
    } 
 
    public void startScan() { 
        mWifiManager.startScan(); 
        // 獲得掃描結果  
        mWifiList = mWifiManager.getScanResults(); 
        // 獲得配置好的網絡鏈接  
        mWifiConfiguration = mWifiManager.getConfiguredNetworks(); 
    } 
 
    // 獲得網絡列表  
    public List<ScanResult> getWifiList() { 
        return mWifiList; 
    } 
 
    // 查看掃描結果  
    public StringBuilder lookUpScan() { 
        StringBuilder stringBuilder = new StringBuilder(); 
        for (int i = 0; i < mWifiList.size(); i++) { 
            stringBuilder 
                    .append("Index_" + new Integer(i + 1).toString() + ":"); 
            // 將ScanResult信息轉換成一個字符串包  
            // 其中把包括:BSSID、SSID、capabilities、frequency、level  
            stringBuilder.append((mWifiList.get(i)).toString()); 
            stringBuilder.append("/n"); 
        } 
        return stringBuilder; 
    } 
 
    // 獲得MAC地址  
    public String getMacAddress() { 
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress(); 
    } 
 
    // 獲得接入點的BSSID  
    public String getBSSID() { 
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID(); 
    } 
 
    // 獲得IP地址  
    public int getIPAddress() { 
        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress(); 
    } 
 
    // 獲得鏈接的ID  
    public int getNetworkId() { 
        return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId(); 
    } 
 
    // 獲得WifiInfo的全部信息包  
    public String getWifiInfo() { 
        return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString(); 
    } 
 
    // 添加一個網絡並鏈接  
 public void addNetwork(WifiConfiguration wcg) { 
        int wcgID = mWifiManager.addNetwork(wcg); 
        boolean b =  mWifiManager.enableNetwork(wcgID, true); 
        System.out.println("a--" + wcgID);
        System.out.println("b--" + b);
    } 
 
    // 斷開指定ID的網絡  
    public void disconnectWifi(int netId) { 
        mWifiManager.disableNetwork(netId); 
        mWifiManager.disconnect(); 
    } 
安全

而後是一個實際應用方法,只驗證過沒有密碼的狀況:網絡

 
       WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type) 
      { 
          WifiConfiguration config = new WifiConfiguration();   
           config.allowedAuthAlgorithms.clear(); 
           config.allowedGroupCiphers.clear(); 
           config.allowedKeyManagement.clear(); 
           config.allowedPairwiseCiphers.clear(); 
           config.allowedProtocols.clear(); 
          config.SSID = "\"" + SSID + "\"";   
          if(Type == Data.WIFICIPHER_NOPASS) 
          { 
               config.wepKeys[0] = ""; 
               config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
               config.wepTxKeyIndex = 0; 
          } 
          if(Type == Data.WIFICIPHER_WEP) 
          { 
              config.hiddenSSID = true;
              config.wepKeys[0]= "\""+Password+"\""; 
              config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 
              config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 
              config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 
              config.wepTxKeyIndex = 0; 
          } 
          if(Type == Data.WIFICIPHER_WPA) 
          { 
          config.preSharedKey = "\""+Password+"\""; 
          config.hiddenSSID = true;   
          config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);   
          config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                         
          config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);                         
          config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                    
          config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);                      
          config.status = WifiConfiguration.Status.ENABLED;   
          }app

           return config; 
               } 工具

  
}
性能

分爲三種狀況:1沒有密碼2用wep加密3用wpa加密測試

 

 

WifiManager wifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
boolean bRet1 = wifiManager.setWifiEnabled(true);
//add network
if (wifiManager.startScan()) //掃描可用的無線網絡
{
List scanResultList = wifiManager.getScanResults();
for (int i = 0; i < scanResultList.size(); i++)
{
ScanResult scanRet = scanResultList.get(i);
if (scanRet.SSID.equalsIgnoreCase("TEST")) //找到 TEST
{
WifiConfiguration config = new WifiConfiguration();
config.SSID = "\"" + scanRet.SSID + "\"";
config.preSharedKey = "\"password\""; //指定密碼
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
config.status = WifiConfiguration.Status.ENABLED;
int netID = wifiManager.addNetwork(config);
boolean bRet = wifiManager.enableNetwork(netID, true);
}
}
}
 

<!-- 如下是使用wifi訪問網絡所須要的權限-->ui


android.permission.CHANGE_NETWORK_STATE //修改網絡狀態的權限加密


android.permission.CHANGE_WIFI_STATE //修改wifi狀態的權限


android.permission.ACCESS_NETWORK_STATE //訪問網絡權限

android.permission.ACCESS_WIFI_STATE //訪問wifi權

相關文章
相關標籤/搜索