Android WIFI 詳解
最 近研究Wifi模塊,查了不少的相關資料,但發現基本上是基于android2.0版本的的分析,而現在研發的android移動平臺基本上都是2.3的 版本,跟2.0版本的差別,在Wifi模塊上也是顯而易見的。2.3版本Wifi模塊沒有了WifiLayer,之前的WifiLayer主要負責一些復 雜的Wifi功能,如AP選擇等以提供給用戶自定義,而新的版本里面的這塊內容基本上被WifiSettings所代替。
本文引用地址:http://cqxgywz.com/article/201610/305545.htm本文就是基于android2.3版本的Wifi分析,主要分為兩部分來分別說明:
(1) Wifi模塊相關文件的解析
(2) Wpa_supplicant解析
(3) Wifi的啟動流程(有代碼供參考分析)
一,Wifi模塊相關文件解析
1) wifisettings.java
packages/apps/Settings/src/com/android/settings/wifiwifisettings.java
該類數據部分主要定義了下面幾個類的變量:
{
private final IntentFilter mFilter;
//廣播接收器,用來接收消息并做響應的處理工作
privatefinal BroadcastReceiver mReceiver;
//這是一個掃描類,會在用戶手動掃描 AP時被調用
privatefinal Scanner mScanner;
private WifiInfo mLastInfo;
//服務代理端,作為WifiService對外的接口類呈現
privateWifiManager mWifiManager;
//這個類主要實現Wifi的開閉工作
privateWifiEnabler mWifiEnabler;
//AP
private AccessPoint mSelected;
private WifiDialog mDialog;
……
}
wifiSettings類的構造函數的主要工作:定義了一個IntentFilter(Intent過濾器)變量,并添加了六個動作,(了解 Android的intent機制的同學都知道什么意思,不明白的同學參考Intent機制的資料)接著定義一個廣播接收器,并有相應的消息處理函數,下 面是該構造函數的定義:
public WifiSettings() {
mFilter = new IntentFilter();
//intent機制中的intent消息過濾器,下面添加可以處理的動作
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
//注冊了廣播接收器,用來處理接收到的消息事件
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
handleEvent(intent); //事件處理函數
}
};
mScanner= new Scanner(); //手動掃描類
}
在廣播接收器中的相應函數onReceive函數中有個handleEvent函數,它就是用來處理廣播接收器接受到的intent消息的,它的功能是根 據intent消息中的動作類型,來執行相應的操作,每一種動作對應了activity的一項消息處理能力。
在oncreate函數中實例化了mWifiManager和mWifiEnabler兩個類,這兩個類對wifiSettings來說至關重要,它后面的定義的一系列函數都是通過調用這兩個類的相應接口來實現的。
……
mWifiManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);
mWifiEnabler = new WifiEnabler(this,
(CheckBoxPreference) findPreference(enable_wifi));
……
WifiSettings中還定義了顯示菜單和響應菜單鍵的函數,即onCreateOptionsMenu()和 onOptionsItemSelected();還有響應配置對話框中按鍵的onClick()函數;最后定義了Scanner類,它是一個 handler的繼承類,實現了消息處理函數,用于處理手動掃描的動作。
2) WifiEnabler.java:
packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java
private final Context mContext;
private final CheckBoxPreference mCheckBox;
//兩個重要成員
private final WifiManager mWifiManager;
private final IntentFilter mIntentFilter;
wifienabler類中定義了四個成員變量很重要,mContext,mCheckBox,mWifiManager和mReceiver,其中 mContext用于獲取mwifiManager實例,mReceiver用來接收底層發來的消息,mCheckBox用來改變UI的狀態。
該 類中定義了幾個重要的函數onPreferenceChange,handleWifiStateChanged和 handleStateChanged,onPreferenceChange用來處理按下的Enbler鍵,它會調用 mWifiManager.setWifiEnabled(enable),另外兩個用來處理接受的消息事件。
在類的構造函數中,主要做了一下工作:初始化了mContext,mCheckBox,mWifimanager,并且初始化了一個 mIntentFilter變量,添加了三個動作,在構造函數的上面定義了一個廣播接收器,用來接收下層傳來的消息,并根據intent動作的類型調用相 應的處理函數,這個廣播接收器在onResum函數中被注冊。
public WifiEnabler(Context context, CheckBoxPreferencecheckBox) {
mContext= context;
mCheckBox = checkBox;
mOriginalSummary = checkBox.getSummary();
checkBox.setPersistent(false);
mWifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mIntentFilter= new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
// Theorder matters! We really should not depend on this. :(
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
}
這 里可以總結為:如果上層需要監聽或收到下層的消息,那么就要通過定義一個BroadcastReciever,并將它注冊,當然在接受到消息后應該有處理 消息的函數,然后在onReciever函數中根據消息調用相應的處理函數,這里的消息通知機制是Intent,在BroadcastReciever類 的onReciever函數的參數中可以看出。












評論