Параллелизм Wi-Fi STA/STA

В Android 12 реализована поддержка Wi-Fi STA/STA concurrency, которая позволяет устройствам одновременно подключаться к двум сетям Wi-Fi. Эта дополнительная функция обеспечивает следующие функции:

  • Подключение перед разрывом : устройство подключается к новой сети Wi-Fi, прежде чем разорвать существующее соединение. Это обеспечивает более плавное переключение между сетями Wi-Fi.
  • Одновременное локальное и интернет-подключение : устройство подключается только к локальной сети, не нарушая основного интернет-подключения устройства.
  • Одновременное ограниченное подключение к Интернету : устройство подключается к ограниченной сети (доступной только для определенных привилегированных приложений), не нарушая основное подключение устройства к Интернету.
  • (Android 13 или выше) Одновременное использование нескольких сетей с подключением к Интернету : устройство подключается к двум сетям, обе из которых не имеют ограничений и доступны для всех приложений, и обеспечивает подключение к Интернету.

На этой странице описывается поведение устройства при включении этой функции, а также подробности реализации для производителей и поставщиков устройств.

Выполнение

Для реализации параллелизма Wi-Fi STA/STA устройства должны поддерживать следующее:

  • Wi-Fi-чип или прошивка должны поддерживать два одновременных STA-подключения. Прошивка должна поддерживать все комбинации каналов и диапазонов для обоих подключений. Во избежание проблем с производительностью рекомендуем использовать Wi-Fi-чип с поддержкой DBS 2x2+2x2.

  • Устройство должно поддерживать следующие API в реализации AIDL или HIDL IWifiChip .

    • IWifiChip.setMultiStaPrimaryConnection(String ifName)
    • IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
  • Комбинация интерфейсов HAL Wi-Fi должна включать два параллельных интерфейса STA, представленных в формате спецификации, таком как [{STA} <= 2, ...] . Подробнее см. в разделе «Параллелизм многоинтерфейсного 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. Дополнительные сведения см. в разделе API запросов Wi-Fi Network для однорангового подключения .

Сделать-до-разрушения

Функция «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, инициируемого ОС. Сетевые переключения, инициируемые пользователем, используют устаревшую схему «размять перед разрывом», при которой предыдущая сеть полностью отключается перед подключением новой. В некоторых случаях схема «размять перед разрывом» используется даже при автоматическом переключении, инициируемом ОС, например, при переключении между двумя сетями, обе из которых настроены на использование заводского MAC-адреса.

Приложения могут проверить, поддерживается ли этот вариант использования на устройстве, с помощью API WifiManager#isMakeBeforeBreakWifiSwitchingSupported() .

Проверить соединение до разрыва

Для проверки вашей реализации запустите автоматическое переключение сети Wi-Fi (убедившись, что доступна сеть с более сильным сигналом, чем у подключенной сети) и убедитесь, что устройство сохраняет существующее соединение при подключении к новой сети. Чтобы просмотреть состояние обоих интерфейсов Wi-Fi и убедиться, что оба подключены, используйте следующую команду.

adb shell wpa_cli -i wlan0 status ; echo ; adb shell wpa_cli -i wlan1 status

Если в новой сети нет подключения, устройство пытается подключиться к ней, сохраняя соединение с существующей сетью, и прерывает попытку, обнаружив, что в новой сети нет интернета. После этого устройство продолжает использовать существующее подключение в качестве основной сети Wi-Fi.

Одновременное локальное и интернет-подключение

Функция одновременного локального и интернет-подключения позволяет устройствам подключаться к локальному соединению, например, к устройству Интернета вещей, одновременно с основной сетью, предоставляющей интернет. Эта функция улучшает пользовательский опыт при прямом подключении к устройствам Интернета вещей, таким как камеры, что стало возможным благодаря API WifiNetworkSpecifier , добавленному в Android 10.

В Android 11 и более ранних версиях устройства отключаются от основной сети Wi-Fi при подключении к устройству IoT, что приводит к потере подключения к Интернету (если у устройства не доступен другой тип транспорта, например, сотовые данные).

Приложения могут проверить, поддерживается ли эта функция на устройстве, с помощью API WifiManager#isStaConcurrencyForLocalOnlyConnectionsSupported() .

Дополнительную информацию об изменениях в функции одновременного локального и интернет-подключения в Android 12 см. в разделе API запросов сети Wi-Fi для однорангового подключения .

Проверить локальное и интернет-соединение

Для проверки этой функции используйте CTS-тест MultiStaConcurrencyWifiNetworkSpecifierTest .

Одновременное ограниченное и интернет-подключение

Функция одновременного ограниченного подключения к Интернету позволяет устройству одновременно подключаться к основной сети Wi-Fi пользователя и к ограниченной сети Wi-Fi, которая доступна только для избранных приложений.

Приложения могут проверить, поддерживается ли эта функция на устройстве, с помощью API WifiManager#isStaConcurrencyForRestrictedConnectionsSupported() .

Чтобы разрешить устройству подключаться к дополнительным ограниченным сетям Wi-Fi, выполните следующие действия:

  1. Добавьте предложения сетей Wi-Fi, установив setOemPaid или setOemPrivate в значение true.

  2. В ConnectivityManager подайте NetworkRequest с соответствующими возможностями:

Когда устройство обнаруживает результаты сканирования с сетью, соответствующей предложению платного или частного OEM-провайдера, оно автоматически подключается к ней как к вторичной сети.

Проверить одновременное ограниченное и интернет-подключение

Для проверки этой функции используйте CTS-тест MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest .

Одновременные несколько сетей с подключением к Интернету

Функция одновременного подключения к нескольким сетям с подключением к Интернету, доступная для Android 13 и выше, позволяет устройству одновременно подключаться к двум сетям (точкам доступа), обе из которых не имеют ограничений (все приложения имеют доступ), и обеспечивать доступ к Интернету.

Приложения могут проверить, поддерживается ли эта функция на устройстве, с помощью метода WifiManager#isStaConcurrencyForMultiInternetSupported() .

Если функция поддерживается, привилегированные приложения могут включить её с помощью метода WifiManager#setStaConcurrencyForMultiInternetMode(int mode) . Функция имеет следующие режимы:

Чтобы запросить текущий активный режим функции, используйте метод WifiManager#getStaConcurrencyForMultiInternetMode() .

Когда функция включена, выполните следующие действия, чтобы запросить дополнительную сеть Wi-Fi, предоставляющую доступ в Интернет.

  1. Создайте спецификатор сети Wi-Fi с помощью WifiNetworkSpecifier.Builder . Выберите диапазон для спецификатора с помощью метода setBand() . Не указывайте SSID или BSSID, так как дополнительная сеть для указанного диапазона выбирается фреймворком Wi-Fi.

  2. Используя ConnectivityManager , создайте NetworkRequest с возможностью NET_CAPABILITY_INTERNET .

  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 другого подключения.

  • APF (и другие разгрузки, такие как ARP и NS) должны поддерживаться как минимум на основном интерфейсе (устанавливается с помощью IWifiChip.setMultiStaPrimaryConnection() ).

  • Статистика канального уровня должна обрабатываться на уровне каждого интерфейса.

Ниже приведены рекомендуемые реализации чипов Wi-Fi для различных сценариев параллелизма:

  • Чип Wi-Fi должен позволять фреймворку вызывать IWifiChip.setMultiStaUseCase() с одной из следующих констант для указания текущей функции:

    • DUAL_STA_TRANSIENT_PREFER_PRIMARY : определяет функцию «замкнуть перед разрывом». Качество первичного соединения должно иметь приоритет над качеством вторичного соединения.
    • 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% вторичный.