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

摘要:
WifiService负责启动和关闭wpa_Support,启动和关闭WifiMonitor监视线程,并向wpa_Ssupport发出命令,而WifiMonitor负责接收事件通知。具体流程图如下:1.Wifi模块WirelessSettings的启动(启用)配置为在初始化期间通过WifiEnabler处理Wifi按钮,privatevoinitToggles(){mWifiEnabler=newWifiEnabler,然后启动wpa_Support,然后通过WifiStateTracker启动WifiMonitor中的监控线程。

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 接收事件通知。

具体流程图如下:

2系统启动后的 wifi加载 过程图解第1张


一: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();
}

具体流程如下流程图所示:
2系统启动后的 wifi加载 过程图解第2张

2系统启动后的 wifi加载 过程图解第3张

二:查找热点(AP)

上一节(第三部分:Wifi开启)中讲到Wifi模块开启后会对外发送WIFI_STATE_CHANGED_ACTION。WifiLayer中注册了Action的Receiver。
当WifiLayer收到此Action后开始scan的流程,具体如下:
2系统启动后的 wifi加载 过程图解第4张























当wpa_supplicant 处理完SCAN 命令后,它会向控制通道发送事件通知扫描完成,从wifi_wait_for_event 函数会接收到该事件,由此WifiMonitor 中的MonitorThread 会被执行来处理这个事件:
2系统启动后的 wifi加载 过程图解第5张

三:配置 AP 参数


当用户在 WifiSettings 界面上选择了一个AP 后,会显示配置AP 参数的一个对话框:
2系统启动后的 wifi加载 过程图解第6张

四:Wifi连接

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

2系统启动后的 wifi加载 过程图解第7张

五:IP地址的配置


流程如图:
2系统启动后的 wifi加载 过程图解第8张


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

2系统启动后的 wifi加载 过程图解第9张

 Wifi驱动模块

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

 Wifi电源管理模块

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





免责声明:文章转载自《2系统启动后的 wifi加载 过程图解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇httpd三种MPM的原理剖析动态创建DataGrid的模版列(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android视图控件架构分析之View、ViewGroup

在Android中,视图控件大致被分为两类,即ViewGroup和View,ViewGroup控件作为父控件,包含并管理着子View,通过ViewGroup和View便形成了控件树,各个ViewGoup对象和View对象就是控件树中的节点。在控件树中,以树的深度来遍历查找对应的控件元素,同时,上层控件负责子控件的测量与绘制,并传递交互事件。 Android...

asp.net简单实现利用HttpModule实现防sql注入

关于sql注入,已经被很多人讨论过了。这篇没有新意功能也不够通用,nnd,不想引起口水,就是觉得简单而且思路有参考性才贴出来。1、新建一个类,实现IHttpModule接口 代码     public class SqlHttpModule : IHttpModule    {        public void Dispose()        { ...

spring注解(Component、依赖注入、生命周期、作用域)

1、注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2、@Component 取代<bean  class="">,@Component 取代<bean id="" class=""> (1)创建一个类(该类与dao层无联系,是一个单独的类) @Component("studentService") pub...

SpringMVC加载配置Properties文件的几种方式

最近开发的项目使用了SpringMVC的框架,用下来感觉SpringMVC的代码实现的非常优雅,功能也非常强大, 网上介绍Controller参数绑定、URL映射的文章都很多了,写这篇博客主要总结一下SpringMVC加载配置Properties文件的几种方式 1.通过context:property-placeholde实现配置文件加载   1.1、在...

swift3.0 CoreGraphics绘图-实现画板

swift3.0对绘图的API进行了优化,看起来更swift了。 看下UI的构造。设置画笔粗细、清空面板和保存到本地 下面直接看画板文件 这里我做的比较复杂,记录触摸到的每个点,再连成路径,其实直接用可变路径CGMutablePath可变路径就可以实现。 成员变量 public var lineWidth:CGFloat = 1 file...

DropDownList无刷新级联下拉(固定级联),Jquery获取JOSN数据

1.HTML页面 <td align="left">                                <asp:DropDownList ID="ddlOne" runat="server">                                </asp:DropDownList>      ...