2系统启动后的 wifi加载 过程-图解

原创 2012年03月26日 09:13:01

Wifi模块的初始化:

系统启动 首先加载init.rc,这个文件 会加载所有service在 SystemServer 启动的时候,会生成一个ConnectivityService 的实例,


try {
Log.i(TAG, "Starting Connectivity Service.");
ServiceManager.addService(Context.CONNECTIVITY_SERVICE, new
ConnectivityService(context));
} catch (Throwable e) {
Log.e(TAG, "Failure starting Connectivity Service", e);
}


ConnectivityService 的构造函数会创建WifiService,

if (DBG) Log.v(TAG, "Starting Wifi Service.");
mWifiStateTracker = new WifiStateTracker(context, handler);
WifiService wifiService = new WifiService(context, mWifiStateTracker);
ServiceManager.addService(Context.WIFI_SERVICE, wifiService);


WifiStateTracker 会创建WifiMonitor 接收来自底层的事件,WifiService 和WifiMonitor 是整
个模块的核心。WifiService 负责启动关闭wpa_supplicant、启动关闭WifiMonitor 监视线程
和把命令下发给wpa_supplicant,而WifiMonitor 则负责从wpa_supplicant 接收事件通知。

具体流程图如下:



一:Wifi模块的启动(使能)


WirelessSettings 在初始化的时候配置了由WifiEnabler 来处理Wifi 按钮,

private void initToggles() {
mWifiEnabler = new WifiEnabler(this,
                                  (WifiManager) getSystemService(WIFI_SERVICE),
                                  (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));


当用户按下Wifi 按钮后,Android 会调用WifiEnabler 的onPreferenceChange,再由WifiEnabler
调用WifiManager 的setWifiEnabled 接口函数,通过AIDL,实际调用的是WifiService 的
setWifiEnabled 函数,WifiService 接着向自身发送一条MESSAGE_ENABLE_WIFI 消息,在
处理该消息的代码中做真正的使能工作:首先装载WIFI 内核模块(该模块的位置硬编码为
"/system/lib/modules/wlan.ko" ), 然后启动wpa_supplicant ( 配置文件硬编码为
"/data/misc/wifi/wpa_supplicant.conf"),再通过WifiStateTracker 来启动WifiMonitor 中的监视
线程。

private boolean setWifiEnabledBlocking(boolean enable) {
    final int eventualWifiState = enable ? WIFI_STATE_ENABLED :WIFI_STATE_DISABLED;
    updateWifiState(enable ? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING);
    if (enable) {
            if (!WifiNative.loadDriver()) {
                  Log.e(TAG, "Failed to load Wi-Fi driver.");
                  updateWifiState(WIFI_STATE_UNKNOWN);
                  return false;
            }
    if (!WifiNative.startSupplicant()) {
           WifiNative.unloadDriver();
           Log.e(TAG, "Failed to start supplicant daemon.");
           updateWifiState(WIFI_STATE_UNKNOWN);
           return false;
     }
     mWifiStateTracker.startEventLoop();
}
     // Success!
     persistWifiEnabled(enable);
     updateWifiState(eventualWifiState);
     return true;
}


当使能成功后,会广播发送WIFI_STATE_CHANGED_ACTION 这个Intent 通知外界WIFI
已经成功使能了。WifiEnabler 创建的时候就会向Android 注册接收
WIFI_STATE_CHANGED_ACTION,因此它会收到该Intent,从而开始扫描。

private void handleWifiStateChanged(int wifiState) {
if (wifiState == WIFI_STATE_ENABLED) {
loadConfiguredAccessPoints();
attemptScan();
}

具体流程如下流程图所示:




二:查找热点(AP)

上一节(第三部分:Wifi开启)中讲到Wifi模块开启后会对外发送WIFI_STATE_CHANGED_ACTION。WifiLayer中注册了Action的Receiver。
当WifiLayer收到此Action后开始scan的流程,具体如下:
























当wpa_supplicant 处理完SCAN 命令后,它会向控制通道发送事件通知扫描完成,从wifi_wait_for_event 函数会接收到该事件,由此WifiMonitor 中的MonitorThread 会被执行来处理这个事件:


三:配置 AP 参数


当用户在 WifiSettings 界面上选择了一个AP 后,会显示配置AP 参数的一个对话框:


四:Wifi连接

具体流程参见以下流程图:


五:IP地址的配置


流程如图:


整个wifi启动 到 使用的流程图: 

 Wifi驱动模块

厂商提供的source,主要进行load firmware 和 kernel的wireless进行通信;

 Wifi电源管理模块

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





版权声明:本文为博主原创文章,未经博主允许不得转载。

基于rk3288平台android5.1系统的wifi流程分析 ---- 打开wifi,扫描热点

基于rk3288平台android5.1系统的wifi流程分析 ---- 打开wifi,扫描热点
  • ballack_linux
  • ballack_linux
  • 2017年09月26日 14:46
  • 237

Android Wi-Fi源码分析之WifiService操作Wi-Fi(一):分析Wifi.c中的wifi_load_driver()函数

Wi-Fi源码分析之WifiService操作Wi-Fi(一)分析Wifi.c中的wifi_load_driver()函数int wifi_load_driver() { ALOGD("===...
  • u013256622
  • u013256622
  • 2017年06月06日 11:15
  • 917

Android -- Wifi启动流程分析

Android -- Wifi启动流程分析 Android网络各个模式中,Wifi应该是目前最常用的一种网络方式了;下面就简单介绍下Android中Wifi的启动流程。 当我在Setting菜单里点击...
  • csdn_of_coder
  • csdn_of_coder
  • 2016年05月30日 21:01
  • 6147

Wifi模块解析和启动流程

http://blog.csdn.net/ylyuanlu/article/details/7711433 模块解析和启动流程 WIFI整体框架如图所示: 首先,用户程序使用WifiManage...
  • taiyuanwuyin
  • taiyuanwuyin
  • 2017年10月24日 16:45
  • 128

wifi 交互过程

http://hi.baidu.com/vivi985019/item/32f51e0a5516e3f9a11034f7 无线AP(Access Point)会周期性的广播Beacon报文,告诉附近...
  • u010978044
  • u010978044
  • 2013年07月23日 17:04
  • 1847

wifi连接流程

在平时的android开发中,经常会用到wifi相关操作,其实就应用而言,系统都是通过WifiManager对应的api来进行对应的操作 我们可以从源码的frameworks/base/api目录中...
  • mockingbirds
  • mockingbirds
  • 2016年11月27日 22:05
  • 1582

wifi通信过程的研究--(1)Wifi基本属性介绍

一、 Wifi基本属性介绍 (一)、WLAN WLAN是Wireless LAN(无线局域网)的简称,基于IP的的通信,能提供一定范围内的高速数据连接,一般采用2.4GHz或5.8GHz无线频段(...
  • djd1234567
  • djd1234567
  • 2015年04月28日 14:48
  • 1656

wifi通信过程的研究--(2)Wifi传输认证过程

二、 Wifi传输认证过程 (一)、终端与路由器认证过程 1、无线扫描 用户接入过程首先需要通过主动/被动扫描,再通过认证和关联 两个过程后才能和AP建立连接。 2、认证过程 为防止非法用户...
  • djd1234567
  • djd1234567
  • 2015年04月28日 15:23
  • 2275

系统启动后的 wifi 加载过程

============================ Wifi 启动代码流程 ==================== 1、系统启动 首先加载init.rc,这个文件 会加载所有...
  • vichie2008
  • vichie2008
  • 2014年06月26日 14:35
  • 496

[android]WIFI热点启动流程分析

WIFI热点是用软件实现AP的功能,让你的移动设备可以作为一个路由,让别的站点链接,事实上需要硬件以及驱动的支持才能真正的实现这个功能。 在android系统的设置中会有如下界面, 主...
  • chen381051010
  • chen381051010
  • 2014年11月18日 21:35
  • 2263
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2系统启动后的 wifi加载 过程-图解
举报原因:
原因补充:

(最多只允许输入30个字)