android——wifi系統架構

1. 系統架構

        Android WiFi系統引入了wpa_supplicant,它的整個WiFi系統以wpa_supplicant爲核心來定義上層用戶接口和下層驅動接口。整個WiFi系統架構以下圖所示:java

   一切盡在上圖中,下面將對每部分進行詳細分析。android

1.1 WifiService   

     由SystemServer啓動的時候生成的ConnecttivityService建立,負責啓動關閉wpa_supplicant,啓動和關閉WifiMonitor線程,把命令下發給wpa_supplicant以及更新WIFI的狀態。
網絡

     處理其它模塊經過IWifiManager接口發送過來的遠端WiFi操做。架構

1.2 WifiMonitor

    負責從wpa_supplicant接收事件通知。app

1.3 wpa_supplicant

  1) 讀取配置文件
  2) 初始化配置參數,驅動函數
  3) 讓驅動scan當前全部的bssid
  4) 檢查掃描的參數是否和用戶設置的相符
  5) 若是相符,通知驅動進行權限和認證操做
  6) 連上AP
less

1.4 Wifi驅動模塊

     廠商提供的source,主要進行load firware和kernel的wireless進行通訊ide

1.5 Wifi電源管理模塊

     主要控制硬件的GPIO和上下電,讓CPU和Wifi模組之間經過sdio接口或USB接口通訊函數

1.6 Wifi工做步驟

  1) Wifi啓動
  2) 開始掃描
  3) 顯示掃描的AP
  4) 配置AP
  5) 鏈接AP
  6) 獲取IP地址
  7) 上網
spa

1.7 Wifi模塊代碼

   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


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中的以下代碼: 

 

[cpp]  view plain copy
 
  1. /** 
  2.  * Check if Wi-Fi needs to be enabled and start 
  3.  * if needed 
  4.  * 
  5.  * This function is used only at boot time 
  6.  */  
  7. public void checkAndStartWifi() {  
  8.     mAirplaneModeOn.set(isAirplaneModeOn());  
  9.     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. }  
相關文章
相關標籤/搜索