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 для настройки программной точки доступа.
Чтобы поддерживать режим модема через точку доступа или локальную точку доступа, приложение должно выполнять следующие функции:
Зарегистрируйте обратный вызов, чтобы получить возможности устройства, используя
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– список отключенных клиентов. Для каждого клиента можно узнать причину отключения.
Для точки доступа в режиме модема:
- Настройте конфигурацию точки доступа для режима модема, вызвав метод
WifiManager#setSoftApConfigurationи предоставив экземплярSoftApConfiguration. Создайте объектSoftApConfiguration, используя классSoftApConfiguration.Builder. - Чтобы запустить режим модема, вызовите метод
TetheringManager#startTethering.
Для локальной точки доступа:
- Чтобы запустить точку доступа только для локального использования с определенной конфигурацией программной точки доступа, вызовите метод
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, позволяющая управляющему приложению (то есть приложению Настройки) выполнить действие, например запросить у пользователя подтверждение и затем добавить устройство в белый или черный список в зависимости от действий пользователя.
- Все устройства, MAC-адреса которых указаны в
Обратите внимание, что устройства могут использовать функцию белого списка, только если она поддерживается на устройстве. Проверить, поддерживается ли устройство, можно с помощью
SoftApCapability#areFeaturesSupported(SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT).- По умолчанию программная точка доступа позволяет подключаться всем устройствам, кроме тех, чьи MAC-адреса добавлены в
Реализация
Чтобы поддерживать режим модема через точку доступа или локальную точку доступа, производители устройств должны предоставить приложение настроек, фреймворк и поддержку HAL/встроенного ПО:
Приложение "Настройки". Приложение "Настройки" Android Open Source Project (AOSP) позволяет настроить точку доступа с SSID и учетными данными безопасности. Этот код можно использовать как есть или изменить, чтобы добавить дополнительные возможности, как описано в разделе Разработка приложений с помощью API точек доступа.
Фреймворк. Код фреймворка AOSP поддерживает все функции, описанные в статье Разработка приложений с использованием API точки доступа.
HAL/встроенное ПО для точки доступа: HIDL
IHostapd.halверсии 1.2 или более поздней либо AIDLIHostapd.aidl.
Настройка канала
Чтобы настроить реализацию, производителям устройств рекомендуется задать следующие оверлеи и конфигурации операторов, описанные в 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_supportedconfig_wifi_softap_sae_supported- (доступно в Android 13)
config_wifiSoftapOweTransitionSupported - (доступно в Android 13)
config_wifiSoftapOweSupported config_wifi_softap_ieee80211ac_supportedconfig_wifiSoftapIeee80211axSupported- (доступно в Android 13)
config_wifiSoftapIeee80211beSupported config_wifiSoftapMacAddressCustomizationSupportedconfig_wifiSoftapHeSuBeamformerSupportedconfig_wifiSoftapHeSuBeamformeeSupportedconfig_wifiSoftapHeMuBeamformerSupportedconfig_wifiSoftapHeTwtSupportedconfig_wifiSoftap24ghzSupportedconfig_wifiSoftap5ghzSupportedconfig_wifiSoftap6ghzSupportedconfig_wifiSoftap60ghzSupportedconfig_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.WifiManagerTestVendor Test Suite (VTS)
Если реализован интерфейс HIDL, выполните следующую команду:
atest VtsHalWifiHostapdV1_2TargetЕсли интерфейс AIDL реализован, выполните следующие действия:
atest VtsHalHostapdTargetTest