WIFI全稱Wireless Fidelity,又稱802.11b標準,它的最大優勢就是傳輸速度較高,能夠達到11Mbit/s。另外,它的有效距離也很長,同時也與已有的各類802.11 DSSS設備兼容。它是一種能夠將計算機、手持設備(如PDA、手機)等終端以無線方式互相鏈接的技術。Wi-Fi是一個無線網絡通訊技術的品牌,由Wi-Fi聯盟(Wi-Fi Alliance)所持有。 java
通俗點介紹WiFi,咱們在用筆記本電腦上網時,每每是插上網線上網,但若是不用網線經過無線網絡,鏈接無線路由器上網的話,就是用WiFi。手機一樣也能夠鏈接無線路由器上網,一樣也稱之爲WiFi,而且速度也快,而且還不產生流量費用。如今無線網絡不少,通常公共場合均可以搜索到幾個熱點,例如麥當勞、肯德基、上島咖啡等,都有提供無線WiFi網絡。 android
在Android手機上,WiFi是很常見而且頗有用的一個功能。經過WiFi使用瀏覽器瀏覽網頁、使用Market來下載免費軟件、使用IM上MSN進行聊天、使用Gmail來收發郵件等。主要好處是速度快而且沒有流量費。在Android手機中Wifi的設置很是的簡單,先勾選WiFi功能,WiFi會自動搜索附近熱點,而後就會列出熱點列表,但通常都會有密碼,點擊熱點輸入密碼就可輕鬆鏈接WiFi了。 編程
學習Android手機WiFi代碼編程 瀏覽器
首先安裝eclipse,開發Android,新建項目。 安全
在Android手機中操做WiFi是很簡單的,上面已經介紹了。在學習代碼前,先了解下WiFi在Android系統中是怎樣運行起來的和各個環節的配合;圖: 網絡
下面是編寫WiFi的代碼:,須要在AndroidManifest.xml註冊幾個權限: app
代碼以下: less
- <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.CHANGE_NETWORK_STATE">
- </uses-permission> //修改網絡狀態的權限
- <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.CHANGE_WIFI_STATE">
- </uses-permission> //修改WiFi狀態的權限
- <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.ACCESS_NETWORK_STATE">
- </uses-permission> //訪問網絡權限
- <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.ACCESS_WIFI_STATE">
- </uses-permission> //訪問WiFi權限
WiFi操做時,網卡狀態是由一些整型常量表示。 eclipse
(1)WIFI_STATE_DISABLED:WiFi網卡不可用。 ide
(2)WIFI_STATE_DISABLING:WiFi正在關閉。
(3)WIFI_STATE_ENABLED:WiFi網卡可用。
(4)WIFI_STATE_ENABLING:WiFi網卡正在打開。
(5)WIFI_STATE_UNKNOWN:未知網卡狀態。
Android中WiFi的重要操做類和接口(ScanResult wifiConfiguration WifiInfo WifiManager)。
(1)ScanResult 主要是經過WiFi 硬件的掃描來獲取一些周邊的WiFi 熱點的信息。包括接入點名稱、信號強弱、安全模式、頻率等。其構造函數中包含幾個參數,下面簡單介紹一下。
BSSID:接入點的地址,主要是指小範圍幾個無線設備相鏈接所獲取的地址。
SSID:網絡的名字,當搜索一個網絡時,就是靠這個來區分每一個不一樣的網絡接入點。
Capabilities:網絡接入的性能,這裏主要是來判斷網絡的加密方式等。
Frequency:頻率,每個頻道交互的MHz 數。
Level:等級,主要來判斷網絡鏈接的優先數。
(2)WifiConfiguration 配置WiFi網絡,它包含了6個內部類。
WifiConfiguration.AuthAlgorthm 用來判斷加密方法。
WifiConfiguration.GroupCipher 使用GroupCipher 的方法來進行加密。
WifiConfiguration.KeyMgmt 使用KeyMgmt 進行加密。
WifiConfiguration.PairwiseCipher 使用WPA 方式加密。
WifiConfiguration.Protocol 使用哪種協議進行加密。
wifiConfiguration.Status 當前網絡的狀態。
(3)WifiInfo 獲得WiFi信息,包括接入點。
getBSSID() 獲取BSSID。
getDetailedStateOf() 獲取客戶端的連通性。
getHiddenSSID() 得到SSID 是否被隱藏。
getIpAddress() 獲取IP 地址。
getLinkSpeed() 得到鏈接的速度。
getMacAddress() 得到Mac 地址。
getRssi() 得到802.11n 網絡的信號。
getSSID() 得到SSID。
getSupplicanState() 返回具體客戶端狀態的信息。
代碼編寫功能
使用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 還提供了兩個內部的子類,MulticastLock和WifiManagerLock,分別簡單介紹這兩個內部類,MulticastLock容許一個應用程序接收多個無線網絡的數據包;WifiManagerLock Wifi是網絡鎖的概念,通常狀況當應用程序經過WiFi鏈接網絡後,長時間不用,則網絡自動關閉。若是利用WifiManagerLock鎖定鏈接好的網絡,那麼就不會產生這種現象了,有鎖定固然也有解除鎖定。在使用過程當中,WiFi的使用是一個耗電的過程,因此,應用程序又不能長時間進行網絡鏈接。按照應用程序需求,一些耗時的操做就能夠添加一個鎖,簡單請求就不用。
關於WiFi操做的例子,就不在Android平臺開發了,此處給出一個自定義WiFi工具類,包含了WiFi的不少操做,如打開、關閉、鎖定、解鎖、掃描熱點、WiFi配置、獲取WiFi信息等。
代碼實例:
OK,大功告成,能夠進行WiFi測試啦。
- package com.pms.wifi;
- import java.util.List;
- import android.content.Context;
- import android.net.wifi.ScanResult;
- import android.net.wifi.WifiConfiguration;
- import android.net.wifi.WifiInfo;
- import android.net.wifi.WifiManager;
- import android.net.wifi.WifiManager.WifiLock;
- public class WifiHandle {
- private WifiManager wifiManager = null;
- private WifiInfo wifiInfo = null;
- private List<ScanResult> scanResultList = null;// 掃描出的網絡鏈接列表
- private List<WifiConfiguration> wifiConfigurationList = null;// 網絡鏈接列表
- private WifiLock wifiLock = null;
- // 構造函數
- public WifiHandle(Context context) {
- wifiManager = (WifiManager) context
- .getSystemService(context.WIFI_SERVICE);// 從系統服務中獲得WifiManager
- // 獲得WiFi相關信息,包括MAX地址、接入點BSSID、IP地址、鏈接的ID
- wifiInfo = wifiManager.getConnectionInfo();
- }
- // 打開WiFi
- public void openWifi() {
- if (!wifiManager.isWifiEnabled()) {
- wifiManager.setWifiEnabled(true);
- }
- }
- // 關閉WiFi
- public void closeWife() {
- if (wifiManager.isWifiEnabled()) {
- wifiManager.setWifiEnabled(false);
- }
- }
- // 鎖定WiFi
- public void lockWifi() {
- wifiLock.acquire();
- }
- // 解鎖WiFi
- public void rlockWifi() {
- if (wifiLock.isHeld()) {
- wifiLock.acquire();
- }
- }
- // 建立一個wifilock
- public void createWifiLock() {
- wifiLock = wifiManager.createWifiLock("Machao");
- }
- public List<WifiConfiguration> getConfingurationList() {
- return wifiConfigurationList;// 獲得配置好的網絡
- }
- public void connectConfiguration(int index) {
- if (index > wifiConfigurationList.size()) {
- return;
- }
- wifiManager.enableNetwork(wifiConfigurationList.get(index).networkId,
- true);// 鏈接配置好的指定ID的網絡
- }
- public void startScan() {
- wifiManager.startScan();
- // 獲得掃描結果
- scanResultList = wifiManager.getScanResults();
- // 獲得配置好的網絡鏈接
- wifiConfigurationList = wifiManager.getConfiguredNetworks();
- }
- // 獲得網絡列表
- public List<ScanResult> getScanResultList() {
- return scanResultList;
- }
- // 查看掃描結果
- public StringBuilder lookUpScan() {
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i < scanResultList.size(); i++) {
- stringBuilder
- .append("Index_" + new Integer(i + 1).toString() + ":");
- // 將ScanResult信息轉換成一個字符串包
- // 其中包括:BSSID、SSID、capabilities、frequency、level
- stringBuilder.append((scanResultList.get(i)).toString());
- stringBuilder.append("\n");
- }
- return stringBuilder;
- }
- // 獲得MAC地址
- public String getMacAddress() {
- return (wifiInfo == null) ? "NULL" : wifiInfo.getMacAddress();
- }
- // 獲得接入點的BSSID
- public String getBSSID() {
- return (wifiInfo == null) ? "NULL" : wifiInfo.getBSSID();
- }
- // 獲得IP地址
- public int getIPAddress() {
- return (wifiInfo == null) ? 0 : wifiInfo.getIpAddress();
- }
- // 獲得鏈接的ID
- public int getNetworkId() {
- return (wifiInfo == null) ? 0 : wifiInfo.getNetworkId();
- }
- // 獲得WifiInfo的全部信息包
- public String getWifiInfo() {
- return (wifiInfo == null) ? "NULL" : wifiInfo.toString();
- }
- // 添加一個網絡並鏈接
- public void addNetwork(WifiConfiguration wcg) {
- int wcgID = wifiManager.addNetwork(wcg);
- wifiManager.enableNetwork(wcgID, true);
- }
- // 斷開指定ID的網絡
- public void disconnectWifi(int netId) {
- wifiManager.disableNetwork(netId);
- wifiManager.disconnect();
- }
- }
end