Одновременное подключение к двум сетям Wi-Fi

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

  • Сначала подключение, потом отключение. Устройство подключается к новой сети 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)
  • Комбинация интерфейсов Wi-Fi HAL должна иметь два параллельных интерфейса STA, представленных в формате спецификации, например [{STA} <= 2, ...]. Подробнее о параллельной работе нескольких интерфейсов Wi-Fi…

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

  1. Включить одну или несколько функций по отдельности с помощью наложений ресурсов времени выполнения (по умолчанию отключено).

    • Подключение до отключения: config_wifiMultiStaNetworkSwitchingMakeBeforeBreakEnabled
    • Одновременное подключение к интернету и локальной сети config_wifiMultiStaLocalOnlyConcurrencyEnabled
    • Одновременное использование ограниченного подключения и подключения к интернету: config_wifiMultiStaRestrictedConcurrencyEnabled
    • Одновременное подключение к нескольким сетям с доступом к интернету: config_wifiMultiStaMultiInternetConcurrencyEnabled
  2. Проверьте каждую реализацию, как описано в соответствующих разделах.

Чтобы улучшить поддержку одновременной работы двух устройств Wi-Fi STA, мы рекомендуем использовать в фреймворках и приложениях, настроенных производителем, метод NetworkCallback#onCapabilitiesChanged() вместо WifiManager#getConnectionInfo(), который возвращает WifiInfo только для одной сети и был объявлен устаревшим в Android 12. Подробную информацию можно найти в статье Wi-Fi Network Request API для одноранговых подключений.

Переключение без разрыва

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

В Android 11 и более ранних версиях устройство должно отключиться от существующей сети Wi-Fi, прежде чем подключиться к новой (break-before-make). Это приводит к следующим проблемам:

  • При подключении к новой сети устройство может обнаружить, что сохраненный пароль сети 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 можно узнать в статье Wi-Fi Network Request API for peer-to-peer connectivity.

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

Чтобы проверить эту функцию, используйте CTS-тест MultiStaConcurrencyWifiNetworkSpecifierTest.

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

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

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

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

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

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

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

Проверка одновременного использования ограниченного режима и подключения к интернету

Чтобы проверить эту функцию, используйте тест MultiStaConcurrencyRestrictedWifiNetworkSuggestionTest CTS.

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

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

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

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

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

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

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

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

  3. Добавьте спецификатор в сетевой запрос вместе с экземпляром NetworkCallback, чтобы отслеживать статус запроса, и отправьте запрос в ConnectivityManager. Если в результатах сканирования есть сохраненная сеть с запрошенным диапазоном и подключение к ней выполнено успешно, для объекта обратного вызова вызывается метод NetworkCallback.onAvailable().

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

Чтобы проверить эту функцию, используйте следующий тест CTS:

  • CTS: MultiStaConcurrencyMultiInternetWifiNetworkTest

Рекомендации по выбору чипа Wi-Fi

Поставщики чипов Wi-Fi могут использовать следующие рекомендации, чтобы обеспечить поддержку одновременной работы Wi-Fi STA/STA.

Чип Wi-Fi должен поддерживать два одновременных подключения STA. Это означает, что он поддерживает следующие функции:

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

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

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