Перевод статьи с небольшими правками для ESP-IDF 4.4.5.
В этом руководстве показано, как настроить soft-AP с использованием модуля Espressif и ESP-IDF. Оно охватывает процесс создания проекта, настройки Wi-Fi и обработки событий подключения с помощью event loop и логирования.
В любом Wi-Fi-приложении первым шагом является установление соединения между устройством и маршрутизатором. В терминологии Wi-Fi устройство называется станцией (STA), а маршрутизатор — точкой доступа (AP). В большинстве случаев модуль Espressif работает как станция, подключаясь к существующему маршрутизатору. Однако перед этим пользователь должен пройти процесс provisioning — то есть ввести SSID и пароль маршрутизатора.
Существует несколько способов provisioning, но наиболее распространённые — это через Bluetooth и Wi-Fi. При использовании Wi-Fi процесс обычно выглядит следующим образом:
Модуль Espressif запускает временную точку доступа (soft-AP).
Пользователь подключается к этой точке доступа.
Модуль показывает веб-страницу, где запрашивает SSID и пароль.
Пользователь вводит данные.
Модуль завершает работу soft-AP и переходит в режим станции, подключаясь к маршрутизатору.
Даже если ваше приложение в основном работает в режиме станции, вам может понадобиться настроить soft-AP для этапа provisioning.
Поскольку provisioning — частая задача, это руководство будет дополнено ещё одним, где показано, как настроить HTTP-сервер для получения SSID и пароля от пользователя.
Для реальных приложений лучше использовать более надёжное решение, например Unified Provisioning framework. Он позволяет настраивать ESP-устройства через Wi-Fi (SoftAP) или Bluetooth LE с использованием различных схем безопасности.
Что нужно до начала
Убедитесь, что вы:
Можете скомпилировать и прошить пример
hello_world. Используйте либоidf.py, либо расширение ESP-IDF для VS Code.Имеете отладочную плату Espressif. В примере используется ESP32-C3-DevkitM-1, но подойдёт любая плата от Espressif, (прим. в моем случае - это ESP32-S3).
Понимаете разницу между Wi-Fi точкой доступа (AP) и станцией (STA).
Создание нового проекта
Создайте проект на основе
hello_world.Установите целевой чип .
Выберите правильный порт (например,
/dev/tty.usbserial-11320).Соберите, прошейте и запустите монитор.
Затем обновите содержимое hello_world_main.c следующим кодом:
#include #include "sdkconfig.h" void app_main(void) { printf("Hello tutorial!\n"); }
Переименуйте файл в basic_soft_ap.c и обновите CMakeLists.txt:
idf_component_register(SRCS "basic_http_server.c" PRIV_REQUIRES INCLUDE_DIRS "")
Если переименовывать файл в VSCode, то он автоматически обновит имя в
CMakeLists.txt.
Сделайте полную очистку проекта, пересоберите и снова прошейте. Каждый раз при изменении CMakeLists.txt требуется делать полную очистку.
На практике - не всегда необходимо делать полную очистку, т.к. билд занимает много времени
Отключите NVS, чтобы избежать предупреждений в menuconfig. Найдите и снимите галочки с опций, связанных с NVS.

В VSCode можно быстро открыть menuconfig перейдя в расширение ESP-IDS, а затем выбрать SDK Configuration Editor.

Работа с логами
Логи — очень полезный инструмент отладки. Для использования:
#include "esp_log.h" static const char* TAG = "my_module"; ESP_LOGI(TAG, "Server connection with code %d", server_code);
Уровни логов:
ESP_LOGE— ошибкаESP_LOGW— предупреждениеESP_LOGI— информацияESP_LOGD— отладкаESP_LOGV— подробный вывод
Запуск soft-AP
Задайте параметры AP:
#define ESP_WIFI_SSID "esp_tutorial" #define ESP_WIFI_PASS "test_esp" #define ESP_WIFI_CHANNEL 1 #define MAX_STA_CONN 2
В реальных проектах используйте NVS для хранения данных!
Инициализируйте стек IP:
esp_netif_init(); esp_netif_create_default_wifi_ap();
Инициализируйте event loop:
Создайте функцию wifi_init_softap, в которой выполните всю настройку.
#include #include #include "sdkconfig.h" #include "esp_log.h" #include "esp_wifi.h" #define ESP_WIFI_SSID "esp_demo" #define ESP_WIFI_PASS "esp_demo" #define ESP_WIFI_CHANNEL 1 #define MAX_STA_CONN 2 static const char *TAG = "Basic soft-AP"; static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data) { ESP_LOGI(TAG, "Event %d!\n", event_id); //%ld заменено на %d из-за ошибки комп. } void wifi_init_softap() { esp_netif_init(); esp_event_loop_create_default(); esp_netif_create_default_wifi_ap(); wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); // always start with this esp_wifi_init(&cfg); esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL, NULL); wifi_config_t wifi_config = { .ap = { .ssid = ESP_WIFI_SSID, .ssid_len = strlen(ESP_WIFI_SSID), .channel = ESP_WIFI_CHANNEL, .password = ESP_WIFI_PASS, .max_connection = MAX_STA_CONN, .authmode = WIFI_AUTH_WPA2_PSK // .pmf_cfg = { В версии 4.4.5 такой опции нет // .required = true, // }, }, }; esp_wifi_set_mode(WIFI_MODE_AP); esp_wifi_set_config(WIFI_IF_AP, &wifi_config); esp_wifi_start(); ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s channel:%d", ESP_WIFI_SSID, ESP_WIFI_PASS, ESP_WIFI_CHANNEL); } void app_main(void) { printf("Hello soft-ap tutorial!\n"); wifi_init_softap(); }
Обработайте Wi-Fi события:
static void wifi_event_handler(void* arg, esp_event_base_t event_base, int32_t event_id, void* event_data){ printf("Event nr: %ld!\n", event_id); //в случае ошибки изменить %ld }
Соберите, прошейте, запустите монитор. Подключитесь к сети esp_tutorial со смартфона. В терминале появится Event nr: 14!, что означает WIFI_EVENT_AP_STACONNECTED.

Вывод консоли до подключения смартфона
I (1567) Basic soft-AP: wifi_init_softap finished. SSID:esp_demo password:esp_demo channel:1 I (1567) Basic soft-AP: Event 12!
Вывод консоли после подключения
I (2307617) wifi:new:<1,1>, old:<1,1>, ap:<1,1>, sta:<255,255>, prof:1 I (2307617) wifi:station: 04:b1:67:37:a2:a2 join, AID=1, bgn, 40U I (2307747) Basic soft-AP: Event 14! I (2307867) esp_netif_lwip: DHCP server assigned IP to a station, IP is: 192.168.4.2 I (2308647) wifi:idx:2 (ifx:1, 04:b1:67:37:a2:a2), tid:0, ssn:13, winSize:64
Заключение
Вы узнали, как:
Создать новый проект на базе
hello_worldИнициализировать библиотеку
esp_netifНастроить event loop
Запустить soft-AP
Проверить события подключения
Это основа для построения более сложных Wi-Fi приложений: клиентов MQTT, HTTP-серверов и других сетевых решений.
