Точка доступа Wi-Fi (Soft AP)

Android поддерживает точки доступа Wi-Fi (программные точки доступа), в том числе в режиме модема и только для локального использования.

Функция программной точки доступа позволяет настроить следующее:

  • SSID и BSSID;
  • Тип защиты (включая WPA3)
  • Скрытое имя сети
  • Рабочий диапазон и канал (включая ACS)
  • Максимальное количество разрешенных клиентов
  • Время ожидания перед автоматическим выключением
  • Белый и черный списки для управления связанными устройствами
  • Уровень рандомизации MAC-адреса для BSSID точки доступа
  • 802.11ax и 802.11be;

Доступность этих элементов управления зависит от возможностей устройства. В Android 11 появились API, позволяющие получить доступ к этим функциям. Производители устройств также могут указывать базовые возможности устройств с помощью оверлеев.

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

Реализация по умолчанию для точки доступа Wi-Fi в режиме модема предоставляется приложением "Настройки" в Android Open Source Project (AOSP), однако в ней используются не все API для настройки программной точки доступа.

Чтобы поддерживать режим модема через точку доступа или локальную точку доступа, приложение должно выполнять следующие функции:

  1. Зарегистрируйте обратный вызов, чтобы получить возможности устройства, используя WifiManager#registerSoftApCallback для точки доступа с подключением к интернету или WifiManager#registerLocalOnlyHotspotSoftApCallback для точки доступа, работающей только локально.

    Функция обратного вызова SoftApCallback предоставляет следующие методы:

    • SoftApCallback#onCapabilityChanged: Содержит информацию о возможностях устройства, в том числе о максимальном количестве поддерживаемых клиентов и о том, поддерживаются ли SAE или ACS.
    • SoftApCallback#onInfoChanged: Предоставляет информацию о запущенной точке доступа, включая сведения о диапазоне и частоте (действительно только после запуска).
    • SoftApCallback#onConnectedClientsChanged – список подключенных клиентов. Для каждого клиента можно получить MAC-адрес. Чтобы получить информацию об IP-адресе, используйте обратный вызов TetheringEventCallback#onClientsChanged.
    • SoftApCallback#onStateChanged: Сообщает об изменениях состояния точки доступа Soft AP при ее включении и отключении.
    • SoftApCallback#onBlockedClientConnecting: Содержит информацию о заблокированном клиенте и одну из следующих причин блокировки: устройство достигло максимального количества клиентов, которые оно может поддерживать, или клиент не имеет явного разрешения на подключение.
    • SoftApCallback#onClientsDisconnected – список отключенных клиентов. Для каждого клиента можно узнать причину отключения.

Для точки доступа в режиме модема:

  1. Настройте конфигурацию точки доступа для режима модема, вызвав метод WifiManager#setSoftApConfiguration и предоставив экземпляр SoftApConfiguration. Создайте объект SoftApConfiguration, используя класс SoftApConfiguration.Builder.
  2. Чтобы запустить режим модема, вызовите метод TetheringManager#startTethering.

Для локальной точки доступа:

  1. Чтобы запустить точку доступа только для локального использования с определенной конфигурацией программной точки доступа, вызовите метод WifiManager#startLocalOnlyHotspot.

Как реализовать белые и черные списки

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

  • Ограничьте максимальное количество устройств, которые могут подключаться к точке доступа, с помощью значения SoftApConfiguration.Builder#setMaxNumberOfClients. Укажите число, которое меньше максимального количества клиентов, поддерживаемого устройством. Максимальное количество можно узнать в SoftApCapability#getMaxSupportedClients.
  • Динамическое управление с помощью белых и черных списков:

    • По умолчанию программная точка доступа позволяет подключаться всем устройствам, кроме тех, чьи MAC-адреса добавлены в SoftApConfiguration.Builder#setBlockedClientList.
    • Если точка доступа Soft AP настроена с помощью параметра SoftApConfiguration.Builder#setClientControlByUserEnabled(true), используется список разрешенных устройств.
      • Все устройства, MAC-адреса которых указаны в SoftApConfiguration.Builder#setBlockedClientList, не могут быть подключены.
      • Все устройства, MAC-адреса которых указаны в SoftApConfiguration.Builder#setAllowedClientList, могут подключаться к сети.
      • Все остальные устройства (то есть устройства, MAC-адреса которых не указаны в белом или черном списке) не могут подключаться к сети, но вызывается функция SoftApCallback#onBlockedClientConnecting, позволяющая управляющему приложению (то есть приложению Настройки) выполнить действие, например запросить у пользователя подтверждение и затем добавить устройство в белый или черный список в зависимости от действий пользователя.

    Обратите внимание, что устройства могут использовать функцию белого списка, только если она поддерживается на устройстве. Проверить, поддерживается ли устройство, можно с помощью SoftApCapability#areFeaturesSupported(SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT).

Реализация

Чтобы поддерживать режим модема через точку доступа или локальную точку доступа, производители устройств должны предоставить приложение настроек, фреймворк и поддержку HAL/встроенного ПО:

Настройка канала

Чтобы настроить реализацию, производителям устройств рекомендуется задать следующие оверлеи и конфигурации операторов, описанные в packages/modules/Wifi/service/ServiceWifiResources/res/values/config.xml:

  • config_wifiFrameworkSoftApShutDownTimeoutMilliseconds – интервал времени ожидания завершения работы по умолчанию. Действительно, только если включено правило SoftApConfiguration#setAutoShutdownEnabled. Можно переопределить с помощью SoftApConfiguration#setShutdownTimeoutMillis.
  • config_wifiHardwareSoftapMaxClientCount: аппаратное ограничение на максимальное количество поддерживаемых клиентов. Максимальное количество клиентов, поддерживаемых устройством, – это минимальное значение из ограничений оборудования и оператора (указанных в CarrierConfigManager.Wifi#KEY_HOTSPOT_MAX_CLIENT_COUNT). Окончательный результат передается приложению с помощью SoftApCapabilities#getMaxSupportedClients.
  • config_wifiSofapClientForceDisconnectSupported – может ли устройство принудительно отключать клиента. Требуется для включения белых и черных списков. Передается управляющему приложению (приложению "Настройки") через SoftApCapabilities#areFeaturesSupported(SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT).
  • (Доступно в Android 13) config_wifiSoftapPassphraseAsciiEncodableCheck: Требуется ли, чтобы пароль точки доступа был в кодировке ASCII.
  • config_wifiSoftapAutoUpgradeToBridgedConfigWhenSupported – определяет, нужно ли автоматически переключать конфигурацию диапазона на двухдиапазонную при восстановлении конфигурации облака, если поддерживается новое устройство.
  • (Доступно в Android 13) config_wifiSoftapAutoAppendLowerBandsToBandConfigurationEnabled: Указывает, добавляет ли фреймворк автоматически нижние диапазоны к конфигурации диапазонов, чтобы избежать обработки сосуществования.
  • config_wifiSoftApDynamicCountryCodeUpdateSupported – поддерживает ли устройство динамическое обновление кода страны в режиме точки доступа.
  • Поддерживаемые каналы: config_wifiSoftap2gChannelList, config_wifiSoftap5gChannelList, config_wifiSoftap6gChannelList и config_wifiSoftap60gChannelList.
  • Поддержка восстановления, указывающая, сбрасываются ли соответствующие записи до значений по умолчанию при восстановлении конфигурации точки доступа на новом устройстве: config_wifiSoftapResetChannelConfig, config_wifiSoftapResetHiddenConfig, config_wifiSoftapResetUserControlConfig, config_wifiSoftapResetAutoShutdownTimerConfig, config_wifiSoftapResetMaxClientSettingConfig. Обратите внимание, что по умолчанию для этих параметров задано значение true, то есть значения сбрасываются. Это особенно важно, если новое устройство не поддерживает конфигурацию.
  • Возможности оборудования:
    • config_wifi_softap_acs_supported
    • config_wifi_softap_sae_supported
    • (доступно в Android 13) config_wifiSoftapOweTransitionSupported
    • (доступно в Android 13) config_wifiSoftapOweSupported
    • config_wifi_softap_ieee80211ac_supported
    • config_wifiSoftapIeee80211axSupported
    • (доступно в Android 13) config_wifiSoftapIeee80211beSupported
    • config_wifiSoftapMacAddressCustomizationSupported
    • config_wifiSoftapHeSuBeamformerSupported
    • config_wifiSoftapHeSuBeamformeeSupported
    • config_wifiSoftapHeMuBeamformerSupported
    • config_wifiSoftapHeTwtSupported
    • config_wifiSoftap24ghzSupported
    • config_wifiSoftap5ghzSupported
    • config_wifiSoftap6ghzSupported
    • config_wifiSoftap60ghzSupported
    • config_wifiSoftapAcsIncludeDfs

Проверка

В Android есть набор модульных тестов и тестов Compatibility Test Suite (CTS), которые позволяют проверить функцию точки доступа. Функцию точки доступа также можно протестировать с помощью набора тестов поставщика (VTS).

Модульные тесты

Проверьте пакет точки доступа, выполнив следующие тесты.

  • Тесты сервисов:

    atest packages/modules/Wifi/service/tests/wifitests/
  • Тестирование на уровне управляющего аккаунта:

    atest packages/modules/Wifi/framework/tests/

Тесты Compatibility Test Suite (CTS)

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

Чтобы запустить тесты CTS, выполните следующую команду:

atest android.net.wifi.cts.WifiManagerTest

Vendor Test Suite (VTS)

Если реализован интерфейс HIDL, выполните следующую команду:

atest VtsHalWifiHostapdV1_2Target

Если интерфейс AIDL реализован, выполните следующие действия:

atest VtsHalHostapdTargetTest