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

Сканирование Wi-Fi с предпочтительным переносом сети (PNO) – это сканирование Wi-Fi с низким энергопотреблением, которое выполняется через регулярные интервалы, когда устройство отключено от Wi-Fi и экран выключен. Сканирование PNO используется для поиска и подключения к сохраненным сетям. Сканирование планируется фреймворком с помощью команды NL80211_CMD_START_SCHED_SCAN. Дополнительную информацию можно найти в файле nl80211.h.

Оптимизация энергопотребления с помощью информации о мобильности устройств

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

В Android 10 представлен необязательный метод API setDeviceMobilityState() в WifiManager, который увеличивает интервал между сканированиями PNO в зависимости от состояния мобильности устройства, чтобы снизить энергопотребление.

Возможные состояния мобильности:

  • DEVICE_MOBILITY_STATE_UNKNOWN: Неизвестная мобильность
  • DEVICE_MOBILITY_STATE_HIGH_MVMT: на велосипеде или в автомобиле.
  • DEVICE_MOBILITY_STATE_LOW_MVMT: Ходьба или бег
  • DEVICE_MOBILITY_STATE_STATIONARY: не переносится

Если устройство неподвижно, платформа Android увеличивает интервал между сканированиями PNO с 60 до 180 секунд, чтобы снизить энергопотребление. Оптимизация выполняется исходя из предположения, что устройство вряд ли найдет новые сети при сканировании PNO, если оно не перемещается.

Если устройство находится в другом состоянии или метод не вызывается, устройство использует стандартное поведение при сканировании PNO.

Реализация

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