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()
,因為 WifiManager#getConnectionInfo()
只會針對單一網路傳回 WifiInfo
,且已在 Android 12 中淘汰。詳情請參閱「用於點對點連線的 Wi-Fi Network Request API」。
Make-before-break
make-before-break 功能可讓裝置在連上新 Wi-Fi 網路的同時,維持現有 Wi-Fi 網路的連線狀態,只有在成功連上新 Wi-Fi 網路並可存取網路時,才會中斷舊網路的連線。
在 Android 11 以下版本中,裝置必須先與現有的 Wi-Fi 網路中斷連線,才能連線至新的網路 (先中斷再建立),而「先建立再中斷」用途可解決以下問題。
連線至新網路時,裝置可能會發現儲存的 Wi-Fi 密碼不正確,或是新網路無法存取網際網路。這會迫使裝置切換回舊網路,導致裝置長時間無法連上 Wi-Fi。
舊網路突然中斷,這表示所有套接字都會關閉。應用程式通常無法妥善因應突然斷線的情況,這可能會導致使用者在建立新連線之前,有幾秒無法連上網際網路的情況。
預設網路會變更兩次,分別是從舊 Wi-Fi 網路變更為行動數據,以及從行動網路到新的 Wi-Fi 網路。這會導致應用程式對網路變更做出兩次反應。裝置也必須在短時間內使用行動數據。
建立前中斷流程僅用於作業系統啟動的自動 Wi-Fi 網路切換功能。使用者啟動的網路切換作業會使用舊版的「先中斷再建立」流程,也就是在連線至新網路前,先完全中斷與舊網路的連線。在某些情況下,即使是 OS 啟動的自動切換開關,也會使用破壞前製流程,例如在同時切換兩個設定為使用原廠 MAC 位址的網路時。
應用程式可以使用 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 裝置),以及主要提供網際網路的網路。這項功能可透過 Android 10 新增的 WifiNetworkSpecifier
API,直接連線至攝影機等 IoT 裝置,進而改善使用者體驗。
在 Android 11 以下版本中,裝置在連線至 IoT 裝置時會與主要 Wi-Fi 網路中斷連線,導致無法連上網際網路 (除非裝置有其他傳輸類型,例如行動數據)。
應用程式可以使用 WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported()
API 檢查裝置是否支援此功能。
如要進一步瞭解 Android 12 中並行僅限本機和網際網路連線功能的異動,請參閱適用於點對點連線的 Wi-Fi Network Request API。
驗證僅限本機和網際網路連線
如要驗證這項功能,請使用 MultiStaConcurrencyWifiNetworkSpecifierTest
CTS 測試。
同時限制和網際網路連線
同時連線至受限制的網路和網際網路功能可讓裝置同時連線至使用者的主要 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) 付費或私人建議相符,就會自動連線至該網路,做為次要網路。
驗證同時限制和網際網路連線
如要驗證這項功能,請使用 MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest
CTS 測試。
同時連上多個網路與網際網路
這項功能適用於 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。至少必須在主要介面上支援 APF (和其他卸載,例如 ARP 和 NS) (使用
IWifiChip.setMultiStaPrimaryConnection()
設定)。連結層統計資料必須依據個別介面運作。
以下是針對不同並行作業情境的建議 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 占空比,而是使用
StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent
查詢這項資訊。 如果使用 MCC,我們建議在主要和次要連線之間使用下列占空比:
DUAL_STA_TRANSIENT_PREFER_PRIMARY
:70% 主要、30% 次要。DUAL_STA_NON_TRANSIENT_UNBIASED
:50% 主要、50% 次要。