Android-WLAN

來自官網https://source.android.google.cn/devices/tech/connect/wifi-overview

1、WLAN 架構

Android 提供默認 Android 框架實現,其中包括對各種 WLAN 協議和模式的支持,這些協議和模式包括:

    WLAN 基礎架構 (STA)
    網絡共享模式或僅限本地模式下的 WLAN 熱點 (Soft AP)
    WLAN 直連(點對點)
    WLAN 感知 (NAN)
    WLAN RTT (IEEE 802.11mc FTM)

使用 WLAN 服務的應用通過 Binder 直接與各種 WLAN 服務進行通信。WLAN 服務在系統服務中運行,並通過 HIDL 與 HAL 進行通信。下圖顯示了 Android WLAN 堆棧的常規結構。

2、WLAN 服務 

WLAN 服務在系統服務中運行,這類服務位於 frameworks/opt/net/wifi 中。WLAN 服務通過 HIDL 與 WLAN HAL 進行通信。

WLAN 服務有很多種:

    WLAN 服務:用於控制 WLAN 基礎架構模式(包括 STA 和 AP)的主要機制。
    WLAN 點對點服務:管理 WLAN 直連模式。
    WLAN 感知服務:管理 WLAN 感知模式。
    WLAN RTT 服務:管理 IEEE 802.11mc FTM 功能。

此外,WLAN 框架還包括一個獨立的進程 wificond,此進程位於 system/connectivity/wificond 中。wificond 進程通過標準 nl80211 命令與 WLAN 驅動程序進行通信。

3、WLAN HAL

WLAN 框架具有三個 WLAN HAL 表面,分別由三個不同的 HIDL 軟件包表示:

    供應商 HAL:Android 專用命令的 HAL 表面。HIDL 文件位於 hardware/interfaces/wifi/1.x 中。
    客戶端 HAL:wpa_supplicant 的 HAL 表面。HIDL 文件位於 hardware/interfaces/supplicant/1.x 中。
    Hostapd HAL:hostapd 的 HAL 表面。HIDL 文件位於 hardware/interfaces/hostapd/1.x 中。

供應商 HAL

供應商 HAL 提供 Android 專用命令。供應商 HAL 對於基礎架構 Station (STA) 和 Soft AP (SAP) 模式的正常運行而言是可選的(不是必需的)。不過,對於 WLAN 感知和 WLAN RTT 服務而言,供應商 HAL 是必要 HAL

在 HIDL 之前(即 Android 8.0 版本之前),Android 使用的是現在稱爲“舊版 HAL”的 HAL 機制。Android 源代碼目前使用在舊版 HAL 之上運行的 shim 來提供 HIDL 默認實現。

舊版 HAL 標頭位於 hardware/libhardware_legacy/include/hardware_legacy/ 中。基於舊版 HAL 的實現位於 hardware/interfaces/wifi/1.x/default 中。
客戶端 HAL

客戶端 HAL 爲 wpa_supplicant 守護進程提供 HIDL 接口

wpa_supplicant 源代碼位於 external/wpa_supplicant_8/wpa_supplicant 中。提供 HIDL 接口的 wpa_supplicant 代碼位於 hidl 子目錄中。
Hostapd HAL

Hostapd HAL 爲 hostapd 守護進程提供 HIDL 接口

hostapd 源代碼位於 external/wpa_supplicant_8/hostapd 中。提供 HIDL 接口的 hostapd 代碼位於 hidl 子目錄中。
WLAN 多接口併發

不同的 Android 設備可以並行支持不同的 WLAN 接口組合。受支持的組合在 HAL 中定義,並提供給框架。規範格式在 android/hardware/interfaces/wifi/1.0/IWifiChip.hal 中定義。例如,一臺設備可以支持一個 STA 和一個 NAN(WLAN 感知)類型或點對點(WLAN 直連)類型的接口(但不能同時支持這兩種接口)。這可以表示爲:

[{STA} <= 1, {NAN,P2P} <= 1]

併發規範格式非常靈活,且是通用格式。它可以表示框架尚不支持的組合。要配置特定組合,請使用位於 device/<oem>/<device>/BoardConfig-common.mk 的 WIFI_HAL_INTERFACE_COMBINATIONS 編譯標記。或者,參考 HAL 具有適合多種組合的配置,這些配置可通過(舊版)編譯標記進行啓用。如需瞭解配置說明,請參閱:

    WLAN STA/AP 併發

Android 9 引入了可讓設備同時在 STA 和 AP 模式下運行的功能。對於支持雙頻併發 (DBS) 的設備,此功能讓一些新功能得以實現,例如在用戶想要啓用熱點 (softAP) 時不會中斷 STA WLAN。


    WLAN 感知

通過 Android 8.0 中新增的 WLAN 感知功能,支持設備可以直接使用 WLAN 感知協議發現其他設備、與其他設備進行互連,以及將覆蓋範圍擴展到其他設備(Android 9 中新增的功能),而無需連接到互聯網或移動網絡。此功能是基於 WLAN 聯盟 (WFA) WLAN 感知規範(2.0 版和 3.0 版)構建的,它支持在斷開網絡的情況下,在可信設備與應用之間輕鬆共享高吞吐量數據。

  WLAN 直連

WLAN 直連功能又稱“WLAN 點對點”,它允許支持設備直接使用 WLAN 直連協議發現其他設備並與之互連(無需連接到互聯網或移動網絡)。此功能是基於 Wi-Fi 聯盟 (WFA) WLAN 直連規範構建的,它支持在斷開網絡的情況下,在可信設備與應用之間共享高吞吐量數據。

WLAN RTT (IEEE 802.11mc)

Android 9 中的 WLAN 往返時間 (RTT) 功能允許設備測量與其他支持設備的距離:無論它們是接入點 (AP) 還是 WLAN 感知對等設備(如果設備支持 WLAN 感知功能)。此功能基於 IEEE 802.11mc 協議,使應用能夠使用準確性更高的定位功能和增強的感知功能。

3、wifiservice 類圖

Hal層交互類圖:

4 wifi打開流程

4.1 setWifiEnable-frameworks(WifiManager)

app調用frameworks的WifiManager的setWifiEnabled去切換wifi,通過Aidl binder通信調用到wifiService的WifiServiceImpl。然後WifiServiceImpl發送消息CMD_WIFI_TOGGLED,給到狀態機DeviceActiveState來切換wifi

 4.2 enterClientMode 進入ClientModeActiveState狀態

DeviceActiveState狀態進入時,會調用狀態機WifiStateMachinePrime發送CMD_START_CLIENT_MODE消息,進入ClientModeActiveState狀態

4.3  ClientModeActiveState狀態中makeClientModeManager,調用WifiNative處理請求

ClientModeActiveState狀態中調用WifiInjector makeClientModeManager,然後調用ClientModeActiveManager的start,發送CMD_START消息, 調用WifiNative的setupInterfaceForClientMode 設置啓動client

 4.4 調用到Hal層處理wifi 打開請求

WifiNative中啓動StartVendorHal,通過IWifi的HIDL通信調用到wifi的start 然後加載驅動;

調用startSupplicant啓動supplicant

調用createStaIface創建Iface

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章