Wi-Fi STA/STA 并发

Wi-Fi模式组合:

Wi-Fi STA/AP/P2P 三种模式共组合出以下5种并发模式:

1.Wi-Fi STA/STA 并发 (手机可同时连到一个AP的两个不同频段或完全不同的两个AP)

2.Wi-Fi STA/AP  并发 (手机连到一个AP的同时,对外分享出一个SAP)

3.Wi-Fi STA/P2P 并发(手机在连接一个AP的同时进行P2P连接,如cast/wifi direct)

4.Wi-Fi AP/AP 并发 (手机同时连接一个热点的同时对外提供2.4G/5G/6G的SAP)

5.Wi-Fi AP/P2P 并发 (手机同时对外分享一个热点的同时进行P2P连接, 如cast/wifi direct)

ps:以上都需要芯片能力支持,以及modem/AP driver/hal接口的支持。


 

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 芯片。

  • 设备必须支持供应商 HAL 1.5 版本中的以下 API

    • IWifiChip.setMultiStaPrimaryConnection()
    • IWifiChip.setMultiStaUseCase()
  • 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

 

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

“具有互联网连接的多个并发网络”功能适用于 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% 次要

 

refs:

Wi-Fi STA/STA 并发
https://source.android.com/docs/core/connect/wifi-sta-sta-concurrency?hl=zh-cn

Wi-Fi STA/AP 并发
https://source.android.com/docs/core/connect/wifi-sta-ap-concurrency?hl=zh-cn

Wi-Fi 多接口并发
https://source.android.com/docs/core/connect/wifi-hal?hl=zh-cn#wi-fi_multi-interface_concurrency

/1.5/IWifiChip.hal
https://cs.android.com/android/platform/superproject/main/+/main:hardware/interfaces/wifi/1.5/IWifiChip.hal

小米开放平台双WiFi适配说明
https://www.yimenapp.com/kb-yimen/12508/

“小米双wifi接口列表v1.0”下载链接:http://f4.market.xiaomi.com/download/MiPass/036a45c2758ccbb709f58f5eefc4a6134f943e679/小米双wifi接口列表v1.0.xlsx

WLAN 感知
https://developer.android.com/guide/topics/connectivity/wifi-aware?hl=zh-cn

 

//////其他idea

根据用户策略开启双网卡,实现双网卡并存通信的网络架构是本申请的核心部分。下面将详细讲述关于移动网络和wifi网络是如何开启的,及两个网络如何并存。

双网卡启动过程:
应用层分别调用这两个函数:启用移动数据(setMobileDataEnabled)和启用WIFI(setWifiEnable)实现移动网络和wifi网络的开启。下面简要说明移动网络、wifi网络开启过程。

开启移动网络(LTE/3G)流程说明:

当开启移动网络时,应用程序会调用连接管理器启用移动数据(ConnectivityManager.setMobileDataEnable)方法,但是这个方法被定义为私有(private)类型,系统级的应用才能调用。本申请实施例中通过如下方式实现用户级的应用调用:通过java中的反射就可以实现调用到连接管理器(ConnectivityManager)类中的启动移动数据(setMobileDataEnable)函数。使能移动网络后,接着会发送一条设置移动数据事件(EVENT_SET_MOBILE_DATA)消息,连接服务(ConnectivityService)的消息处理单元(handleMessage)将接收并处理这条消息,在处理该消息的代码中做真正的使能工作:连接接入点(APN),通过动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)获得IP地址,配置rmnet_usb0使得移动网络状态为已连接,至此移动网络使能完成。

开启wifi流程说明:

当开启wifi时,应用程序会调用Wifi服务(WifiService)模块中的启用wifi(setWifiEnable)函数使能wifi,WifiService模块接着向自身发送一条CMD_WIFI_TOGGLED消息,在处理该消息的代码中做真正的使能工作:首先加载wifi内核驱动模块,然后启动wpa_supplicant程序(WifiService负责启动和关闭wpa_supplicant),wpa_supplicant程序主要是完成AP扫描,扫描后将扫描结果通过事件通知framework层,在framework层的wifi状态追踪器(wifiStateTracker)会创建wifi监视器(WifiMonitor)接收来自底层的事件,而WifiMonitor负责从wpa_supplicant接收事件通知,同时WifiMontior监视线程会把命令下发给wpa_supplicant,配置AP,连接AP,获取IP地址,wifi状态为已连接,至此wifi使能完成。

在两个网卡都启动后,本申请实施例通过修改framework层的网络连接处理流程而实现双网卡共存。本申请实施例提供的双网卡启动整体实现流程如图1所示,包括如下步骤:
步骤101:判断新连接的网络类型是否是默认的网络(默认的网络指的是wifi或移动网络,即本申请所要开启的双网卡对应的网络),如果这个网络是默认的网络,继续步骤102,否则跳转到步骤107;

步骤102:判断激活默认网络(mActiveDefaultNetwork)变量是否已经设置(之前已开启过一个网络wifi或移动网络,已经处于连接状态,如果已开启过网络,mActiveDefaultNetwork值为是1或0,否则值为-1),并且新连接的网络类型不等于这个mActiveDefaultNetwork已激活的网络类型,如果条件满足则保留这个新连接的网络并且保留它的网络状态信息,使这个新的网络和原网络并存,结束本流程;否则说明之前没有开启过任何网络,将继续步骤103;

步骤103:使能同步处理函数,该函数的具体处理过程包括:首先判断网络传输唤醒锁定(mNetTransitionWakeLock)变量是否是保持(held)状态,这里是判断屏幕是否亮着,若亮着,一秒之后关闭屏幕,之所以一秒钟之后关闭是留给应用程序连接新网络所用的时间;

步骤104:更新激活默认网络(mActiveDefaultNetwork)变量实现新网络连接,重新设置正在运行的网络类型,同时更新其他的变量;

步骤105:设置拆解(teardown)请求为否,不关闭网络;

步骤106:更新网络设置;这一步主要是从系统属性里面读出要连接的那个网络的属性信息,然后把它写到安卓系统的内核(kernel)里;

步骤107:改变网络连接,主要包括更新路由设置、域名系统设置、网络接口设置和连接属性;切换到新连接的网络上;

步骤108:发送一个广播消息至网络状态服务(NetWorkStateService),用于通知网络接口名称发生改变。


该流程与现有技术开启网络流程的区别:
现有技术在两个网络(wifi和3g/lte)同时开启时,虽然在网络设置界面上看到两个网络都是开启状态,但实质上它的内部程序处理策略是优先选择wifi网络,程序在内部处理上是只打开了wifi,而将3g/lte关闭,这时虽然打开了两个网络但只有wifi网络可用,3g/lte是无法使用的。通过查看网络状态,只有WLAN处于up状态并且有IP地址,如图2所示。

 

posted @ 2023-08-03 19:38  petercao  阅读(714)  评论(0编辑  收藏  举报