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) 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启动流程如下图所示:

2.1 状态变化

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

初始状态:mInitialState

|
          mDriverUnloadedState

|
      mWaitForP2pDisableState

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

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

3. 生产时自动打开Wifi

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

[cpp] 
view plain
copy

 

  1. /**
  2. * Check if Wi-Fi needs to be enabled and start
  3. * if needed
  4. *
  5. * This function is used only at boot time
  6. */
  7. public void checkAndStartWifi() {
  8. mAirplaneModeOn.set(isAirplaneModeOn());
  9. mPersistWifiState.set(getPersistedWifiState());
  10. /* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */
  11. boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
  12. Slog.i(TAG, "WifiService starting up with Wi-Fi " +
  13. (wifiEnabled ? "enabled" : "disabled"));
  14. setWifiEnabled(wifiEnabled); //强制设置为true
  15. mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
  16. makeWifiWatchdogStateMachine(mContext);
  17. }

android——wifi系统架构的更多相关文章

  1. Android WiFi系统架构【转】

    本文转载自:http://blog.csdn.net/liuhaomatou/article/details/40398753 在了解WIFI模块的系统架构之前.我心中就有一个疑问,那么Android ...

  2. Android WiFi系统【转】

    本文转载自:http://blog.csdn.net/gabbzang/article/details/10584587 一.wpa_supplicant是什么? wpa_supplicant本是开源 ...

  3. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  4. Android入门(二):Android的系统架构

    android的系统架构和其操作系统一样,采用了分层的架构.从架构图看,android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.   从技术方面看,An ...

  5. Android 的系统架构

    Android 的系统架构 Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所 ...

  6. Android的系统架构

    转自Android的系统架构 从上图中可以看出,Android系统架构为四层结构,从上层到下层分别是应用程序层.应用程序框架层.系统运行库层以及Linux内核层,分别介绍如下:     1)应用程序层 ...

  7. Android之系统架构

    Android 是Google开发的基于Linux平台的开源手机操作系统.它包括操作系统.用户界面和应用程序 —— 移动电话工作所需的全部软件,而且不存在任何以往阻碍移动产业创新的专有权障碍.Andr ...

  8. Android面试题3之描写叙述下Android的系统架构

    描写叙述下Android的系统架构: Android系统从下往上分为Linux内核层(linux kerner),执行库(runtime library),应用程序框架层,应用程序层 linuxker ...

  9. 「Android」系统架构概述

    目录: 1.Android系统架构 2.Android类库 3.四大组件 --------------------------------------------------------------- ...

随机推荐

  1. 从零开始学java(猜数字游戏)

    练练手不喜勿喷,看到什么学习什么第一次发博客格式就见见谅.....                                            2016-07-21 19:55:02 imp ...

  2. 《du命令》-linux命令五分钟系列之三

    本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...

  3. 原生js实现回到顶部

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  4. Poj 3667

    这是第一题线段树的区间合并的题: 这类的题用于求连续的最长长度什么的: 这题我看的是一篇比较不错的博客: 我把我的理解注释在代码里了: #include <iostream>#includ ...

  5. Overloads和Overrides在元属性继承上的特性

    元属性继承可以使用IsDefined函数进行判断,先写出结论 如果使用Overrides,则元属性可以继承,除非在使用IsDefined时明确不进行继承判断,如 pFunction.IsDefined ...

  6. html5系列.基础知识

    兼容性问题 创建一个html5页面 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  7. python读写Excel文件的函数--使用xlrd/xlwt

    python中读取Excel的模块或者说工具有很多,如以下几种: Packages 文档下载 说明 openpyxl Download | Documentation | Bitbucket  The ...

  8. 学会爱上iOS自动布局(Auto Layout) - 剑尖

    本文翻译自Yari Dareglia的LEARN TO LOVE AUTO LAYOUT文章先生们,女士们,让我们以正确的心态开始本教程吧:自动布局就是简单!我花了一段时间来掌握自动布局是如何工作的, ...

  9. bzoj2260: 商店购物 && 4349: 最小树形图

    Description Grant是一个个体户老板,他经营的小店因为其丰富的优惠方案深受附近居民的青睐,生意红火.小店的优惠方案十分简单有趣.Grant规定:在一次消费过程中,如果您在本店购买了精制油 ...

  10. 【Java】Java网络编程菜鸟进阶:TCP和套接字入门

    Java网络编程菜鸟进阶:TCP和套接字入门 JDK 提供了对 TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protoco ...