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

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

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

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

Выполнение

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

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

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

    • IWifiChip.setMultiStaPrimaryConnection(String ifName)
    • IWifiChip.setMultiStaUseCase(MultiStaUseCase useCase)
  • Для комбинации интерфейсов Wi-Fi HAL необходимо наличие двух одновременно доступных интерфейсов 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 мы рекомендуем разработчикам и приложениям использовать метод NetworkCallback#onCapabilitiesChanged() вместо WifiManager#getConnectionInfo() , который возвращает WifiInfo только для одной сети и был объявлен устаревшим в Android 12. Для получения дополнительной информации см. API запросов Wi-Fi для однорангового подключения .

сделать перед перерывом

Функция «подключение перед отключением» позволяет устройствам подключаться к новой сети Wi-Fi, сохраняя при этом существующее соединение с существующей сетью Wi-Fi, и отключаться от старой сети только после успешного подключения к новой сети Wi-Fi и наличия доступа в интернет.

В Android 11 и более ранних версиях используется сценарий "сначала отключись, потом отключись", который решает следующие проблемы: устройство должно отключиться от существующей сети Wi-Fi перед подключением к новой сети (режим "разъедини, потом отключи").

  • При подключении к новой сети устройство может обнаружить, что у него сохранен неверный пароль от Wi-Fi или что новая сеть не имеет доступа к интернету. Это вынуждает устройство переключаться обратно на старую сеть, что приводит к значительному длительному отсутствию подключения к 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.

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

Функция одновременного подключения только к локальной сети и к интернету позволяет устройствам подключаться к локальной сети, например, к IoT-устройству, одновременно с подключением к основной сети, предоставляющей доступ в интернет. Эта функция улучшает пользовательский опыт при прямом подключении к IoT-устройствам, таким как камеры, что стало возможным благодаря 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 с соответствующими правами доступа:

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

Проверка одновременного ограниченного и интернет-соединения.

Для проверки этой функции используйте тест 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 (как в одном, так и в разных диапазонах). Две станции ни в коем случае не должны быть подключены к одному и тому же 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() для указания этой функции. Ниже приведены общие рекомендации:

    • Предпочтительно наличие скрининга на рак предстательной железы (DBS) 2x2+2x2, если таковой имеется.
    • По возможности избегайте использования 1x1+1x1 DBS из-за чрезмерного ухудшения качества связи. Вместо этого отдавайте предпочтение MCC.
    • Рабочий цикл MCC должен быть настраиваемым драйвером или встроенным ПО для различных функций. Платформа не устанавливает рабочий цикл MCC напрямую, а запрашивает эту информацию с помощью StaLinkLayerIfaceStats.timeSliceDutyCycleInPercent .
    • При использовании распределительного щита мы рекомендуем следующие рабочие циклы между основным и резервным соединениями:

      • DUAL_STA_TRANSIENT_PREFER_PRIMARY : 70% основной, 30% дополнительный.
      • DUAL_STA_NON_TRANSIENT_UNBIASED : 50% основной, 50% вторичный.