Сканирование Wi-Fi на ESP32 с помощью ESP-IDF


В данной статье мы рассмотрим как сканировать все ближайшие точки доступа с помощью ESP32 и ESP-IDF. Мы отобразим значения RSSI отсканированных точек доступа, тип аутентификации и канал. ESP-IDF предоставляет библиотеку esp_wifi.h, которую мы используем для сканирования, подключения к точкам доступа и мониторинга состояния Wi-Fi ESP32 с помощью различных событий. Этот API включает в себя настройку режимов точки доступа и Wi-Fi-станции ESP32 в различных режимах безопасности, например, WPA, WEP и т. д., мониторинг пакетов Wi-Fi и сканирование ближайших точек доступа.

Сканирование Wi-Fi на ESP32 с помощью ESP-IDF

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

В предыдущих статьях на нашем сайте мы рассмотрели, как настроить ESP32 в качестве точки доступа и как перевести его в режим станции. Эти статьи вы можете прочитать по следующим ссылкам:

Сканирование Wi-Fi на ESP32

Давайте создадим пример проекта в ESP-IDF и запрограммируем нашу плату ESP32 с помощью скетча сканирования Wi-Fi. Также мы обсудим API из файла esp_wifi.h, которые потребуются для этого проекта.

Создание примера проекта

Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите   в строке поиска ESP-IDF: New Project и нажмите Enter.

Укажите название проекта и каталог. Мы назвали наш проект «ESP32_WIFI_SCAN». Для платы ESP-IDF мы выбрали опцию custom board («Пользовательская плата»). В качестве целевой платформы ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.

Создание примера проекта для сканирования Wi-Fi на ESP32

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’ («Создать проект, используя шаблон sample_project»).

Создание проекта с использованием шаблона sample_project

Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».

Это открывает наш проект ESP32_WIFI_SCAN, который мы создали на вкладке EXPLORER. Внутри папки проекта находится несколько папок. Это справедливо для всех проектов, которые вы будете создавать с помощью ESP-IDF Explorer.

Код ESP-IDF для сканирования Wi-Fi на ESP32

В  папке main находится исходный код, то есть файл main.c будет расположен здесь. Перейдите в папку main > main.c  и откройте его. Скопируйте приведенный ниже код и сохраните его. Следующий код использует функции библиотеки esp_wifi.h для сканирования всех ближайших сетей Wi-Fi, а также их значений RSSI, канала и типа аутентификации.

Как работает код?

Для начала мы подключим необходимые библиотеки, включая esp_wifi.h для работы с Wi-Fi, esp_log.h в качестве библиотеки для ведения журналов и библиотеку энергонезависимой памяти (NVS).

Мы определили максимальное количество точек доступа, которые могут быть просканированы, равным 20.

Эта функция возвращает режим аутентификации. Доступные типы: Open, WEP, WPA PSK, WPA2 PSK, WPA WPA2 PSK и MAX.

wifiInit()

Внутри функции wifiInit() мы сначала инициализируем NVS и базовый стек TCP/IP, вызвав функции nvs_flash_init() и tcpip_adapter_init() соответственно.

Для запуска реализации цикла событий мы вызываем функцию esp_event_loop_init(). Эта функция принимает два параметра. Первый параметр — это указатель на функцию обработчика событий, а второй — произвольный указатель на контекст.

Это функция event_handler().

Затем мы инициализируем ресурс выделения Wi-Fi для драйвера Wi-Fi. Он отвечает за запуск задачи Wi-Fi. Он принимает единственный параметр wifi_config, который является указателем на уже инициализированную структуру конфигурации Wi-Fi, установленную в значение WIFI_INIT_CONFIG_DEFAULT(), так что инициализация конфигурации происходит со значениями по умолчанию. Здесь wifi_init_config_t — это структура, обозначающая параметры конфигурации стека Wi-Fi, которые передаются в функцию esp_wifi_init().

Кроме того, мы устанавливаем режим Wi-Fi как «станция». Для этого мы используем функцию esp_wifi_set_mode() и передаем в качестве параметра параметр WiFI_MODE_STA.

Затем мы запускаем Wi-Fi-соединение с заданной конфигурацией, используя функцию esp_wifi_start().

app_main()

Внутри функции app_main() мы сначала вызовем функцию wifiInit() для инициализации и запуска Wi-Fi-соединения.

Далее мы вызываем функцию esp_wifi_scan_start() для сканирования всех ближайших точек доступа. Эта функция принимает два параметра.

  • Первый параметр — это конфигурация сканирования, определяемая структурой wifi_scan_config_t. Она содержит различные параметры конфигурации сканирования, включая SSID, BSSID, канал и отображение скрытых точек доступа.
  • Второй параметр — это переменная 'block' типа bool. Если она установлена ​​как true, то вызывающая сторона будет заблокирована до завершения сканирования, в противном случае функция немедленно возвращает управление.

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

  • Первый параметр может выступать как в качестве входного, так и в качестве выходного параметра. В качестве входного параметра он содержит максимальное количество точек доступа. В качестве выходного параметра он получает номер точки доступа, который возвращает данный API.
  • Второй параметр — это 'ap_records', в нашем случае это 'wifi_records'. Это массив типа wifi_ap_record_t, содержащий список отсканированных точек доступа.

В этот момент ESP-IDF выводит количество найденных точек доступа, которые хранятся в переменной 'max_records'. После этого он выводит подробную информацию о сканированных ближайших сетях, включая SSID, канал, RSSI и режим аутентификации.

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

После успешной прошивки кода терминал ESP-IDF выводит количество отсканированных точек доступа и список различных параметров. В нашем случае было отсканировано 5 точек доступа поблизости. Также можно увидеть SSID, канал, уровень RSSI и режим аутентификации каждой сети.

Тестирование проекта сканирования Wi-Fi на ESP32 в окне терминала

(Проголосуй первым!)
Загрузка...
1 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *