大致可以分為四個主要的類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現在還沒有成功……
首先附上一個工具類,有各種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;
}
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);
}
}
}