网站首页 波兰世界杯 世界杯球星排名 直播吧世界杯
首页 >> 波兰世界杯
android上wifi扫描间隔

android上wifi扫描间隔

https://lishiwen4.github.io/wifi/android-wifi-scan-interval 1.android wifi 循环扫描 在android系统中, 在不同的场景下, 不同的功能模块会发起循环扫描 大部分...

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 文件中修改。

15000

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