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% 次要。
-