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


    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接口通信;





  • 相关阅读:
    .net测试篇之Moq行为配置
    .net测试篇之Moq框架简单使用
    .net测试篇之测试神器Autofixture在几个复杂场景下的使用示例以及与Moq结合
    .net测试篇之测试神器Autofixture Generator使用与自定义builder
    .net测试篇之测试神器Autofixture基本配置一
    .net测试篇之单元测试/集成测试神器Autofixture
    .netcore持续集成测试篇之web项目验收测试
    .netcore持续集成测试篇之 .net core 2.1项目集成测试
    .netcore持续集成测试篇之MVC层单元测试
    .netcore持续集成测试篇之测试方法改造
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11745048.html
Copyright © 2020-2023  润新知