WiFi的几种扫描类型
后台-插件-广告管理-内容页头部广告(手机) |
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; // 回调接口- 1
- 2
- 3
- 4
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(); } } }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
前后台扫描
另外,还有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连接有一定的时间发送/接收数据,这个停留时间通常是几十毫秒。
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。
在线投稿:投稿 站长QQ:1888636
后台-插件-广告管理-内容页尾部广告(手机) |