https://lishiwen4.github.io/wifi/android-wifi-scan-interval
1.android wifi 循环扫描
在android系统中, 在不同的场景下, 不同的功能模块会发起循环扫描
大部分扫描功能需要调用WPAS的接口来完成, 可先阅读 “WPAS” 分类中的 “WPAS 中的循环扫描”
2. 亮屏时Wifi Settings界面的扫描
只要打开wifi, 进入wifi settings界面, 无论是否连接了AP, 都会开始定时扫描
相关源码为 “pacakes/app/Settings/src/com/android/settings/wifi/WifiSettings.java” Wifi Setting 中由 class Scanner来负责发起扫描, calss Scaner继承了Handlerl来实现定时扫描:
- 延时向自己发送一个空message
- 接收到message后, 立即调用WifiManager执行一次扫描, 然后再次延时向自己发送空message
- 向自己发送空message的延时值即为扫描的间隔, 默认为10s (int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;)
其向自己延时(WIFI_RESCAN_INTERVAL_MS)发送message, 接收到mesage后, 执行一次扫描来实现定时扫描, 其提供了3个接口
Scanner.pause() //移除还未被发送的空message, 中止定时扫描
Scanner.resume() //向自己发送一个空的message, 恢复扫描
Scanner.forceScan() //移除还未被发送的的空message, 并立即发送一个空message, 导致马上进行一次扫描
- 在wifi Settings的onpause()阶段, 中止定时扫描
- 在wifi Settings的onresume()阶段, 恢复定时扫描
- 点击wifi Settings菜单的scan选项, 则进行一次强制扫描
- 关闭wifi会中止定时扫描
- 打开wifi会恢复定时扫描
- 在wifi 处于DHCP状态时, 中止定时扫描, 变为其它状态后再恢复定时扫描
3.亮屏时 wpa_supplicant 的周期扫描
在亮屏, 未连接wifi, WPAS中保存了AP的情况下,WPAS会周期扫描,android上调整间隔为15s, 可在 frameworks/base/core/res/res/values/config.xml 文件中修改。
<integer translatable="false" name="config_wifi_supplicant_scan_interval">15000</integer>
4. 灭屏时 PNO 扫描
如果未连接AP, 但是保存有AP, 在灭屏后, 会开启PNO扫描, 标准的PNO扫描机制为
- 以10秒时间间隔扫描6次
- 以20秒扫描间隔扫描6次
- 以40秒时间间隔扫描6次
- 以80秒时间间隔扫描6次
- 以160秒时间间隔扫描6次
- 以后将以320秒时间间隔进行扫描
5. autojoin 扫描
如果打开了autojoin机制, 且保存了AP, 无论是亮屏还是灭屏, autojoin会周期扫描, 间隔为10s
6. batch scan
batch scan 通过从applicantion offloading scan 到 wifi firmware 来达到节省电力的目标, applicantion可以请求wifi firmware在指定的时间间隔内发起指定次数的扫描, wifi firmware根据限定的频率持续进行扫描并且缓存扫描结果, 定期将扫描结果返回给 ACPU
batch scan 需要wifi driver 和 wifi firmware支持, wifiManager提供了接口来使用batch scan,例如:
- requestBatchedScan()
- isBatchedScanSupported()
- stopBatchedScan()
- getBatchedScanResults()
- pollBatchedScan()
batch scan主要应用于wifi 辅助定位
Android关闭屏幕,但不休眠
https://blog.csdn.net/curly_x/article/details/114732270
updatePowerStateLocked()方法
private void updatePowerStateLocked() {
...
//updateSuspendBlockerLocked(); //注释掉这一行就可以了
WiFi之PNO功能
PNO 即Preferred Network Offload,用于系统在休眠的时候连接WiFi
此功能是在Android3.1加入的
代码:
当屏幕状态有变化的时候,会调用handleScreenStateChanged(),如果pno功能有enable,就会配置pno,然后再scan.
private void handleScreenStateChanged(boolean screenOn)
{
//亮屏的情况
if (screenOn) {
enableBackgroundScan(false);
setScanAlarm(false);
clearBlacklist();
fullBandConnectedTimeIntervalMilli
= mWifiConfigStore.wifiAssociatedShortScanIntervalMilli.get();
// In either Disconnectedstate or ConnectedState,
// start the scan alarm so as to enable autojoin
//如果当前是连接着的
if (getCurrentState() == mConnectedState
&& allowFullBandScanAndAssociated()) {
//PNO功能是否开启了
★★★refs:
Wi-Fi PNO扫描流程(Android P)
https://cloud.tencent.com/developer/article/1662008
Android 8 wifi 扫描时间间隔
https://www.cnblogs.com/helloworldtoyou/p/9667229.html
WiFi的几种扫描类型
https://blog.csdn.net/weixin_40588186/article/details/132997514
WiFi的扫描用于发现附近可用网络。一般可以分为两种主要类型: 主动扫描(active scan) 和 被动扫描(passive scan)。
主被动扫描
-
主动扫描 (Active Scan)
发起主动扫描时,WiFi设备会主动发送
Probe Request
帧,这些请求会广播到附近所有可见的WiFi AP,AP会以Probe Response
响应,并在响应帧内提供网络信息。由于WiFi有很多信道,所以主动扫描时,一般会在所有频段中不停切换以在不同的信道上扫描,大体流程如下:
-
选择某个信道: 初始信道通常是当前连接的信道或者上一次成功连接的信道。
选定信道后,并不会立即进行探测,而是要等候接收到一个数据帧(indication of an imcoming frame)或者ProbeDelay 计时器 到期。
如果在ProbeDelay时间内接收到了数据帧,证明该信道有人在使用,因此可以立即进行
Probe Request
.当然,ProbeDelay计时器到期后,也会立即发送
Probe Request
,主要是不能一直等下去。ProbeDelay计时器
的主要作用是控制扫描频率,同时也能节省电池寿命。 -
发送
Probe Request
-
等待
Probe Response
这里涉及到等待时间的问题,究竟主动扫描时需要在每个信道上停留多长时间。这里涉及到两个时间相关的参数: MinChannelTime 和 MaxChannelTime。
至少需要等待MinChannelTime的时间。这段时间内如果介质并不忙碌,表示无网络存在,因此可以跳到下一个信道;否则继续等待,直到MaxChannelTime。
-
-
被动扫描 (Passive Scan)
被动扫描时,WiFi设备不会发送
Probe Request
,而只是监听无线信道上的数据包。它记录下附近的 AP 发送的 Beacon 帧(包含网络信息)。设备会首先选择一个初始信道,然后依次选择不同的信道进行监听。
AP会周期性的广播beacon帧,包含了网络的信息:如网络的SSID、信号强度、加密类型等。
Passive Scan时也需要确定在每个信道上停留的时间,这个时间通常称为"channel dwell time"(信道停留时间)或 “channel scan interval”(信道扫描间隔),可以是固定的,也可以是动态的:
-
固定信道停留时间
设备可能在每个信道上停留一定的时间,例如 100 毫秒,然后切换到下一个信道。这种方式简单且容易实现,但可能无法适应不同环境的需求
-
自适应信道停留时间
这种策略可能会根据环境中的网络密度、信道负载和其他因素来动态调整信道停留时间。例如,在拥挤的信道上,设备可能会停留更长时间以确保检测到 Beacon 帧。
-
不管是被动扫描还是主动扫描,都会有一个信道列表,设备需要在这些信道上执行扫描,那么我们其实也可以仅扫描感兴趣的信道,而不是全信道扫描。这里就引出来两个概念: **单通道扫描(Single-Channel Scanning)**和 全通道扫描(Full-Channel Scanning),很容易理解,就不解释了。
PNO 扫描
对于移动设备,另一个比较重要的概念是PNO扫描(Preferred Network Offload): 它也是主动扫描的一种。
PNO(Preferred Network Offload)扫描是一种用于降低移动设备功耗的 Wi-Fi 扫描技术,它允许设备在后台智能地寻找和连接首选的 Wi-Fi 网络。而不是去全频道的搜索。如果搜索到首选网络,一般会自动连接(auto-join).
Android平台上,在以下几种情况下会发起新的PNO扫描
- 设备移动状态发生变化
根据设备的移动状态(device mobility state)来调整PNO扫描的时间间隔. 详情参考WifiConnectivityManager.java
的 setDeviceMobilityState()
当移动状态发生改变时,并不会主动发起PNO扫描;只会修改当前PNO扫描的间隔时间。
当前默认配置的间隔时间如下:
移动状态(config_wifiMovingPnoScanIntervalMillis): 20s
静止状态(config_wifiStationaryPnoScanIntervalMillis): 60s
- 外部主动发起PNO扫描
setExternalPnoScanRequest 外部主动发起PNO扫描,可设置的参数有:
List<WifiSsid> ssids; // ssid列表
int[] frequencies; // 信道列表
Executor executor; // 回调的executor
PnoScanResultsCallback callback; // 回调接口
clearExternalPnoScanRequest
上面两个接口仅支持Android T,目前无人使用。
- ConnectivityScan
实际上,只有在 Screen OFF 并且 WiFi Disconnected 的情况下系统才会主动会发起PNO扫描,如果设备移动状态发生变化只可能修改PNO扫描的间隔时间。
而发起PNO扫描就在WifiConnectivityManager
的startConnectivityScan()
private void startConnectivityScan(boolean scanImmediately) {
// ... ...
if (mScreenOn) {
startPeriodicScan(scanImmediately);
} else {
if (mWifiState == WIFI_STATE_DISCONNECTED && !mPnoScanStarted) {
startDisconnectedPnoScan();
}
}
}
前后台扫描
另外,还有Foreground Scan
和 Background Scan
两个概念:
-
Foreground Scan
一般指当前未连接到任何AP 的情况下发起的扫描
-
Background Scan
一般指当前已经连接到某个AP,但是为了保证更好的网络质量,某些情况发起的扫描叫background scan。
具体是前台扫描还是后台扫描,通常是firmware决定的,跟上层没什么关系。
乍一看,Foreground Scan 和 Background Scan 除了使用场景差异,具体的扫描动作并没有不同。其实这里的细节都是由wifichip处理(firmware)。Foreground Scan时,在扫描完一个信道后,会立即跳到下一信道;但是对于Background Scan则不同,由于当前已经连接到某个AP,所以在切换扫描信道前,会返回已连接AP 的主信道停留一段时间,以便WiFi连接有一定的时间发送/接收数据,这个停留时间通常是几十毫秒。
标签:scan,wifi,扫描,AP,信道,PNO,android From: https://www.cnblogs.com/bluestorm/p/17829826.html