android——wifi系統架構(zt)

  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

  1. WifiService和wpa_supplicant啓動流程
    WifiService和wpa_supplicant啓動流程如下圖所示:

這裏寫圖片描述

2.1 狀態變化
• 加載wifi驅動的狀態變化流程如下:

初始狀態:mInitialState

                     |
      mDriverUnloadedState

                     |
  mWaitForP2pDisableState

                     |

mDriverLoadingState(其enter中調用WifiNative.loadDriver)

• 啓動wpa_supplicant的狀態變化如下:
在DriverLoadedState狀態的processMessage中調用WifiNative.startSupplicant

  1. 生產時自動打開Wifi
    在生產時, 默認Wifi是關閉的,如果需要默認打開,可修改wifiservice.java中的如下代碼:
01./** 
02. * Check if Wi-Fi needs to be enabled and start 
03. * if needed 
04. * 
05. * This function is used only at boot time 
06. */  
07.public void checkAndStartWifi() {  
08.    mAirplaneModeOn.set(isAirplaneModeOn());  
09.    mPersistWifiState.set(getPersistedWifiState());  
10.    /* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */  
11.    boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();  
12.    Slog.i(TAG, "WifiService starting up with Wi-Fi " +  
13.            (wifiEnabled ? "enabled" : "disabled"));  
14.    setWifiEnabled(wifiEnabled); //強制設置爲true  
15.  
16.    mWifiWatchdogStateMachine = WifiWatchdogStateMachine.  
17.           makeWifiWatchdogStateMachine(mContext);  
18.  
19.} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章