Android Wifi模塊學習


調研完Android的wifi相關操作,剛好單位要求整理個文檔,順便園子里也發個記錄下。。。

 

wifi模塊簡介

android本身已經提供了包來處理Android環境下對Wifi的操作,位置是android.net.wifi下面。調用wifi操作需要在mainfest中添加對應權限。

 

主要功能類

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

 

WifiManager

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

http://developer.android.com/reference/android/net/wifi/WifiManager.html

 

ScanResult

描述開啟掃描后的Wifi熱點的信息。包含SSID、Capabilities、frequency、level(信號強度)等。

http://developer.android.com/reference/android/net/wifi/ScanResult.html

 

WifiConfiguration

描述wifi的連接信息,包含SSID、SSID隱藏、Password等的設置。

http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html

 

WifiInfo

描述已建立連接后的wifi信息。包含ip、mac地址、連接速度等信息。區別與ScanResult的概念。

http://developer.android.com/reference/android/net/wifi/WifiInfo.html

 

WifiLock

用於給wifi加鎖,通常用於下載大體積文件的時候。
如果應用程序想在屏幕被關掉后繼續使用WiFi則可以調用 acquireWifiLock來鎖住WiFi,該操作會阻止WiFi進入睡眠狀態。當應用程序不再使用WiFi時需要調用 releaseWifiLock來釋放WiFi。之后WiFi可以進入睡眠狀態以節省電源。
默認情況下當屏幕被關掉以后,如果沒有應用程序在使用WiFi,WiFi會在2分鍾后進入睡眠狀態。這主要是為防止頻繁地改變WiFi的電源模式。

wifiLock可通過setReferenceCounted(boolean refCounted)來設置加鎖方式。一種是不計數鎖,另一種是計數鎖。
區別在於:前者無論 acquire() 了多少次,只要通過一次 release()即可解鎖。后者正真解鎖是在( --count == 0 )的時候。 
http://developer.android.com/reference/android/net/wifi/WifiManager.WifiLock.html

 

常用功能代碼

獲取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) {

                            }

                   }

 

掃描附近接入點AP

List<ScanResult> list = null;

if ( wifiManager.startScan())

list = wifiManager.getScanResults();

 

獲取AP的信號強度、頻率等

scanResult.level  //信號強度

scanResult.frequency  //頻率

 

獲取手機中保存過配置的連接信息

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);

注意與上面的disableNetwork的區別。Disable只是單純的斷開連接,保存的ssid和密碼並不清除。

Remove則是從手機中移除(忘記)該連接配置,用來清除保存的密碼

在網絡正常連接的狀態,也可直接調用remove來代替disable中斷網絡,但會清除密碼信息。

 

創建連接Configuration

public WifiConfiguration CreateWifiConfig(String SSID, String Password,

                            WifiCipherType 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 == WifiCipherType.WIFICIPHER_NOPASS) {

                            config.wepKeys[0] = "";

                            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

                            config.wepTxKeyIndex = 0;

                   }

                  

                   //WEP加密

                   if (Type == WifiCipherType.WIFICIPHER_WEP) {

                            config.preSharedKey = "\"" + Password + "\"";

                            config.hiddenSSID = true;

                            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;

                   }

                  

                   //WPA加密

                   if (Type == WifiCipherType.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;

                   }

                   else {

                            return null;

                   }

                   return config;

         }

 

 

添加、開啟一個wifi

public boolean addNewWifi(WifiConfiguration newConfig){

                   int netID = wifiManager.addNetwork(newConfig);//添加

                   boolean bRet = wifiManager.enableNetwork(netID, false);//啟動

                   return bRet;

         }

 

獲取目前的WifiInfo(IP、mac等)

WifiInfo wInfo = wifiManager.getConnectionInfo();//獲取當前連接的info

 

wInfo.getBSSID();// 獲取BSSID

wInfo.getHiddenSSID();// 獲得SSID 是否被隱藏

wInfo.getIpAddress();// 獲取IP 地址

wInfo.getLinkSpeed();// 獲得連接的速度

wInfo.getMacAddress();// 獲得Mac 地址

wInfo.getRssi();// 獲得802.11n 網絡的信號

wInfo.getSSID();// 獲得SSID

SupplicantState suppState = wInfo.getSupplicantState();// 返回具體客戶端狀態的信息

wInfo.getDetailedStateOf(suppState);// 獲取客戶端的連通性

 

 

相關權限

修改網絡狀態的權限

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" >

</uses-permission>

 

修改WIFI狀態的權限

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >

</uses-permission>

 

訪問網絡權限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >

</uses-permission>

 

訪問WIFI權限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >

</uses-permission>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM