Wifi启动以及Wifi状态机

本文详细介绍了Android系统中WiFi服务的启动过程,包括ServerThread如何启动一系列服务,重点解析了WifiService和WifiStateMachine。WifiService是框架核心,处理应用层事件,而WifiStateMachine通过状态机管理WiFi状态,如驱动加载、wpa_supplicant启动、扫描AP等。每个WiFi状态对应一个内部类,通过消息处理进行状态切换,如加载驱动、启动扫描等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


第一部分 启动service

</pre><pre name="code" class="java">public class SystemServer {
	//...
	//...
    public static final void init2() {
        Slog.i(TAG, "Entered the Android system server!");
        Thread thr = new ServerThread();
        thr.setName("android.server.ServerThread");
        thr.start();
    }
}



init2()创建了一个线程,线程启动后在run中创建一系列的android services,将网络相关的services注册。

class ServerThread extends Thread {
    private static final String TAG = "SystemServer";
    
    public void run() {

    //...
        try {
        Slog.i(TAG, "Wi-Fi Service");
        wifi = new WifiService(context);
        ServiceManager.addService(Context.WIFI_SERVICE, wifi);
    } catch (Throwable e) {
        reportWtf("starting Wi-Fi Service", e);
    }

    try {
        Slog.i(TAG, "Connectivity Service");
        connectivity = new ConnectivityService(
                context, networkManagement, networkStats, networkPolicy);
        ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
        networkStats.bindConnectivityManager(connectivity);
        networkPolicy.bindConnectivityManager(connectivity);
        wifi.checkAndStartWifi();
        wifiP2p.connectivityServiceReady();
    } catch (Throwable e) {
        reportWtf("starting Connectivity Service", e);
    }
    //...
    }

}

第二部分 WifiService
WifiService的代码位置:
frameworks/base/services/java/com/android/server/WifiService.java

WifiService是整个框架的核心。当应用层触发了事件,会调用WifiService里面的方法来处理。
包括加载驱动,启动wpa_supplicant,扫描AP等。
但是实际上都是调用WifiStateMachine里面的方法发送消息。由WifiStateMachine里面描述wifi的内部类去处理消息。
在WifiService.java这个程序中,定义了WifiService这个类,以及它的构造函数(不懂java,不知道是不是叫构造),各种方法的实现。
在WifiService这个类的构造函数中,初始化了WifiStateMachine成员mWifiStateMachine,并重新写了广播事件的onReceiver函数。



第三部分 WifiStateMachine
WifiStateMachine的代码位置:
frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java
我们知道WifiService中最终都是调用WifiStateMachine里面的方法来实现的。在WifiStateMachine中,需要传递到
wpa_supplicant来实现wifi功能的命令都在这里做了定义。针对每一个wifi状态,都声明了一个内部类去描述。比如:加载驱动,开启wpa_supplicant等。在这个类中可以看到很多状态,

在WifiStateMachine这个类中定义了一些私有类成员,他们都是State类的。这些类成员有各自的初始化的函数。比如:
private State mDriverLoadingState = new DriverLoadingState();
驱动加载时的状态为mDriverLoadingState,它对应的处理类为DriverLoadingState,依次类推。

Class WifiStateMachine{

    //...
    //...
    
   /* Default parent state */
    private State mDefaultState = new DefaultState();
    /* Temporary initial state */
    private State mInitialState = new InitialState();
    /* Unloading the driver */
    private State mDriverUnloadingState = new DriverUnloadingState();
    /* Loading the driver */
    private State mDriverUnloadedState = new DriverUnloadedState();
    /* Driver load/unload failed */
    private State mDriverFailedState = new DriverFailedState();
    /* Driver loading */
    private State mDriverLoadingState = new DriverLoadingState();
    /* Driver loaded */
    private State mDriverLoadedState = new DriverLoadedState();
    /* Driver loaded, waiting for supplicant to start */
    private State mSupplicantStartingState = new SupplicantStartingState();
    /* Driver loaded and supplicant ready */
    private State mSupplicantStartedState = new SupplicantStartedState();
    /* Waiting for supplicant to stop and monitor to exit */
    private State mSupplicantStoppingState = new SupplicantStoppingState();
    /* Driver start issued, waiting for completed event */
    private State mDriverStartingState = new DriverStartingState();
    /* Driver started */
    private State mDriverStartedState = new DriverStartedState();
    /* Driver stopping */
    private State mDriverStoppingState = new DriverStoppingState();
    /* Driver stopped */
    private State mDriverStoppedState = new DriverStoppedState();
    /* Scan for networks, no connection will be established */
    private State mScanModeState = new ScanModeState();
    /* Connecting to an access point */
    private State mConnectModeState = new ConnectModeState();
    /* Fetching IP after network connection (assoc+auth complete) */
    private State mConnectingState = new ConnectingState();
    /* Connected with IP addr */
    private State mConnectedState = new ConnectedState();
    /* disconnect issued, waiting for network disconnect confirmation */
    private State mDisconnectingState = new DisconnectingState();
    /* Network is not connected, supplicant assoc+auth is not complete */
    private State mDisconnectedState = new DisconnectedState();
    /* Waiting for WPS to be completed*/
    private State mWaitForWpsCompletionState = new WaitForWpsCompletionState();

    /* Soft ap is starting up */
    private State mSoftApStartingState = new SoftApStartingState();
    /* Soft ap is running */
    private State mSoftApStartedState = new SoftApStartedState();
    /* Soft ap is running and we are waiting for tether notification */
    private State mTetheringState = new TetheringState();
    /* Soft ap is running and we are tethered through connectivity service */
    private State mTetheredState = new TetheredState();
    /* Waiting for untether confirmation to stop soft Ap */
    private State mSoftApStoppingState = new SoftApStoppingState();

    /* Wait till p2p is disabled */
    private State mWaitForP2pDisableState = new WaitForP2pDisableState();
    
    //...
    //...
}

//驱动正在加载的状态
class DriverLoadingState extends State{
        //...
        //...
}
//驱动已经加载的状态
class DriverLoadedState extends State {
        //...
        //...
}
//驱动正在卸载的状态
class DriverUnloadingState extends State {
        //...
        //...
}
//驱动已经卸载的状态
class DriverUnloadedState extends State {
        //...
        //...
}
//wpa_supplicant正在开启的状态
class SupplicantStartingState extends State {
        //...
        //...
}
//wpa_supplicant已经开启的状态
class SupplicantStartedState extends State {
        //...
        //...
}

还有很多类似的状态类,它们的状态不同,但是它们的结构却是相同的,每一个状态类都是由
State, enter, processMessage组成。以加载驱动为例:

class DriverLoadingState extends State {
    @Override
    public void enter() {
            //...
            //...
    }

    @Override
    public boolean processMessage(Message message) {
            //...
            //...
    }
}


WifiStateMachine使用sendMessage()来发送消息,使用transitionTo()来转换状态。
状态切换后就根据相应状态里面的processMessage来做一些相应的操作,然后再切换状态。

我们以开启wifi并开始扫描AP为例,(略过了通过WifiNative加载驱动那一段,在另一篇博文中有记录),看一下整个状态机的流程。





1.在WifiService这个类中,有一个方法 setWifiEnabled,这个就是开启wifi的接口
代码位置:frameworks/base/services/java/com/android/server/WifiService.java

    public synchronized boolean setWifiEnabled(boolean enable) {
        enforceChangePermission();
        if (DBG) {
            Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
        }

        if (enable) {
            reportStartWorkSource();
        }
        mWifiStateMachine.setWifiEnabled(enable); //注意这里,mWifiStateMachine是WifiService这个类中的一个成员。这里调用这个类成员的setWifiEnabled方法去使能wifi.
                                                  //所以这里我们要去WifiStateMachine去找个方法。
        /*
         * Caller might not have WRITE_SECURE_SETTINGS,
         * only CHANGE_WIFI_STATE is enforced
         */

        /* Avoids overriding of airplane state when wifi is already in the expected state */
        if (enable != mWifiEnabled) {
            long ident = Binder.clearCallingIdentity();
            persistWifiState(enable);
            Binder.restoreCallingIdentity(ident);
        }

        if (enable) {
            if (!mIsReceiverRegist
<think>我们正在处理关于WiFi状态机实现原理及代码流程解析的问题。根据提供的引用资料,我们将逐步解析WiFi状态机的实现原理和代码流程。 首先,WiFi状态机Android系统中是一个高层次的状态机,用于管理WiFi的开关、热点开关等状态。它由WifiController类实现,通过处理不同的消息(如CMD_WIFI_TOGGLED)来切换状态。 ### 1. **WiFi状态机概述** - WiFi状态机WifiController)负责管理WiFi的开启、关闭以及热点等状态转换[^1]。 - 状态机根据接收到的消息(如来自应用层的开关请求)进行状态转移,并触发相应的操作(如加载驱动、发送广播等)[^2][^3]。 ### 2. **WiFi启动流程** WiFi启动流程涉及多个组件,包括WifiServiceImpl、WifiController、WifiStateTracker和WifiMonitor等。以下是主要步骤: **步骤1:应用层调用setWifiEnabled(true)** - 在WifiServiceImpl中,setWifiEnabled()方法被调用,该方法会通过mWifiController发送CMD_WIFI_TOGGLED消息[^3]。 **步骤2:WifiController处理消息** - WifiController接收到CMD_WIFI_TOGGLED消息后,开始处理WiFi开启流程。首先进入`WifiController.DeviceActiveState`状态[^1]。 - 在状态转移过程中,会调用`setWifiState`方法发送广播通知应用层WiFi状态改变(例如WIFI_STATE_ENABLING),并加载JNI的WiFi驱动[^2]。 **步骤3:加载驱动和启动wpa_supplicant** - 驱动加载成功后,WifiController会收到CMD_LOAD_DRIVER_SUCCESS消息,然后启动wpa_supplicant(一个管理无线连接的后台进程)[^4]。 - WifiService负责启动wpa_supplicant,并创建WifiMonitor线程来监听来自底层的事件[^4]。 **步骤4:监听事件** - WifiMonitor线程启动后,会持续监听wpa_supplicant的事件(如扫描结果、连接状态等),并将这些事件传递给WifiStateTracker和WifiService处理[^4]。 ### 3. **关键类解析** - **WifiServiceImpl**:作为系统服务,提供应用层调用的接口(如setWifiEnabled),并将请求转化为消息发送给WifiController[^3]。 - **WifiController**:核心状态机,处理各种消息并管理状态转换[^1]。 - **WifiStateTracker**:跟踪WiFi状态变化,创建WifiMonitor接收底层事件[^4]。 - **WifiMonitor**:负责与wpa_supplicant通信,接收事件并通知上层[^4]。 ### 4. **状态转移示例** 以开启WiFi为例: - 初始状态:`WifiController.DeviceDisabledState`(WiFi关闭状态)。 - 收到CMD_WIFI_TOGGLED消息后,转移到`WifiController.DeviceActivatingState`,并开始加载驱动。 - 驱动加载成功(CMD_LOAD_DRIVER_SUCCESS)后,转移到`WifiController.DeviceActiveState`,并启动wpa_supplicant。 - 若加载失败,则返回`DeviceDisabledState`。 ### 5. **事件处理流程** - 底层事件(如扫描完成)由wpa_supplicant通过socket发送给WifiMonitor。 - WifiMonitor解析事件并通知WifiStateTracker,最终通过广播传递给应用层[^4]。 ### 总结 WiFi状态机通过消息驱动状态转移,协调多个组件完成WiFi启动、关闭和事件处理。其核心是WifiController状态机,它响应上层请求并控制底层驱动的加载和wpa_supplicant的启动。 §§相关问题§§ 1. WiFi状态机Android系统中具体有哪些状态? 2. 如何查看WiFi状态机在运行时的状态转移日志? 3. WiFi状态机如何处理并发消息(如同时收到开启和关闭WiFi的请求)? 4. 在WiFi启动过程中,如果驱动加载失败,系统会如何处理?</think>### WiFi状态机实现原理及代码流程解析 #### 一、实现原理 1. **状态机核心作用** WiFi状态机(`WifiController`)是Android WiFi模块的核心控制逻辑,负责管理WiFi开关、热点开关等高层次状态转换[^1]。其本质是**消息驱动的有限状态机**,通过处理异步消息(如`CMD_WIFI_TOGGLED`)触发状态迁移。 2. **关键设计特点** - **分层架构**: - 应用层调用`WifiServiceImpl.setWifiEnabled()` - 控制层由`WifiController`处理状态转换 - 底层通过`wpa_supplicant`管理驱动[^4] - **事件驱动**: 底层事件(如驱动加载完成)通过`WifiMonitor`监视线程传递到状态机[^4] - **线程模型**: 状态机运行在`WifiService`专用线程,通过`Handler`处理消息队列[^2] #### 二、代码流程解析(以开启WiFi为例) 1. **应用层触发** ```java // WifiServiceImpl.java public void setWifiEnabled(boolean enabled) { mWifiController.sendMessage(CMD_WIFI_TOGGLED); // 发送状态切换命令[^3] } ``` 2. **状态机处理(核心流程)** ```mermaid stateDiagram-v2 [*] --> DeviceDisabled DeviceDisabled --> DeviceActivating : CMD_WIFI_TOGGLED DeviceActivating --> DeviceActive : CMD_LOAD_DRIVER_SUCCESS DeviceActive --> ScanMode : CMD_SCAN_ACTIVE ``` - **状态转移步骤**: 1. 初始状态:`DeviceDisabledState`(WiFi关闭) 2. 收到`CMD_WIFI_TOGGLED`: - 切换到`DeviceActivatingState` - 调用`setWifiState(WIFI_STATE_ENABLING)`发送系统广播[^2] - 通过JNI加载WiFi驱动 3. 驱动加载成功(底层事件): - 接收`CMD_LOAD_DRIVER_SUCCESS` - 切换到`DeviceActiveState`(WiFi功能就绪) 4. 自动进入扫描模式: - 切换到`ScanState`启动热点扫描[^1] 3. **底层通信机制** - `WifiMonitor`线程通过Socket监听`wpa_supplicant`事件(如扫描结果、连接状态)[^4] - 事件转换为消息(如`SCAN_RESULTS`)传递给状态机处理 - 状态机通过`WifiNative`向`wpa_supplicant`发送控制命令 #### 三、关键组件协作 ```mermaid flowchart LR A[WifiServiceImpl] -->|发送指令| B(WifiController) B -->|驱动控制| C[WifiNative/JNI] C -->|操作驱动| D[wpa_supplicant] D -->|事件反馈| E[WifiMonitor] E -->|传递事件| B B -->|状态广播| F[系统广播] ``` #### 四、异常处理机制 - **驱动加载失败**: 状态机回退到`DeviceDisabledState`,发送`WIFI_STATE_UNKNOWN`广播[^2] - **并发请求冲突**: 通过消息队列顺序处理,仅响应最新有效状态 - **底层通信中断**: `WifiMonitor`触发`SUPPLICANT_CONNECTION_CHANGE`事件尝试重建连接[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值