1. Android Wi-Fi架构介绍
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
- 读取配置文件
- 初始化配置参数,驱动函数
- 让驱动scan当前所有的bssid
- 检查扫描的参数是否和用户设置的相符
- 如果相符,通知驱动进行权限和认证操作
- 连上AP
1.4 Wifi驱动模块
厂商提供的source,主要进行load firware和kernel的wireless进行通信,控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口或USB接口通信
1.5 Wifi工作步骤
- Wifi启动
- 开始扫描
- 显示扫描的AP
- 配置AP
- 连接AP
- 获取IP地址
- 上网
1.6 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
2. WifiService和wpa_supplicant启动流程
WifiService和wpa_supplicant启动流程如下图所示:
•加载wifi驱动的状态变化流程如下:
mInitialState(初始状态) | mDriverUnloadedState | mWaitForP2pDisableState | mDriverLoadingState (其中enter中调用WfiNative.loadDriver)
• 启动wpa_supplicant的状态变化如下:
在DriverLoadedState状态的processMessage中调用WifiNative.startSupplicant
• 启动wpa_supplicant的状态变化如下:
在DriverLoadedState状态的processMessage中调用WifiNative.startSupplicant