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

  1. 读取配置文件
  2. 初始化配置参数,驱动函数
  3. 让驱动scan当前所有的bssid
  4. 检查扫描的参数是否和用户设置的相符
  5. 如果相符,通知驱动进行权限和认证操作
  6. 连上AP

1.4 Wifi驱动模块

厂商提供的source,主要进行load firware和kernel的wireless进行通信,控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口或USB接口通信

1.5 Wifi工作步骤

  1. Wifi启动
  2. 开始扫描
  3. 显示扫描的AP
  4. 配置AP
  5. 连接AP
  6. 获取IP地址
  7. 上网

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