Android 12 引入了 Wi-Fi STA/STA 并发,允许设备同时连接到两个 Wi-Fi 网络。此可选功能启用以下功能。
- Make-before-break :设备在断开现有连接之前先连接到新的 Wi-Fi 网络。这会在 Wi-Fi 网络之间切换时实现更平滑的转换
- 仅本地和互联网并发连接:设备连接到仅本地网络,而不会中断设备的主要互联网提供连接。
- 并发受限和互联网连接:设备连接到受限网络(仅适用于某些特权应用程序),而不会中断设备的主要互联网连接。
此页面描述了启用此功能时的设备行为以及设备制造商和供应商的实施细节。
执行
设备必须支持以下功能才能实现 Wi-Fi STA/STA 并发:
Wi-Fi 芯片或固件必须支持两个并发 STA 连接。固件必须支持两种连接的所有通道和频段组合。为避免性能问题,我们建议使用支持 2x2+2x2 DBS 的 Wi-Fi 芯片。
设备必须支持供应商 HAL 版本 1.5中的以下 API
-
IWifiChip.setMultiStaPrimaryConnection()
-
IWifiChip.setMultiStaUseCase()
-
HAL Wi-Fi 接口组合必须有两个并发的 STA 接口,使用诸如
[{STA} <= 2, ...]
之类的规范格式公开。更多信息,请参阅Wi-Fi 多接口并发。
如果满足这些先决条件,则通过执行以下操作实现 Wi-Fi STA/STA 并发:
使用运行时资源覆盖单独启用一项或多项功能(默认禁用)。
- MakeBeforeBreakEnabled :
config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
- 并发本地和互联网连接:
config_wifiMultiStaLocalOnlyConcurrencyEnabled
- 并发受限和互联网连接:
config_wifiMultiStaRestrictedConcurrencyEnabled
- MakeBeforeBreakEnabled :
按照下面各自部分中的说明验证每个实现。
为了更好地支持 Wi-Fi STA/STA 并发,我们建议 OEM 定制的框架和应用使用NetworkCallback#onCapabilitiesChanged()
方法而不是WifiManager#getConnectionInfo()
方法,该方法仅返回单个网络的WifiInfo
,在 Android 12 中已弃用. 有关更多信息,请参阅用于点对点连接的 Wi-Fi 网络请求 API 。
先做后断
make-before-break功能允许设备连接到新的 Wi-Fi 网络,同时保持现有的 Wi-Fi 网络连接,只有在成功连接到新的 Wi-Fi 网络并可以访问互联网时才断开与旧网络的连接。
make-before-break 用例解决了 Android 11 或更低版本中的以下问题,其中设备必须先断开与现有 Wi-Fi 网络的连接,然后才能连接到新网络(break-before-make)。
连接到新网络时,设备可能会发现它保存的 Wi-Fi 密码不正确,或者新网络无法访问互联网。这会迫使设备切换回旧网络,从而导致大量时间没有 Wi-Fi 连接。
旧网络突然断开,这意味着所有套接字都关闭了。应用程序通常不会对突然失去连接做出良好反应,这可能会导致用户在几秒钟内没有互联网连接,直到新连接完全建立。
默认网络更改两次,从旧的 Wi-Fi 网络更改为蜂窝网络,然后从蜂窝网络更改为新的 Wi-Fi 网络。这会导致应用对网络更改做出两次反应。该设备还必须花费很短的时间使用蜂窝数据。
make-before-break 流程仅用于由操作系统启动的自动 Wi-Fi 网络切换。用户启动的网络交换机使用传统的先断后合流程,即在连接新网络之前,之前的网络完全断开连接。在某些情况下,即使在操作系统启动的自动切换中也会使用先断后合流程,例如,在两个都配置为使用工厂 MAC 地址的网络之间切换时。
应用可以使用WifiManager#isMakeBeforeBreakWifiSwitchingSupported()
API 检查设备是否支持此用例。
验证先通后断
要验证您的实施,请触发自动 Wi-Fi 网络切换(通过确保信号强度比当前连接的网络更强的网络可用)并验证设备在连接到新网络时是否保持现有连接。要查看两个 Wi-Fi 接口的状态并验证两者是否已连接,请使用以下命令。
adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status
如果新网络没有连接,设备会尝试连接到网络,同时保持与现有网络的连接,并在检测到新网络没有互联网时中止尝试。然后设备继续使用现有连接作为主要 Wi-Fi 网络。
并发本地和互联网连接
并发的仅限本地和互联网连接功能允许设备与主要的互联网提供网络同时连接到仅限本地的连接,例如与物联网设备的连接。此功能改善了直接连接到物联网设备(例如相机)时的用户体验,这可以通过 Android 10 中添加的WifiNetworkSpecifier
API 实现。
在 Android 11 及更低版本中,设备在连接到 IoT 设备时会断开与主要 Wi-Fi 网络的连接,从而导致互联网连接中断(除非设备具有其他可用的传输类型,例如蜂窝数据)。
应用可以使用WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported()
API 检查设备是否支持此功能。
有关 Android 12 中并发仅限本地和互联网连接功能的更改的更多信息,请参阅用于点对点连接的 Wi-Fi 网络请求 API 。
验证仅限本地和 Internet 连接
要验证此功能,请使用以下 CTS 和 ACTS 测试:
- CTS:
MultiStaConcurrencyWifiNetworkSpecifierTest
- 行动:
WifiStaConcurrencyNetworkRequestTest
并发受限和互联网连接
并发受限和互联网连接功能允许设备同时连接到用户的主要 Wi-Fi 网络和仅适用于选定应用程序的受限 Wi-Fi 网络。
应用可以使用WifiManager#isStaConcurrencyForRestrictedConnectionsSupported()
API 检查设备是否支持此功能。
要使设备能够连接到辅助受限 Wi-Fi 网络,请执行以下步骤:
添加Wi-Fi 网络建议,
setOemPaid
或setOemPrivate
设置为 true。在
ConnectivityManager
中,提交具有相应功能的NetworkRequest
:-
NET_CAPABILITY_OEM_PAID
用于setOemPaid
-
NET_CAPABILITY_OEM_PRIVATE
用于setOemPrivate
-
当设备检测到与 OEM 付费或 OEM 私人建议匹配的网络的扫描结果时,它会自动连接到它作为辅助网络。
验证并发受限和 Internet 连接
要验证此功能,请使用以下 CTS 和 ACTS 测试:
- CTS:
MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest
- 行动:
WifiStaConcurrencyNetworkRequestTest
供应商 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% 次要。
-