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

Статический (фиксированный) IP-адрес на ESP32 с использованием ESP-IDF

В данной статье мы рассмотрим как установить статический IP-адрес для вашей платы разработки ESP32. Мы будем использовать пример скетча, предоставленный ESP-IDF, и объясним API, используемые для назначения статических IP-адресов. Фиксированный IP-адрес решает проблему изменения IP-адреса или назначения нового IP-адреса маршрутизатором при каждой перезагрузке платы ESP32. Например, если вы используете веб-сервер или веб-клиент на ESP32, наличие статического/фиксированного IP-адреса будет полезно. Вы можете следовать этому руководству, чтобы назначить статический/фиксированный IP-адрес с помощью ESP-IDF.

Также ранее на нашем сайте мы рассматривали установку статического IP-адреса на ESP32 с помощью Arduino IDE.

Пример для установки статического IP-адреса на ESP32

Мы будем использовать пример скетча, загруженный на GitHub по следующей ссылке ( https://github.com/espressif/esp-idf/tree/master/examples/protocols/static_ip ).

В этом примере используются примеры ESP-IDF из вкладки «Протоколы» под названием «static_ip».

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

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

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

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

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

Это откроет созданный нами проект во вкладке «Проводник». Внутри папки проекта находится несколько папок. Это относится ко всем проектам, которые вы будете создавать с помощью ESP-IDF Explorer. Создайте новый файл с именем «Kconfig.projbuild» в основной папке. Скопируйте файл из этого места в созданный файл.

Конфигурация проекта

Для начала перейдём к menuconfig. Щёлкните по значку, показанному ниже. Откроется редактор конфигурации ESP-IDF SDK.

Прокрутите вниз и откройте Example Configuration (пример конфигурации). Здесь мы можем установить параметры конфигурации для этого примера в соответствии с нашими потребностями. Это включает в себя SSID Wi-Fi, пароль Wi-Fi, максимальное количество попыток, статический IP-адрес, статическую маску подсети, статический адрес шлюза, выбор DNS-сервера и включение проверки разрешения DNS. Здесь вы можете увидеть, что по умолчанию ESP-IDF использует максимальное количество попыток равное 5, статический IP-адрес 192.168.4.2, статическую маску подсети 255.255.255.0, статический адрес шлюза 192.168.4.1 и DNS-сервер в качестве адреса шлюза.

Вы можете изменить эти параметры по своему усмотрению, а затем нажать кнопку «Сохранить», расположенную вверху. Установите следующие параметры:

  • SSID сети Wi-Fi, пароль сети Wi-Fi, максимальное количество попыток подключения.
  • Статический IP-адрес.
  • Статический адрес маски подсети.
  • Статический адрес шлюза.
  • В разделе «Выбор DNS-сервера» вы можете выбрать либо «Использовать адрес шлюза в качестве DNS-сервера», либо «Установить значение DNS-сервера вручную».
  • Если вы выберете вариант настройки DNS-сервера вручную, вам будет предложено указать адрес основного DNS-сервера и адрес резервного DNS-сервера.
  • Вы можете установить флажок «Включить проверку разрешения DNS» и указать имя хоста для разрешения.

Мы присвоим нашей плате ESP32 статический IP-адрес 192.168.4.1, который является адресом по умолчанию.

Код для установки статического IP-адреса на ESP32

В папке main находится исходный код, то есть файл main.c будет находиться здесь. Внутри main.c мы напишем наш программный код. Перейдите в  main > main.c  и откройте его. Здесь мы определим функции и программный код. Скопируйте код по этой ссылке.

Это наш файл main.c.

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

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

Затем мы определили переменные, которые составляют примеры параметров конфигурации, которые мы установили ранее. Эти переменные будут обращаться к значениям, которые мы задали ранее в menuconfig, поэтому значения уже определены. Однако, если вы хотите определить эти параметры в файле main.c, то укажите их в двойных кавычках. Например: #define EXAMPLE_WIFI_SSID “PTCL-08”

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

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

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

Настройка DNS-сервера и статического IP-адреса

Функция example_set_dns_server() отвечает за установку DNS-сервера путем вызова функции esp_netif_set_dns_info(). Функция esp_netif_set_dns_info() принимает три параметра. Первый параметр — это дескриптор экземпляра esp-netif. Второй параметр — это тип DNS-сервера (ESP_NETIF_DNS_MAIN, ESP_NETIF_DNS_BACKUP, ESP_NETIF_DNS_FALLBACK), который необходимо установить. Третий параметр — это адрес DNS-сервера, который необходимо установить.

Функция example_set_static_ip() назначает статический IP-адрес. Сначала она останавливает DHCP-клиент, если он включен для данного интерфейса, используя функцию esp_netif_dhcpc_stop(), которая принимает в качестве параметра дескриптор экземпляра esp-netif. Если функция esp_netif_dhcpc_stop() не возвращает ESP_OK, она выводит в терминал сообщение «Не удалось остановить DHCP-клиент». После этого она обращается к значениям статического IP-адреса, статической маски подсети и статического адреса шлюза, уже определенным пользователем, и вызывает функцию esp_netif_set_ip_info(). Эта функция используется для установки статического IP-адреса на интерфейсе. Функция принимает два параметра. Первый параметр — это дескриптор экземпляра esp-netif, а второй — информация об IP-адресе, установленном на конкретном интерфейсе. Если все пройдет успешно, терминал выведет статический IP-адрес, маску подсети и адрес шлюза.

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()  .

Если произошли события Wi-Fi WIFI_EVENT и WIFI_EVENT_STA_CONNECTED, то будет вызвана функция example_set_static_ip(arg). Это назначит плате ESP32 статический IP-адрес. Если плата 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 и т. д.

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

Кроме этого, функция esp_netif_create_default_wifi_sta() используется для инициализации 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-адрес, маску и адрес шлюза. Затем в логе появляется информация о статическом IP-адресе 192.168.4.2 , присвоенном плате. Это показывает, что ESP32 успешно подключился к точке доступа и получил статический IP-адрес.

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

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