您现在的位置是:首页 > 技术教程 正文

WiFi的几种扫描类型

admin 阅读: 2024-03-17
后台-插件-广告管理-内容页头部广告(手机)

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

Foreground Scan WiFi Chip 1. Start Foreground Scan 2.1 Scan channel 1 2.2 Scan channel 2 ... 2.x Scan channel N Foreground Scan WiFi Chip Backround Scan WiFi Chip 1. Start Background Scan 2.1 Scan channel 1 2.2 Back to channel H (已连接WiFi的信道) 2.3 Scan channel 2 2.4 Back to channel H ... 2.x-1 Scan channel N 2.x Back to channel H Backround Scan WiFi Chip
标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜