文章目錄
- 1.2 WifiMonitor
- 1.3 wpa_supplicant
- 1.4 Wifi驅動模組
- 1.5 Wifi電源管理模組
- 1.6 Wifi工作步驟
- 1.7 Wifi模組代碼
- 2.1 狀態變化
1. 系統架構
Android WiFi系統引入了wpa_supplicant,它的整個WiFi系統以wpa_supplicant為核心來定義上層使用者介面和下層驅動介面。整個WiFi系統架構如所示:
一切盡在中,下面將對每部分進行詳細分析。
1.1 WifiService
由SystemServer啟動的時候產生的ConnecttivityService建立,負責啟動關閉wpa_supplicant,啟動和關閉WifiMonitor線程,把命令下發給wpa_supplicant以及更新WIFI的狀態。
處理其它模組通過IWifiManager介面發送過來的遠端WiFi操作。
1.2 WifiMonitor
負責從wpa_supplicant接收事件通知。
1.3 wpa_supplicant
1) 讀取設定檔
2) 初始化配置參數,驅動函數
3) 讓驅動scan當前所有的bssid
4) 檢查掃描的參數是否和使用者佈建的相符
5) 如果相符,通知驅動進行許可權和認證操作
6) 連上AP
1.4 Wifi驅動模組
廠商提供的source,主要進行load firware和kernel的wireless進行通訊
1.5 Wifi電源管理模組
主要控制硬體的GPIO和上下電,讓CPU和Wifi模組之間通過sdio介面或USB介面通訊
1.6 Wifi工作步驟
1) Wifi啟動
2) 開始掃描
3) 顯示掃描的AP
4) 配置AP
5) 串連AP
6) 擷取IP地址
7) 上網
1.7 Wifi模組代碼
1) Wifi Settings應用程式
packages/apps/Settings/src/com/android/settings/wifi
2) Wifi Framework
frameworks/base/wifi/java/android/net/wifi (UI通過android.net.wifi package
發送命令給wifi.c)
frameworks/base/core/java/android/net(更高一級的網路管理)
frameworks/base/services/java/com/android/server
3) Wifi JNI
frameworks/base/core/jni/android_net_wifi_Wifi.cpp
4) Wifi Hardware (wifi管理庫)
hardware/libhardware_legacy/wifi/wifi.c
5) wpa_supplicant(wifi tool)
external/wpa_supplicant8
(1) wpa_client (產生庫libwpaclient.so)
external/wpa_supplicant_8/wpa_supplicant/src/common/wpa_ctrl.c
(2) wpa_server (產生守護進程wpa_supplicant)
external/wpa_supplicant_8/wpa_supplicant/main.c
6) Wifi kernel
net/wireless drivers/wlan_xxx arch/arm/mach-xxx/wlan_pm.c
2. WifiService和wpa_supplicant啟動流程
WifiService和wpa_supplicant啟動流程如所示:
2.1 狀態變化
• 載入wifi驅動的狀態變化流程如下:
初始狀態:mInitialState
|
mDriverUnloadedState
|
mWaitForP2pDisableState
|
mDriverLoadingState(其enter中調用WifiNative.loadDriver)
• 啟動wpa_supplicant的狀態變化如下:
在DriverLoadedState狀態的processMessage中調用WifiNative.startSupplicant
3. 生產時自動開啟Wifi
在生產時, 預設Wifi是關閉的,如果需要預設開啟,可修改wifiservice.java中的如下代碼:
/** * Check if Wi-Fi needs to be enabled and start * if needed * * This function is used only at boot time */ public void checkAndStartWifi() { mAirplaneModeOn.set(isAirplaneModeOn()); mPersistWifiState.set(getPersistedWifiState()); /* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */ boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState(); Slog.i(TAG, "WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled")); setWifiEnabled(wifiEnabled); //強制設定為true mWifiWatchdogStateMachine = WifiWatchdogStateMachine. makeWifiWatchdogStateMachine(mContext); }