代码路径:
packages/modules/Wifi/service/java/com/android/server/wifi/scanner/WifiScanningService.java
启动:
在SystemServer中被启动。
实现接口:
具体实现是在:
WifiScanningServiceImpl,实现了 IWifiScanner.aidl 接口 :
Messenger getMessenger();
Bundle getAvailableChannels(int band, String packageName, String featureId);
boolean isScanning();
Messenger 的功能:
ClientHandler 用来处理客户端发过来的信息。
所有的wifi热点扫描信息存储在哪里:
扫描入口:
有3个状态机: mBackgroundScanStateMachine mSingleScanStateMachine mPnoScanStateMachine
以下主要研究 mSingleScanStateMachine
mSingleScanStateMachine :
有 mDefaultState ,DriverStartedState(mIdleState mScanningState) 几个状态。
默认是mDefaultState ,
WifiScanner.CMD_ENABLE 使 mDefaultState切换到 mIdleState 。
只要进入mIdleState 就尝试scan,只要条件满足, 就进入mScanningState 。
什么条件?:
WifiScanner.CMD_START_SINGLE_SCAN 使 mIdleState 切换到 mScanningState 。
收到 WifiScanner.CMD_DISABLE 进入 DefaultState 。
mWifiScanner.setScanningEnabled 进入 DefaultState 。
mWifiScanner.setScanningEnabled(enable);
回调接口注册:
WifiScanner 通过发送消息CMD_REGISTER_SCAN_LISTENER
来注册一个回调。
WifiScanner 通过发送消息CMD_DEREGISTER_SCAN_LISTENER
来反注册一个回调。
扫描结果通知:
在这里收到扫描结果:ScannerImplsTracker.ScanEventHandler#onScanStatus
发送 CMD_SCAN_RESULTS_AVAILABLE 到 mScanningState 1024行,
然后在 reportScanResults 1264行 调用 RequestInfo#reportEvent方法把结果发给调用者(消息类型为WifiScanner.CMD_SCAN_RESULT)。
同步获取扫描结果
WifiScanner#getSingleScanResults 通过发送
WifiScanner.CMD_GET_SINGLE_SCAN_RESULTS
调用 AsyncChannel#sendMessageSynchronously(int, int, int, java.lang.Object) 发送同步信息给
WifiScanningServiceImpl , 立即获得之前缓存的扫描结果。
客户端管理mClients :
必须先有客户端才能注册回调接口。
AsyncChannel.CMD_CHANNEL_FULL_CONNECTION
处理客户端连接事件,
将新的客户端放入 mClients中 。
AsyncChannel.CMD_CHANNEL_DISCONNECTED
去除这个客户端。
HalWifiScannerImpl
com.android.server.wifi.WifiNative
wificond:
The Wi-Fi framework also includes a stand-alone process, wificond, located at system/connectivity/wificond. The wificond process communicates with the Wi-Fi driver over standard nl80211 commands.