1. 程式人生 > >Android學習——WiFi

Android學習——WiFi

WiFi類

WiFi是一種無線聯網技術,常見的是使用無線路由器。那麼在這個訊號覆蓋的範圍內都可以採用WiFi連線的方式進行聯網。如果無線路由器連線了一個ADSL線路或者其他的聯網線路,則又被稱為“熱點”。
在Android中對WiFi操作,Android本身提供一些有用的包,在anroid.net.wifi包下面。

WiFi常用的類

ScanResult

主要用來描述已經檢測出的接入點,包括接入點地址,接入點名稱,身份認證,頻率,訊號強度等資訊。

WifiConfiguration

Wifi網路的配置,包括安全設定等,在我們連通一個wifi 接入點的時候,需要獲取到的一些資訊。主要包含四個屬性:

BSSID

是一種特殊的Ad-hoc LAN(一種支援點對點訪問的無線網路應用模式)的應用,一個無線網路至少由一個連線到有線網路的AP和若干無線工作站組成,這種配置稱為一個基本服務裝置。一群計算機設定相同的
BSS名稱,即可自成一個group,而此BSS名稱,即所謂BSSID。通常,手機WLAN中,bssid其實就是無線路由的MAC地址。

networkid

網路ID。

PreSharedKey

無線網路的安全認證模式。

SSID

SSID(Service Set Identif)用於標識無線區域網,SSID不同的無線網路是無法進行互訪的。

WifiInfo

wifi無線連線的描述,包括接入點,網路連線狀態,隱藏的接入點,IP地址,連線速度,MAC地址,網路ID,訊號強度等資訊。這裡簡單介紹一下這裡的方法:

getBSSID()                 //獲取BSSID
getDetailedStateStateOf()  //獲取客戶端的連通性
getHiddenSSID()            //獲取SSID是否被隱藏
getIpAddress()             //獲取IP地址
getLinkSpeed()             //獲取連線速度
getMacAdress()             //獲取Mac地址
getRssi()                  //獲取802.11n網路訊號
getSSID()                  //獲取SSID
getSupplicanState()        //返回具體客戶端狀態資訊

WiFiManager

用來管理我們的wifi 連線,這裡已經定義好了一些類,可以供我們使用,獲取WiFi網絡卡狀態。

WiFi常量

WIFI網絡卡的狀態是由一系列的整形常量來表示的。

WIFI_STATE_DISABLING = 0   WIFI網絡卡正在關閉
WIFI_STATE_DISABLED = 1    WIFI網絡卡不可用
WIFI_STATE_ENABLING = 2    WIFI網正在開啟 (WIFI啟動需要一段時間)
WIFI_STATE_ENABLED = 3     WIFI網絡卡可用
WIFI_STATE_UNKNOWN = 4     未知網絡卡狀態
WIFI_AP_STATE_DISABLING = 10   WIFI熱點正在關閉
WIFI_AP_STATE_DISABLED = 11    WIFI熱點不可用
WIFI_AP_STATE_ENABLING = 12    WIFI熱點正在開啟
WIFI_AP_STATE_ENABLED = 13     WIFI熱點可用

WiFi許可權

WiFi需求申請許可權,在AndroidManifest.xml檔案中填寫。

1.<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>//改變WiFi狀態。

2.  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>//改變WiFi多播狀態

3.  <uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE"/>//獲取WiFi狀態。

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

常用的方法

1.開啟WiFi

//開啟WiFi
public void WiFiOpen(){
    if(!localWifiManager.isWifiEnabled()){
      localWifiManager.setWifiEnabled(true);
    }
}

2.掃描WiFi訊號

//掃描wifi
public void WifiStartScan(){
    localWifiManager.startScan();
}

3.得到掃描WIFI結果

//得到Wifi配置好的資訊
public void getConfiguration(){
    wifiConfigList =localWifiManager.getConfiguredNetworks()//得到配置好的網路資訊
    for(int i =0;i<wifiConfigList.size();i++){
        Log.i("getConfiguration",wifiConfigList.get(i).SSID);             
        Log.i("getConfiguration",String.valueOf(wifiConfigList.get(i).networkId));
    }
}

4.根據WIFI的名稱SSID判定指定WIFI是否已經配置好,配置好則返回其networkId,用於連線。之前嘗試了BSSID地址沒成功,所以只能使用SSID

//判定指定WIFI是否已經配置好,依據WIFI的地址BSSID,返回NetId
public int IsConfiguration(String SSID){
    Log.i("IsConfiguration",String.valueOf(wifiConfigList.size()));
    for(int i = 0; i < wifiConfigList.size(); i++){
    Log.i(wifiConfigList.get(i).SSID,String.valueOf(wifiConfigList.get(i).networkId));
    if(wifiConfigList.get(i).SSID.equals(SSID)){//地址相同
        return wifiConfigList.get(i).networkId;
      }
    }
        return -1;
}

5.如果需要連線的WIFI沒有配置好,即沒有儲存密碼。則為指定名稱ssid的WIFI新增密碼資訊psw,新增成功後返回給其分配的networId,同於連線

//新增指定WIFI的配置資訊,原列表不存在此SSID
public int AddWifiConfig(List<ScanResult> wifiList,String ssid,String pwd){
    int wifiId = -1;
    for(int i = 0;i < wifiList.size(); i++){
        ScanResult wifi = wifiList.get(i);
        if(wifi.SSID.equals(ssid)){
            Log.e("AddWifiConfig","equals");
            WifiConfiguration wifiCong = new WifiConfiguration();
            wifiCong.SSID = "\""+wifi.SSID+"\"";//\"轉義字元,代表"
            wifiCong.preSharedKey = "\""+pwd+"\"";//WPA-PSK密碼
            wifiCong.hiddenSSID = false;
            wifiCong.status = WifiConfiguration.Status.ENABLED;
            wifiId = localWifiManager.addNetwork(wifiCong);//將配置好的特
定WIFI密碼資訊新增,新增完成後預設是不啟用狀態,成功返回ID,否則為-1
            if(wifiId != -1){
                return wifiId;
            }
        }
    }
    return wifiId;
}

6.根據步驟6配置好需要連線的WIFI密碼資訊後,下面通過networkId連線指定WIFI。在連線經過步驟6剛新增配置資訊的WIFI訊號之前需要重新執行下步驟4,得到新的配置好資訊的列表。

//連線指定Id的WIFI
public boolean ConnectWifi(int wifiId){
    for(int i = 0; i < wifiConfigList.size(); i++){
        WifiConfiguration wifi = wifiConfigList.get(i);
        if(wifi.networkId == wifiId){
            while(!(localWifiManager.enableNetwork(wifiId, true))){//啟用該Id,建立連線
            //status:0--已經連線,1--不可連線,2--可以連線
            Log.i("ConnectWifi",String.valueOf(wifiConfigList.get(w
ifiId).status));
            }
            return true;
        }
    }
    return false;
}