Android 7.0 WifiMonitor工作流程分析

时间:2024-03-29 07:39:11

在wifi启动扫描的分析过程中,出现了多次WifiMonitor的操作,在此分析一下这个函数是如何工作的。
在Android的Wifi体系中,WifiMonitor承担着分发来自wpa_supplicant底层事件的任务。当上层下达Wifi的扫描、连接等指令后, 底层驱动以及wpa_s进行实际的扫描、连接操作,操作完成后会向上层反馈一个event,通知framework扫描是否结束、连接是否成功。
1.WifiMonitor的初始化
在WifiStateMachine的构造函数中获取WifiMonitor的实例,并且在WifiStateMachine的构造函数中注册了一系列的handler。

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

 从启动扫描流程中可知,在启动过程中会调用startMonitoring(),开始监听从底层上报的消息。

2.startMonitoring()

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

为了监听wpa_supplicant的事件,需要先建立与wpa_s的消息通道,这一步调用WifiNative.connectToSupplicant()实现。
如果是第一次进行监听mConnected为false,进入else分支。先建立与wpa_s的消息通道,建立成功后会向WifiStateMachine发送SUP_CONNECTION_EVENT消息,通知Wifi状态机。随后,开启事件监听线程:new MonitorThread(mWifiNative, this).start():

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

 这里我们假设事先下发的是一个wifi扫描的指令,wpa_s反馈event通知wifi扫描的结果,根据实现的一些匹配规则,最后进入handleEvent()函数,此处event是SCAN_RESULTS,向WifiStateMachine发送SCAN_RESULTS_EVENT消息,告知它扫描已经结束,可以去读取扫描结果了。这样,处理流程就用返回到Wifi状态机中。WifiStateMachine收到此消息后,调用WifiStateMachine::setScanResults()方法从wpa_s读取扫描结果,并向外界发送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION广播通知应用。此时一些注册过该广播的应用,例如手机中的Setting app,就能通过调用WifiManager::getScanResults()读取扫描结果了。至此,一个简单的WifiMonitor分发事件的流程结束,其他类型事件的分发跟此过程相似。

Android 7.0 WifiMonitor工作流程分析

Android 7.0 WifiMonitor工作流程分析

 至此,一个简单的上层流程分析结束了。
---------------------