Wi-Fi STA/STA 并发

Android 12 引入了 Wi-Fi STA/STA 并发功能,使设备可同时连接到两个 Wi-Fi 网络。此可选功能支持以下功能。

  • Make-before-break:设备会在断开现有连接之前连接到新的 Wi-Fi 网络。这使得 Wi-Fi 网络之间的切换更加顺畅
  • 并发仅本地和互联网连接:设备会连接到仅限本地的网络,而不中断设备的主要互联网提供连接。
  • 并发受限和互联网连接:设备会连接到受限网络(仅适用于某些特权应用),而不会中断设备的主要互联网连接。
  • (Android 13 或更高版本)具有互联网连接的多个并发网络:设备连接到两个不受限制的网络,这两个网络对所有应用均可用,并提供互联网连接。

本页将介绍启用此功能时设备的行为,以及设备制造商和供应商的实现详情。

实现

设备必须满足以下要求才能实现 Wi-Fi STA/STA 并发:

  • Wi-Fi 芯片或固件必须支持两个并发 STA 连接。固件必须支持两个连接的所有信道和频段组合。为避免出现性能问题,我们建议使用支持 2x2+2x2 DBS 的 Wi-Fi 芯片。

  • 设备必须支持在 IWifiChip 的 AIDL 或 HIDL 实现中使用以下 API。

    • IWifiChip.setMultiStaPrimaryConnection(String ifName)
    • IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
  • HAL Wi-Fi 接口组合必须使用规范格式(如 [{STA} <= 2, ...])公开的两个并发 STA 接口。如需了解详情,请参阅 Wi-Fi 多接口并发

如果满足这些前提条件,则通过执行以下操作来实现 Wi-Fi STA/STA 并发:

  1. 使用运行时资源叠加层逐个启用一个或多个函数(默认情况下处于停用状态)。

    • Make-before-break: config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
    • 并发仅本地和互联网连接config_wifiMultiStaLocalOnlyConcurrencyEnabled
    • 并发受限和互联网连接config_wifiMultiStaRestrictedConcurrencyEnabled
    • 具有互联网连接的多个并发网络config_wifiMultiStaMultiInternetConcurrencyEnabled
  2. 按照相应部分的说明验证每个实现。

为了更好地支持 Wi-Fi STA/STA 并发,我们建议 OEM 自定义的框架和应用使用 NetworkCallback#onCapabilitiesChanged() 方法,而不是 WifiManager#getConnectionInfo() 方法,因为后者仅返回 WifiInfo 且在 Android 12 中已废弃。如需了解详情,请参阅适用于点对点连接的 Wi-Fi 网络请求 API

Make-before-break

借助 make-before-break 功能,设备可在保持现有 Wi-Fi 连接的同时,连接到新的 Wi-Fi 网络,只有在成功连接到新 Wi-Fi 并能上网后,才断开旧网络的连接。

在 Android 11 或更低版本中,make-before-break 用例解决了以下问题,即设备必须在链接到新网络之前断开现有的 Wi-Fi 网络 (break-before-make)。

  • 连接到新网络时,设备可能会发现其保存的 Wi-Fi 密码不正确或新网络无法访问互联网。这会迫使设备切换回旧网络,导致在很长一段时间内无法连接 Wi-Fi。

  • 旧网络会突然断开连接,这意味着所有套接字都会被关闭。应用通常无法对连接突然中断做出反应,并且可能会导致用户在未完全建立新连接之前,经历几秒钟无法连接到互联网的情况。

  • 默认网络会进行两次更改,从旧 Wi-Fi 网络切换到移动网络,然后再从移动网络更改为新 Wi-Fi 网络。这会导致应用对网络更改做出两次响应。此外,设备还必须在短时间内使用移动数据网络。

Make-before-break 流程仅适用于操作系统启动的自动 Wi-Fi 网络切换。用户发起的网络切换使用旧版 break-before-make 流程,即在连接新网络之前,先前的网络已完全断开连接。在某些情况下,即使在操作系统发起的自动切换中(例如,在两个网络之间切换时,都配置使用出厂 MAC 地址)都会使用 break-before-make 流程。

应用可以使用 WifiManager#isMakeBeforeBreakWifiSwitchingSupported() API 检查设备是否支持此用例。

验证 make-before-break

如需验证您的实现,请触发自动 Wi-Fi 网络切换(请确保存在信号强度高于已连网络的网络),并验证设备能否在保持现有连接的同时,连接到新网络。如需查看这两个 Wi-Fi 接口的状态并验证它们是否已连接,请使用以下命令。

adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status

如果没有连接新网络,设备将尝试连接到网络,同时保持与现有网络的连接,并在检测到新网络未连接到互联网时中止连接的尝试。然后,设备会继续将现有连接用作主要 Wi-Fi 网络。

并发仅本地和互联网连接

借助并发仅本地和互联网连接功能,设备可以连接到仅本地网络(例如连接到 IoT 设备)以及提供互联网的主要网络。此功能可改善直接连接到 IoT 设备(如摄像头)的用户体验,可以通过 Android 10 中添加的 WifiNetworkSpecifier API 来实现。

在 Android 11 及更低版本中,设备在连接到 IoT 设备时会断开与主要 Wi-Fi 网络的连接,从而导致互联网连接中断(除非设备具有其他可用的传输类型,例如:移动数据网络)。

应用可以使用 WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported() API 检查设备是否支持此功能。

如需详细了解 Android 12 中并发仅本地和互联网连接功能的变更,请参阅适用于点对点连接的 Wi-Fi 网络请求 API

验证仅本地和互联网连接

如需验证此功能,请使用 MultiStaConcurrencyWifiNetworkSpecifierTest CTS 测试。

并发受限和互联网连接

借助并发受限和互联网连接功能,设备可以同时连接到用户的主要 Wi-Fi 网络,以及仅限某些应用使用的受限 Wi-Fi 网络。

应用可以使用 WifiManager#isStaConcurrencyForRestrictedConnectionsSupported() API 来检查设备是否支持此功能。

如需使设备能够连接到次要受限 Wi-Fi 网络,请按以下步骤操作:

  1. 添加 Wi-Fi 网络建议,方法是将 setOemPaidsetOemPrivate 设置为 true。

  2. ConnectivityManager 中,提交具有相应功能的 NetworkRequest

当设备检测到与 OEM 付费/专用建议匹配的网络扫描结果时,便会自动连接到该网络作为第二个网络。

验证并发受限和互联网连接

如需验证此功能,请使用 MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest CTS 测试:

具有互联网连接的多个并发网络

“具有互联网连接的多个并发网络”功能适用于 Android 13 或更高版本,可允许设备并发连接到两个网络 (AP),这两个网络不受限制(所有应用均可访问),并提供互联网访问。

应用可以使用 WifiManager#isStaConcurrencyForMultiInternetSupported() 方法检查设备是否支持此功能。

如果支持此功能,特权应用可以使用 WifiManager#setStaConcurrencyForMultiInternetMode(int mode) 方法启用此功能。此功能具有以下模式:

如需查询当前活跃的功能模式,请使用 WifiManager#getStaConcurrencyForMultiInternetMode() 方法。

启用此功能后,请按照以下步骤请求另一个提供互联网连接的 Wi-Fi 网络。

  1. 使用 WifiNetworkSpecifier.Builder 创建一个 Wi-Fi 网络说明符。使用 setBand() 方法为说明符选择一个频段。请勿指定 SSID 或 BSSID 作为另一个网络,因为 Wi-Fi 框架选择了指定频段。

  2. 使用 ConnectivityManager 创建一个具有 NET_CAPABILITY_INTERNET 功能的 NetworkRequest

  3. 将说明符与 NetworkCallback 实例一同添加到网络请求中以跟踪请求的状态,并向 ConnectivityManager 发出请求。如果扫描结果中存在某个包含所请求频段的已保存网络,且已成功连接到该网络,则会在回调对象上调用 NetworkCallback.onAvailable()

验证具有互联网连接的多个并发网络

如需验证此功能,请使用以下 CTS 测试:

  • CTS:MultiStaConcurrencyMultiInternetWifiNetworkTest

Wi-Fi 芯片供应准则

对于 Wi-Fi 芯片供应商,请遵循以下准则来支持 Wi-Fi STA/STA 并发。

Wi-Fi 芯片必须支持双并发 STA 连接。这意味着它支持以下各项:

  • 每个 STA 接口都有一个可由框架编程的唯一 MAC 地址。
  • 次要 STA 接口可以动态创建和销毁。
  • 每个 STA 可以连接到不同 SSID(同一频段或不同频段内)。
  • 每个 STA 可以连接到同一 SSID(同一频段或不同频段内)。这两个 STA 绝不能连接到同一 BSSID。

关键功能必须基于每个接口运行,而且只能在主接口上使用。下面列出了这些关键功能:

  • 至少必须在主接口(使用 IWifiChip.setMultiStaPrimaryConnection() 进行设置)上支持漫游。如果两个接口均支持漫游,则在一个连接上的决定不得与第二个并发连接发生冲突。例如,一个接口不得漫游到另一个连接的 BSSID。

  • 必须至少在主接口(使用 IWifiChip.setMultiStaPrimaryConnection() 设置)上支持 APF(以及其他分流,例如 ARP 和 NS)。

  • 链路层统计数据必须基于每个接口运行。

以下是针对不同并发场景的推荐 Wi-Fi 芯片实现:

  • Wi-Fi 芯片必须让框架使用以下某个常量调用 IWifiChip.setMultiStaUseCase() 来指定当前功能:

    • DUAL_STA_TRANSIENT_PREFER_PRIMARY:指定 Make-Before-Break 功能。主连接的质量必须优先于次级连接的质量。
    • DUAL_STA_NON_TRANSIENT_UNBIASED:指定并发仅本地和互联网连接或并发受限和互联网连接功能。两个连接的质量必须具有相同的优先级。
  • 由于双并发 STA 可能会产生 MCC、SCC 和 DBS 操作模式,因此当框架调用 IWifiChip.setMultiStaUseCase() 来指示该功能时,供应商实现必须选择最佳的无线装置配置。一般准则如下:

    • 首选 2x2+2x2 DBS(如果有)。
    • 由于连接质量受到过度影响,请尽可能避免使用 1x1+1x1 DBS。相反,建议您选用 MCC。
    • 必须由驱动程序或固件配置 MCC 占空比,以实现各种功能。框架不会直接设置 MCC 占空比,而是使用 StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent 查询此信息。
    • 如果使用 MCC,我们建议主次连接之间的占空比如下:

      • DUAL_STA_TRANSIENT_PREFER_PRIMARY:70% 主要/30% 次要
      • DUAL_STA_NON_TRANSIENT_UNBIASED:50% 主要/50% 次要