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