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 并发:
使用运行时资源叠加层逐个启用一个或多个函数(默认情况下处于停用状态)。
- Make-before-break:
config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
- 并发仅本地和互联网连接:
config_wifiMultiStaLocalOnlyConcurrencyEnabled
- 并发受限和互联网连接:
config_wifiMultiStaRestrictedConcurrencyEnabled
- 具有互联网连接的多个并发网络:
config_wifiMultiStaMultiInternetConcurrencyEnabled
- Make-before-break:
按照以下各部分的说明验证每个实现。
为了更好地支持 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。
验证仅本地和互联网连接
如需验证此功能,请使用以下 CTS 和 ACTS 测试:
- CTS:
MultiStaConcurrencyWifiNetworkSpecifierTest
- ACTS:
WifiStaConcurrencyNetworkRequestTest
并发受限和互联网连接
借助并发受限和互联网连接功能,设备可以连接到用户的主要 Wi-Fi 网络,以及仅限某些应用使用的受限 Wi-Fi 网络。
应用可以使用 WifiManager#isStaConcurrencyForRestrictedConnectionsSupported()
API 来检查设备是否支持此功能。
如需使设备能够连接到次要受限 Wi-Fi 网络,请按以下步骤操作:
添加 Wi-Fi 网络建议,方法是将
setOemPaid
或setOemPrivate
设置为 true。在
ConnectivityManager
中,提交具有相应功能的NetworkRequest
:- 为
setOemPaid
提交NET_CAPABILITY_OEM_PAID
功能 - 为
setOemPrivate
提交NET_CAPABILITY_OEM_PRIVATE
功能
- 为
当设备检测到与 OEM 付费/专用建议匹配的网络扫描结果时,便会自动连接到该网络作为第二个网络。
验证并发受限和互联网连接
如需验证此功能,请使用以下 CTS 和 ACTS 测试:
- CTS:
MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest
- ACTS:
WifiStaConcurrencyNetworkRequestTest
具有互联网连接的多个并发网络
“具有互联网连接的多个并发网络”功能适用于 Android 13 或更高版本,可允许设备并发连接到两个网络 (AP),这两个网络不受限制(所有应用均可访问),并提供互联网访问。
应用可以使用 WifiManager#isStaConcurrencyForMultiInternetSupported()
方法检查设备是否支持此功能。
如果支持此功能,特权应用可以使用 WifiManager#setStaConcurrencyForMultiInternetMode(int mode)
方法启用此功能。此功能具有以下模式:
WifiManager#WIFI_MULTI_INTERNET_MODE_DBS_AP
:限制与 DBS AP 的双频的并发连接。WifiManager#WIFI_MULTI_INTERNET_MODE_MULTI_AP
:连接到任意 AP,其中的各个连接使用不同的频段。WifiManager#WIFI_MULTI_INTERNET_MODE_DISABLED
:停用功能。
如需查询当前活跃的功能模式,请使用 WifiManager#getStaConcurrencyForMultiInternetMode()
方法。
启用此功能后,请按照以下步骤请求另一个提供互联网连接的 Wi-Fi 网络。
使用
WifiNetworkSpecifier.Builder
创建一个 Wi-Fi 网络说明符。使用setBand()
方法为说明符选择一个频段。请勿指定 SSID 或 BSSID 作为另一个网络,因为 Wi-Fi 框架选择了指定频段。使用
ConnectivityManager
创建一个具有NET_CAPABILITY_INTERNET
功能的NetworkRequest
。将说明符与
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% 次要