Рубрики
Проекты на ESP32

Подключение ESP32 по Wi-Fi в режиме станции с помощью ESP-IDF

В данной статье мы научимся настраивать ESP32 в режиме станции (STA) с помощью ESP-IDF. Другими словами, мы увидим, как установить Wi-Fi-соединение и подключиться к точке доступа, используя драйверы Wi-Fi esp-idf. Это руководство включает в себя объяснения необходимых API для подключения к Wi-Fi, подробную информацию о драйвере Wi-Fi и пример скетча для ESP-IDF, демонстрирующий подключение платы ESP32 к беспроводной сети.

Также на нашем сайте вы можете прочитать статью про использование Wi-Fi в ESP32-S3 с помощью ESP-IDF — возможно, некоторые аспекты работы с Wi-FI в ней рассмотрены более понятным для вас языком.

Прежде чем продолжить, убедитесь, что у вас установлена ​​последняя версия VS Code и настроено расширение ESP-IDF:

Дополнительно на нашем сайте вы можете прочитать статью про начало работы с ESP32 с использованием ESP-IDF.

API Wi-Fi для ESP32 ESP-IDF

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

В этом руководстве мы сосредоточимся на том, как подключить нашу плату ESP32 к точке доступа, настроив её в режиме станции, также известном как режим STA/режим Wi-Fi-клиента. Давайте посмотрим, как это будет сделано. 

Первым шагом является подключение заголовочного файла:

Конфигурация

Начнем с инициализации ресурса выделения Wi-Fi для драйвера Wi-Fi. Он отвечает за запуск задачи Wi-Fi.

Функция принимает один параметр config, который представляет собой указатель на уже инициализированную структуру конфигурации Wi-Fi. Обычно мы устанавливаем структуру конфигурации Wi-Fi в значение WIFI_INIT_CONFIG_DEFAULT() , чтобы инициализация конфигурации происходила со значениями по умолчанию. Это показано ниже:

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

Далее мы настроим режим Wi-Fi. Как упоминалось ранее, библиотека ESP-IDF Wi-Fi поддерживает несколько режимов работы Wi-Fi. Для установки режима Wi-Fi мы используем функцию esp_wifi_set_mode() и передаем в нее режим Wi-Fi в качестве параметра. По умолчанию режим установлен на station. Мы можем установить режим на station, soft-AP или оба (station + soft-AP). Параметр может принимать одно из трех значений:

  • WIFI_MODE_STA (режим станции)
  • WIFI_MODE_AP (для режима программной точки доступа)
  • WIFI_MODE_APSTA (для режима станции + программной точки доступа)

Запуск Wi-Fi

Для запуска Wi-Fi-соединения в заданных настройках вызывается функция esp_wifi_start(). В зависимости от настроенного режима, она сначала создает свой блок управления, а затем инициализирует этот режим.

Наконец, для подключения платы ESP32, установленной в режиме станции, к точке доступа, мы используем функцию esp_wifi_connect(). Эта функция применима только в том случае, если настроен режим «станция» или «станция + программная точка доступа».

Особенности Wi-Fi на ESP32

ESP32 Wi-Fi поддерживает четыре виртуальных интерфейса Wi-Fi: STA, AP, Sniffer и Reserved. Более того, плата ESP32 может быть сконфигурирована в трех режимах: режим станции, режим программной точки доступа и одновременно режимы станции и программной точки доступа. Ниже мы привели еще несколько особенностей ESP32 Wi-Fi.

  • Протокол ESP-NOW и режим дальней связи поддерживают передачу данных на расстояние до 1 км.
  • Максимальная пропускная способность TCP по беспроводной сети составляет 20 Мбит/с.
  • Кроме того, она обеспечивает максимальную пропускную способность UDP в беспроводной сети до 30 Мбит/с.
  • В сочетании с различными стандартами безопасности, включая WPA/WPA2/WPA3/WPA2-Enterprise/WPA3-Enterprise/WAPI/WPS и DPP.
  • IEEE 802.11b, IEEE 802.11g, IEEE 802.11n, а также API для настройки режима протокола.
  • AMSDU, AMPDU, HT40, QoS, спящий режим модема, несколько антенн.

Подключение платы ESP32 к Wi-Fi-станции

Теперь давайте обсудим процесс подключения платы ESP32 к Wi-Fi-станции, который включает в себя в общей сложности 4 этапа:

  • Фаза сканирования;
  • Этап аутентификации;
  • Этап ассоциации;
  • Фаза четырехстороннего рукопожатия.

Давайте кратко обсудим эти этапы.

Фаза сканирования

s1.1: На этом этапе драйвер Wi-Fi начинает сканирование настроенной точки доступа. Именно тогда вызывается функция esp_wifi_connect().

s1.2: Если целевая точка доступа не обнаружена во время сканирования, произойдет событие Wi-Fi: WIFI_EVENT_STA_DISCONNECTED. Это приведет к появлению кода причины Wi-Fi: WIFI_EVENT_STA_DISCONNECTED.

Этап аутентификации

s2.1: Этап аутентификации начинается с отправки запроса на аутентификацию, после чего запускается таймер аутентификации для отслеживания этого запроса.

s2.2: Событие Wi-Fi: WIFI_EVENT_STA_DISCONNECTED произойдет, если таймер аутентификации истечет, а пакет ответа на запрос аутентификации еще не получен. Это приведет к коду причины Wi-Fi: WIFI_REASON_AUTH_EXPIRE.

s2.3: На этом этапе таймер аутентификации останавливается после получения пакета ответа на запрос аутентификации.

s2.4: В этом случае точка доступа не принимает пакет ответа аутентификации, что приводит к возникновению события Wi-Fi: WIFI_EVENT_STA_DISCONNECTED. Это приводит к коду причины Wi-Fi: WIFI_REASON_AUTH_FAIL.

Этап ассоциации

s3.1: Этот этап начинается с отправки запроса на установление связи, что активирует таймер установления связи.

s3.2: Событие Wi-Fi: WIFI_EVENT_STA_DISCONNECTED произойдет, если таймер установления соединения истечет, а пакет ответа на запрос установления соединения еще не получен. Это приведет к коду причины Wi-Fi: WIFI_REASON_ASSOC_EXPIRE.

s3.3: На этом этапе таймер установления соединения останавливается после получения пакета ответа на запрос об установлении соединения.

s3.4: В этом случае точка доступа не принимает пакет ответа на запрос подключения, что приводит к возникновению события Wi-Fi: WIFI_EVENT_STA_DISCONNECTED. Это приводит к коду причины сбоя Wi-Fi: WIFI_REASON_AUTH_FAIL.

Фаза четырехстороннего рукопожатия

s4.1: В этом случае, как только рукопожатие инициировано и таймер рукопожатия истекает, а сигнал 1/4 EAPOL не получен, возникает событие Wi-Fi: WIFI_EVENT_STA_DISCONNECTED. Это приводит к коду причины Wi-Fi: WIFI_REASON_HANDSHAKE_TIMEOUT.

s4.2: На этом этапе осуществляется приобретение 1/4 EAPOL.

s4.3: В этот момент станция отправляет ответ 2/4 EAPOL.

s4.4: В этом случае событие Wi-Fi: WIFI_EVENT_STA_DISCONNECTED возникает, когда сигнал 3/4 EAPOL не получен в течение времени ожидания таймера подтверждения. Это приводит к коду причины Wi-Fi: WIFI_REASON_HANDSHAKE_TIMEOUT.

s4.5: На этом этапе осуществляется приобретение 3/4 EAPOL.

s4.6: В этот момент станция отправляет ответ 4/4 EAPOL.

s4.7: Происходит событие Wi-Fi: WIFI_EVENT_STA_CONNECTED.

Пример работы ESP32 в режиме станции с использованием ESP-IDF

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

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

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

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

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

На вкладке getting_started («Начало работы») для Wi-Fi мы нажмем на ‘station’ («станция»). Теперь нажмем ‘Create project using template station’ («Создать проект, используя шаблон станции«).

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

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

Перейдите в main > station_example_main.c и откройте его.

Ниже приведён фрагмент кода. Этот пример демонстрирует функции Wi-Fi-станции по подключению к точке доступа.

Код подключения ESP32 к Wi-Fi (режим станции)

Обязательно укажите следующие переменные с собственными параметрами. Вам потребуется указать SSID и пароль вашей сети Wi-Fi в двойных кавычках. Кроме того, вы можете установить максимальное время повторной попытки, хотя по умолчанию оно равно 5.

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

Для начала мы подключим необходимые библиотеки, включая библиотеки FreeRTOS для генерации задержек, создания задач и групп событий. Библиотека esp_wifi.h используется для включения Wi-Fi-соединения, esp_event.h — для мониторинга событий Wi-Fi, а esp_log.h — для ведения журналов.

Укажите SSID и пароль вашей сети, к которой будет подключаться плата ESP32. В нашем случае мы указали SSID как «PTCL-08» и пароль как «44332211».

Кроме того, мы установили максимальное количество повторных попыток равным 10.

Далее мы объявляем переменную ‘s_wifi-event_group‘ для хранения созданной группы событий FreeRTOS. Эта группа событий FreeRTOS используется для оповещения о подключении к Wi-Fi.

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

Этот код использует информационное логирование. Функция логирования принимает два аргумента. Первый аргумент — это тег, а второй — отформатированная строка. Поэтому эта глобальная переменная будет полезна при вызове функций ESP_LOGI(). Здесь «wifi station» — это тег, который будет использоваться при логировании.

event_handler()

Затем у нас есть функция event_handler(), которая обрабатывает события Wi-Fi. Она выступает в качестве функции обратного вызова при возникновении события Wi-Fi или события IP.

Событие IP происходит, когда плата ESP32 подключается к нашей точке доступа, и маршрутизатор назначает ей IP-адрес. События IP могут быть одного из следующих типов. Но здесь мы используем только один — IP_EVENT_STA_GOT_IP.

Во-первых, когда происходят события Wi-Fi (WIFI_EVENT и WIFI_EVENT_STA_START), мы подключаем ESP32 к точке доступа. Для этого мы используем функцию esp_wifi_connect() .

Если плата ESP32 не может подключиться к точке доступа в течение установленного максимального количества попыток, она снова пытается подключиться к точке доступа и регистрирует сообщение «повторная попытка подключения к точке доступа». Однако, если ESP32 не может установить соединение с точкой доступа после истечения максимального количества попыток, она регистрирует сообщение «сбой подключения к точке доступа» и устанавливает бит WIFI_FAIL_BIT. Теперь, если плата ESP32 успешно подключается к точке доступа, это означает, что произошли оба события IP (IP_EVENT и IP_EVENT_STA_GOT_IP). В этом случае она выводит IP-адрес в качестве результата. Кроме того, она также устанавливает бит WIFI_CONNECTED_BIT.

wifi_init_sta()

Функция wifi_init_sta() будет вызываться внутри функции app_main() для инициализации Wi-Fi в режиме станции для ESP32.

Для начала создадим группу событий FreeRTOS для мониторинга соединения. Эта функция возвращает дескриптор группы событий.

ESP-IDF предоставляет полезный макрос ESP_ERROR_CHECK(), который используется для проверки наличия или отсутствия ошибки. Если функция, переданная в него, не возвращает ESP_OK, то мы проверяем наличие ошибки и записываем её в лог.

Здесь мы инициализируем lwIP с помощью функции esp_netif_init() и создаём задачу IwIP, также известную как задача TCP/IP. lwIP — это стек библиотек TCP/IP, предоставляемый ESP-IDF, который используется для выполнения различных протоколов, таких как TCP, UDP, DHCP и т. д.

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

Кроме того, следующая строка используется для инициализации Wi-Fi по умолчанию в режиме станции. Этот API используется для инициализации, а также регистрации обработчиков событий для интерфейса по умолчанию, которым в нашем случае является станция. Он создает экземпляр сетевого интерфейса, связывающий драйвер Wi-Fi и стек TCP/IP. Когда станция находится в процессе подключения к точке доступа, различные процессы автоматически обрабатываются с помощью этой функции.

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

Далее мы создаём два обработчика событий: один с именем ‘instance_any_id’ для всех событий Wi-Fi, а другой с именем ‘instance_any_ip’ — для событий, когда станция получает IP-адрес.

Далее, у нас есть два регистра для экземпляров обработчика событий, которые мы настроили. Таким образом, задача приложения может зарегистрироваться для обратного вызова, который будет прослушивать события для Wi-Fi и TCP/IP. Первое событие — «ESP_EVENT_ANY_ID», а второе — «IP_EVENT_STA_GOT_IP». Следовательно, она будет прослушивать все события Wi-Fi (ESP_EVENT_ANY_ID) и событие IP, когда станция получит свой IP-адрес (IP_EVENT_STA_GOT_IP). Таким образом, функция обратного вызова event_handler будет вызвана, если произойдет любое из этих двух событий.

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

В этой части мы задаём SSID и пароль сети, к которой хотим подключить наш ESP32, а также назначаем параметры безопасности.

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

Затем мы назначаем SSID и пароль нашей сети. Таким образом, драйвер Wi-Fi настраивается с использованием учетных данных сети точки доступа и режима Wi-Fi. После этого мы запускаем Wi-Fi-соединение с заданными параметрами.

На этом этапе в журнале информации появляется сообщение «wifi_init_sta finished». Процесс инициализации Wi-Fi в режиме станции завершен.

Далее приложение переходит в заблокированное состояние, ожидая установки одного из битов в группе событий. Это происходит после инициализации и запуска Wi-Fi. Приложение остается в заблокированном состоянии до тех пор, пока не будет установлено соединение Wi-Fi (контролируется битом WIFI_CONNECTED_BIT) или пока соединение Wi-Fi не будет разорвано в течение максимального количества попыток (контролируется битом WIFI_FAIL_BIT).

Если функция event_handler() устанавливает значение WIFI_CONNECTED_BIT, указывающее на успешное подключение ESP32 к точке доступа, то в информационном журнале будет указано, что соединение установлено с SSID и паролем указанной точки доступа. Если же функция event_handler() устанавливает значение WIFI_FAIL_BIT, указывающее на невозможность подключения ESP32 к точке доступа даже после достижения максимального количества попыток, то в информационном журнале будет указано, что соединение с SSID и паролем указанной точки доступа не удалось.

Кроме того, мы отменяем регистрацию двух обработчиков из цикла системных событий для IP_EVENT (базовое событие) и WIFI_EVENT (базовое событие). Функция esp_vent_handler_instance_unregister() принимает три параметра. Первый — это базовое событие. Второй — идентификатор события. Третий — объект экземпляра. Более того, мы также удаляем группу событий ‘s_wifi_event_group’ с помощью функции vEventGroupDelete(). Она была создана ранее с помощью вызова xEventGroupCreate().

app_main()

Внутри функции app_main() мы сначала инициализируем NVS, вызвав функцию nvs_flash_init(). Затем мы проверим, не содержит ли раздел NVS пустых страниц или содержит ли он данные в формате, отличном от текущей версии кода. Если хотя бы одно из этих условий выполняется, мы сотрём флэш-память NVS с помощью функции nvs_flash_erase() и инициализируем её заново.

Затем мы выведем в терминале “ESP_WIFI_MODE_STA” и вызовем функцию wifi_init_sta() для инициализации Wi-Fi в режиме станции.

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

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

После успешной прошивки кода вы сможете просмотреть все информационные журналы.

Сначала в терминале отображается сообщение «ESP_WIFI_MODE_STA». Затем следует «wifi_init_sta finished», что означает инициализацию Wi-Fi-станции. Далее можно просмотреть esp_netif_handlers, содержащий IP-адрес, маску и адрес шлюза. Затем в логе появляется сообщение о том, что Wi-Fi-станция получила IP-адрес, а затем и сам IP-адрес. Это показывает, что ESP32 успешно подключился к точке доступа. Наконец, можно увидеть SSID и пароль точки доступа, к которой подключилась плата.

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

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