android上wifi扫描间隔

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有很多信道,所以主动扫描时,一般会在所有频段中不停切换以在不同的信道上扫描,大体流程如下:

    1. 选择某个信道: 初始信道通常是当前连接的信道或者上一次成功连接的信道。

      选定信道后,并不会立即进行探测,而是要等候接收到一个数据帧(indication of an imcoming frame)或者ProbeDelay 计时器 到期。

      如果在ProbeDelay时间内接收到了数据帧,证明该信道有人在使用,因此可以立即进行Probe Request.

      当然,ProbeDelay计时器到期后,也会立即发送Probe Request,主要是不能一直等下去。

      ProbeDelay计时器的主要作用是控制扫描频率,同时也能节省电池寿命。

    2. 发送 Probe Request

    3. 等待 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扫描就在WifiConnectivityManagerstartConnectivityScan()

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连接有一定的时间发送/接收数据,这个停留时间通常是几十毫秒。

 


 

posted @ 2023-11-13 18:24  petercao  阅读(324)  评论(0编辑  收藏  举报