原文地址:http://www.cnblogs.com/snake-hand/p/3174650.html

1. 系统架构

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进行通信

1.5 Wifi电源管理模块

主要控制硬件的GPIO和上下电,让CPU和Wifi模组之间通过sdio接口或USB接口通信

1.6 Wifi工作步骤

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

1.7 Wifi模块代码

1) WifiSettings应用程序
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启动流程如下图所示:

2.1 状态变化

• 加载wifi驱动的状态变化流程如下:

初始状态:mInitialState

|
mDriverUnloadedState

|
mWaitForP2pDisableState

|
mDriverLoadingState(其enter中调用WifiNative.loadDriver)

• 启动wpa_supplicant的状态变化如下:
在DriverLoadedState状态的processMessage中调用WifiNative.startSupplicant

3. 生产时自动打开Wifi

在生产时,默认Wifi是关闭的,如果需要默认打开,可修改wifiservice.java中的如下代码:

  1. /**
  2. *CheckifWi-Fineedstobeenabledandstart
  3. *ifneeded
  4. *
  5. *Thisfunctionisusedonlyatboottime
  6. */
  7. publicvoidcheckAndStartWifi(){
  8. mAirplaneModeOn.set(isAirplaneModeOn());
  9. mPersistWifiState.set(getPersistedWifiState());
  10. /*StartifWi-FishouldbeenabledorthesavedstateindicatesWi-Fiwason*/
  11. booleanwifiEnabled=shouldWifiBeEnabled()||testAndClearWifiSavedState();
  12. Slog.i(TAG,"WifiServicestartingupwithWi-Fi"+
  13. (wifiEnabled?"enabled":"disabled"));
  14. setWifiEnabled(wifiEnabled);//强制设置为true
  15. mWifiWatchdogStateMachine=WifiWatchdogStateMachine.
  16. makeWifiWatchdogStateMachine(mContext);
  17. }

更多相关文章

  1. Android(安卓)下拉刷新仿微博刷新展示
  2. android5.1 以太网启动已经修改为静态IP
  3. [置顶] 我的Android进阶之旅------>启动Activity的标准Action和
  4. 查询adb时报error: cannot parse version string: kg01该如何处
  5. Android:Failed to allocate memory: 8;This application has requ
  6. 高度状态栏Android获取状态栏的高度高度状态栏
  7. Android(安卓)底部弹出Activity
  8. 自定义开关
  9. Android中用onSaveInstanceState保存Fragment状态的方法

随机推荐

  1. Android(安卓)TextView实现跑马灯效果
  2. Android开发之——布局实例
  3. 拖动条SeekBar的简单使用
  4. The method setOnClickListener(View.OnC
  5. Android(安卓)RelativeLayout 属性
  6. android_relative布局参数学习
  7. Android(安卓)图片加载图片_OOM异常解决
  8. Android出现Could not find ***.apk!错误
  9. Android音频实时传输与播放(三):AMR硬编码与
  10. android横屏竖屏