随时扫描功能:在wifi关闭的时候,底层并没有真正意义上的关闭,而是继续扫描,只是不再列表上显示罢了。
现在分析随时扫描功能开启后wifi打开、关闭、显示扫描结果的流程。在这里需要关注两个状态机:WifiController、WifiStateMachine。
这两个状态机都是在wifiservice中创建的,当第一次打开wifi之前,两个状态机的状态为:WifiStateMachine(ScanModeState)、WifiController(StaDisabledWithScanState)
在WifiController中会做如下操作:
mWifiStateMachine.setSupplicantRunning(true);
mWifiStateMachine.setOperationalMode(WifiStateMachine.SCAN_ONLY_WITH_WIFI_OFF_MODE);
mWifiStateMachine.setDriverStart(true);
WifiStateMachine 在接收到 CMD_START_SUPPLICANT命令后,会去做打开连接wpa_supplicant的操作,并跳转到SupplicantStartingState状态,接收到 SUP_CONNECTION_EVENT事件,处理完成后跳转到 DriverStartedState,最后会跳转到 DisconnectedState状态(mOperationalMode 初始为 CONNECT_MODE)
接下来setOperationalMode在DisconnectedState中处理,最后会跳转到ScanModeState状态。
当打开wifi时正确的处理流程是这样的:
WifiController会走到DeviceActiveState中下发设置扫描模式命令,并且为CONNECT_MODE,WifiStateMachine在接收到该命令后,会将wifiState置为WIFI_STATE_ENABLED,并且从ScanModeState状态跳到DisconnectedState,此时下发扫描命令并接收返回结果显示即可。
当关闭wifi时正确的处理流程是这样的:
WifiController接收CMD_WIFI_TOGGLED命令在StaEnabledState状态下处理,跳转到StaDisabledWithScanState,下发设置扫描模式命令,并且为SCAN_ONLY_WITH_WIFI_OFF_MODE,WifiStateMachine在接收到该命令后,在DisconnectedState状态下处理该命令,会将wifiState置为WIFI_STATE_ENABLED,跳转到ScanModeState。
在关闭wifi的时候,Native层接收处理DISCONNECT命令处理过慢,导致WifiStateMachine状态没有切换到ScanModeState,还在ConnectedState状态,设置扫描命模式令被deferMessage掉;等下次打开wifi的时候,处于ConnectedState状态的WifiStateMachine跳转到DisconnectingState处理上次被defer掉的设置扫描模式命令(SCAN_ONLY_WITH_WIFI_OFF_MODE),再次defer该命令,当跳转到DisconnectedState状态时,处理CMD_SET_OPERATIONAL_MODE命令,此时设置模式为SCAN_ONLY_WITH_WIFI_OFF_MODE,将wifiState置为WIFI_STATE_DISABLED,状态机跳转到 ScanModeState,关闭了wifi。
此时两个状态机的状态为:WifiController处于DeviceActiveState,WifiStateMachine处于ScanModeState状态;wifiState为WIFI_STATE_DISABLED。
当再次打开wifi的时候,WifiController处于DeviceActiveState并处理CMD_WIFI_TOGGLED命令,但是实际上什么都不做,不会下发扫描设置命令使,而WifiStateMachine也不会跳转到DisconnectedState,处于ScanModeState状态,所以wifi列表不会显示热点。
本文探讨了Wi-Fi随时扫描功能的实现原理,重点关注了WifiController和WifiStateMachine两个状态机在开启、关闭Wi-Fi过程中的角色。在Wi-Fi关闭时,实际并未完全关闭,而是保持扫描状态。在打开Wi-Fi时,正确流程包括设置扫描模式并开始扫描;关闭Wi-Fi时,由于处理延迟可能导致状态机未及时切换,影响重新打开时的行为。最后,当Wi-Fi再次打开时,由于特定状态机配置,Wi-Fi列表不会显示热点。
6095

被折叠的 条评论
为什么被折叠?



