Android WiFi系統引入了wpa_supplicant,它的整個WiFi系統以wpa_supplicant爲核心來定義上層用戶接口和下層驅動接口。整個WiFi系統架構以下圖所示:java
一切盡在上圖中,下面將對每部分進行詳細分析。android
由SystemServer啓動的時候生成的ConnecttivityService建立,負責啓動關閉wpa_supplicant,啓動和關閉WifiMonitor線程,把命令下發給wpa_supplicant以及更新WIFI的狀態。
網絡
處理其它模塊經過IWifiManager接口發送過來的遠端WiFi操做。架構
負責從wpa_supplicant接收事件通知。app
1) 讀取配置文件
2) 初始化配置參數,驅動函數
3) 讓驅動scan當前全部的bssid
4) 檢查掃描的參數是否和用戶設置的相符
5) 若是相符,通知驅動進行權限和認證操做
6) 連上APless
廠商提供的source,主要進行load firware和kernel的wireless進行通訊ide
主要控制硬件的GPIO和上下電,讓CPU和Wifi模組之間經過sdio接口或USB接口通訊函數
1) Wifi啓動
2) 開始掃描
3) 顯示掃描的AP
4) 配置AP
5) 鏈接AP
6) 獲取IP地址
7) 上網spa
1) Wifi Settings應用程序
packages/apps/Settings/src/com/android/settings/wifi.net
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
WifiService和wpa_supplicant啓動流程以下圖所示:
• 加載wifi驅動的狀態變化流程以下:
初始狀態:mInitialState
|
mDriverUnloadedState
|
mWaitForP2pDisableState
|
mDriverLoadingState(其enter中調用WifiNative.loadDriver)
• 啓動wpa_supplicant的狀態變化以下:
在DriverLoadedState狀態的processMessage中調用WifiNative.startSupplicant
在生產時, 默認Wifi是關閉的,若是須要默認打開,可修改wifiservice.java中的以下代碼: