1. 程式人生 > >android中wifi屬性的介紹以及連線到指定的wifi

android中wifi屬性的介紹以及連線到指定的wifi

     今天公司的一個專案中的某一個功能正好需要切換wifi熱點的連線,所有順帶記錄一下

wifi模組簡介

android本身已經提供了包來處理Android環境下對Wifi的操作,位置是android.net.wifi下面。呼叫wifi操作需要在mainfest中新增對應許可權。

主要功能類

官方提供的大致可以分為四個主要的類:WifiManager,ScanResult,WifiConfiguration,WifiInfo,此外還有WifiLock,MulticastLock等

WifiManager

提供wifi管理的各種主要API,主要包含wifi的掃描,建立連線,配置等

(要操作 WIFI 裝置,需要先獲取 

Context.getSystemService(Context.WIFI_SERVICE)獲取WifiManager 物件,並通過這個物件來管理WIFI裝置。 )

addNetwork(WifiConfiguration config)新增一個config描述的WIFI網路,預設情況下,這個WIFI網路是DISABLE狀態的。
calculateSignalLevel(int rssi ,int numLevels)計算訊號的等級
compareSignalLevel(int rssiA,int rssiB)對比網路A和網路B的訊號強度
createWifiLock(int lockType
,String tag)建立一個WIFI 鎖,鎖定當前的WIFI連線 disableNetwork(int netId)讓一個網路連線失效 disconnect()斷開當前的WIFI連線 enableNetwork(int netId,Boolean disableOthers)連線netId所指的WIFI網路,並是其他的網路都被禁用 getConfiguredNetworks()獲取網路連線的狀態 getConnectionInfo()獲取當前連線的資訊 getDhcpInfo()獲取DHCP 的資訊 getScanResulats()獲取掃描測試的結果 getWifiState()獲取當前
WIFI裝置的狀態 isWifiEnabled()判斷WIFI裝置是否開啟 pingSupplicant() ping操作,和PCping操作相同作用 ressociate()重新連線WIFI網路,即使該網路是已經被連線上的 reconnect()重新連線一個未連線上的WIFI網路 removeNetwork()移除某一個網路 saveConfiguration()保留一個配置資訊 setWifiEnabled()讓一個連線有效 startScan()開始掃描 updateNetwork(WifiConfiguration config)更新一個網路連線

ScanResult

描述開啟掃描後的Wifi熱點的資訊。包含SSID、Capabilities、frequency、level(訊號強度)等。

List<ScanResult>scanResults=mWifiManager.getScanResults();//搜尋到的裝置列表s
tv01.setText("");
for (ScanResult scanResult:scanResults){
    //裝置名稱是這wifi熱點的名字
tv01.append("\n裝置名稱:"+scanResult.SSID+"\nBSSID接入點的地址:"+scanResult.BSSID+"\n網路接入的效能:"+scanResult.capabilities+"\n熱點的頻率(MHz)"+scanResult.frequency+"\n訊號強度:"+scanResult.level+"\n計算訊號的等級 :"+mWifiManager.calculateSignalLevel(scanResult.level,10)+"\n"+"\n");
}

WifiInfo

     描述已建立連線後的wifi資訊。包含ip、mac地址、連線速度等資訊。區別與ScanResult的概念
    WifiInfo 是專門用來表示連線的物件,這個物件可以通過 WifiManager.getConnectionInfo()來獲取。     WifiInfo中包含了當前連線中的相關資訊。
 getBSSID()獲取BSSID屬性
 getDetailedStateOf()獲取客戶端的連通性
 getHiddenSSID()獲取SSID 是否被隱藏
 getIpAddress()獲取IP 地址
 getLinkSpeed()獲取連線的速度
 getMacAddress()獲取Mac地址
 getRssi()獲取802.11n網路的訊號
 getSSID()獲取SSID
 getSupplicanState()獲取具體客戶端狀態的資訊

//    返回返回當前連線的wifi的相關資訊
private void getConnectionInfoss(){
//        WifiInfo mWifiInfo=mWifiManager.getConnectionInfo();
String ipText = intToIp(mWifiInfo.getIpAddress());//mWifiInfo.getIpAddress()這個得到的是十進位的數字,需要轉化成192.168.xxx.xx的形式
        int networkID = mWifiInfo.getNetworkId();tv01.setText("");
        tv01.append("\n獲取BSSID屬性:"+mWifiInfo.getBSSID()+"\n 獲取IP 地址 :"+ipText +"\n裝置名稱:"+mWifiInfo.getSSID()
        +"\nnetworkID  "+networkID+"\n獲取Mac 地址:"+mWifiInfo.getMacAddress());


    }

private String intToIp(int ip){
// java將IP地址轉換為數字以及逆向轉換(位運算和0xFF的使用)
return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "." + ((ip >> 24) & 0xFF);
}

WifiConfiguration

描述wifi的連線資訊,包含SSID、SSID隱藏、Password等的設定。

   //
這個方法可以連線到指定的wifi,Type=3已經測試過了,可以使用

  public 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 + "\"";
        WifiConfiguration tempConfig = this.IsExsits(SSID);
        if(tempConfig != null) {
            mWifiManager.removeNetwork(tempConfig.networkId);
        }

        if(Type == 1) //WIFICIPHER_NOPASS 沒有密碼的情況
{
            config.wepKeys[0] = "";
            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
            config.wepTxKeyIndex = 0;
        }
        if(Type == 2) //WIFICIPHER_WEP 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 == 3) //WIFICIPHER_WPA 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.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
            config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
            config.status = WifiConfiguration.Status.ENABLED;
        }
        return config;
    }

//這個方法的作用在於如果按照網上介紹的方法成功加入指定的wifi後,都會在終端的wifi列表中新新增一個以該指定ssid的網路,所以每執行一次程式,
//列表中就會多一個相同名字的ssid。而該方法就是檢查wifi列表中是否有以輸入引數為名的wifi熱點,如果存在,則在CreateWifiInfo方法開始
//配置wifi網路之前將其移除,以避免ssid的重複:
    private WifiConfiguration IsExsits(String SSID)
    {
        List<WifiConfiguration> existingConfigs = mWifiManager.getConfiguredNetworks();
        for (WifiConfiguration existingConfig : existingConfigs)
        {
            if (existingConfig.SSID.equals("\""+SSID+"\""))
            {
                return existingConfig;
            }
        }
        return null;
    }

網路許可權

<!-- 以下是使用wifi訪問網路所需的許可權 --><uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>

常用功能程式碼

獲取WifiManager

WifiManager wm = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);

設定wifi功能開啟

bRet = wifiManager.isWifiEnabled();//判斷是否開啟

bRet = wifiManager.setWifiEnabled(true);//設定開啟關閉

注意,呼叫setWifiEnabled後,系統進行wifi模組的開啟需要一定時間,此時通過wifiManager.getWifiState()獲取的狀態來判斷是否完成。

WifiManager.WIFI_STATE_DISABLED : WIFI網絡卡不可用(1)

WifiManager.WIFI_STATE_DISABLING : WIFI網絡卡正在關閉(0)

WifiManager.WIFI_STATE_ENABLED : WIFI網絡卡可用(3)

WifiManager.WIFI_STATE_ENABLING : WIFI網正在開啟(2) (WIFI啟動需要一段時間)

WifiManager.WIFI_STATE_UNKNOWN  : 未知網絡卡狀態

while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {    
  try {    
            Thread.currentThread();
           Thread.sleep(100); } 
             catch (InterruptedException ie) {    }   }

獲取手機中儲存過配置的連線資訊

List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();//獲取儲存的配置資訊

判斷某ssid的AP是否有儲存過配置資訊

for (WifiConfiguration existingConfig : existingConfigs) {       
  if (existingConfig.SSID.equals("/"" + SSID + "/"")) {                  
      return existingConfig;        
 }}

關閉Wifi連線

wifiManager.disableNetwork(existingConfig.networkId);

移除Wifi連線配置

wifiManager.removeNetwork(networkId);