wifi的基本結構
在Android的官方文檔中定義了如下五種狀態:
WIFI_STATE_DISABLING WIFI網卡正在關閉 0
WIFI_STATE_DISABLED WIFI網卡不可用 1WIFI_STATE_ENABLING WIFI網卡正在打開 2
WIFI_STATE_ENABLED WIFI網卡可用 3
WIFI_STATE_UNKNOWN WIFI網卡狀態不可知 4
這里列了很多,但是大致可以分為四個主要的類: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 獲取當前網絡的狀態。
對於上述加密感興趣的朋友,可以在網上搜索相關的內容。
設置WifiConfiguration的屬性:
WifiConfiguration.AuthAlgorthm 設置加密方法。
可選參數:LEAP只用於leap,
OPEN 被wpa/wpa2需要,
SHARED需要一個靜態的wep key
WifiConfiguration.GroupCipher 使用GroupCipher 的方法來進行加密。
可選參數:CCMP,TKIP,WEP104,WEP40
WifiConfiguration.KeyMgmt 鍵管理機制(keymanagerment),使用KeyMgmt 進行。
可選參數IEEE8021X,NONE,WPA_EAP,WPA_PSK
WifiConfiguration.PairwiseCipher 設置加密方式。
可選參數 CCMP,NONE,TKIP
WifiConfiguration.Protocol 設置一種協議進行加密。
可選參數 RSN,WPA,
wifiConfiguration.Status 設置當前網絡的狀態。
可選參數CURRENT,DISABLED,ENABLED
(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,手動輸入密碼並保存,連接WIFI。第二次連接該WIFI信號不需要輸入密碼
首先在AndroidManifest.XML中開啟響應的權限
1 <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission><!-- 允許程序改變網絡鏈接狀態 --> 2 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!--允許程序訪問訪問WIFI網絡狀態信息 --> 3 <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 允許程序改變WIFI鏈接狀態 --> 4 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
1、開啟WIFI
1 //開啟WIFI 2 public void WifiOpen(){ 3 if(!localWifiManager.isWifiEnabled()){ 4 localWifiManager.setWifiEnabled(true); 5 } 6 }
2、掃描WIFI信號
1 //掃描wifi 2 public void WifiStartScan(){ 3 localWifiManager.startScan(); 4 }
3、得到掃描WIFI結果
1 //得到Scan結果 2 public List<ScanResult> getScanResults(){ 3 return localWifiManager.getScanResults();//得到掃描結果 4 }
4、得到WIFi的配置好的信息,包含配置好的密碼
1 //得到Wifi配置好的信息 2 public void getConfiguration(){ 3 wifiConfigList = localWifiManager.getConfiguredNetworks();//得到配置好的網絡信息 4 for(int i =0;i<wifiConfigList.size();i++){ 5 Log.i("getConfiguration",wifiConfigList.get(i).SSID); 6 Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId)); 7 } 8 }
5、根據WIFI的名稱SSID判定指定WIFI是否已經配置好,配置好則返回其networkId,用於連接。之前嘗試了BSSID地址沒成功,所以只能使用SSID
6、如果需要連接的WIFI沒有配置好,即沒有保存密碼。則為指定名稱ssid的WIFI添加密碼信息psw,添加成功后返回給其分配的networId,同於連接
1 //連接指定Id的WIFI 2 public boolean ConnectWifi(int wifiId){ 3 for(int i = 0; i < wifiConfigList.size(); i++){ 4 WifiConfiguration wifi = wifiConfigList.get(i); 5 if(wifi.networkId == wifiId){ 6 while(!(localWifiManager.enableNetwork(wifiId, true))){//激活該Id,建立連接 7 //status:0--已經連接,1--不可連接,2--可以連接 8 Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(wifiId).status)); 9 } 10 return true; 11 } 12 } 13 return false; 14 }
這只是簡單的應用。
project源碼:http://download.csdn.net/detail/liuhui_8989/7154671