您好,欢迎来到百家汽车网。
搜索
您的当前位置:首页Android WiFi--系统架构

Android WiFi--系统架构

来源:百家汽车网

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.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中的如下代码: 

 

    /**
     * Check if Wi-Fi needs to be enabled and start
     * if needed
     *
     * This function is used only at boot time
     */
    public void checkAndStartWifi() {
        mAirplaneModeOn.set(isAirplaneModeOn());
        mPersistWifiState.set(getPersistedWifiState());
        /* Start if Wi-Fi should be enabled or the saved state indicates Wi-Fi was on */
        boolean wifiEnabled = shouldWifiBeEnabled() || testAndClearWifiSavedState();
        Slog.i(TAG, "WifiService starting up with Wi-Fi " +
                (wifiEnabled ? "enabled" : "disabled"));
        setWifiEnabled(wifiEnabled); //强制设置为true

        mWifiWatchdogStateMachine = WifiWatchdogStateMachine.
               makeWifiWatchdogStateMachine(mContext);

    }


 

 

 

 

 

 


 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baijiahaobaidu.com 版权所有 湘ICP备2023023988号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务