Як ESP32 підключається до Wi-Fi без екрана та клавіатури?

SmartConfig дозволяє смартфону передати облікові дані мережі безголовому пристрою ESP32 через повітря. Чіпу не потрібно знати SSID чи пароль заздалегідь.

SmartConfig — технологія налаштування, яку спочатку розробила Texas Instruments. Вона вирішує просту проблему: новий Wi-Fi-модуль не має дисплея, кнопок чи способу ввести назву мережі.

Додаток у смартфоні розсилає облікові дані у спеціальних пакетах. ESP32 перехоплює ці пакети та витягує SSID із паролем. Потім пристрій приєднується до точки доступу. Процес починається, коли прошивка викликає esp_smartconfig_start із структурою конфігурації. Радіо переходить у режим promisciuous-сканування. Воно перемикає канали, поки не виявить закодований broadcast від телефону. Коли цільовий канал знайдено, пристрій фіксується на ньому. Далі він декодує корисне навантаження і генерує подію. Подія містить SSID, пароль, опціональний BSSID та токен для підтвердження телефону. Після відправки підтвердження прошивка має викликати esp_smartconfig_stop, щоб звільнити внутрішні буфери — незалежно від того, вдалося підключитися чи ні.

Три протоколи за одним API

ESP32 підтримує три різні варіанти SmartConfig. Airkiss прийшов із екосистеми WeChat. ESPTouch — оригінальний метод TI. ESPTouch v2 з'явився разом із бібліотекою SmartConfig версії 3.0. Прошивка дізнається версію під час виконання через esp_smartconfig_get_version. Рядок версії — єдиний спосіб перевірити підтримку v2 на конкретному чипі.

ESPTouch v2 використовує зовсім інший алгоритм кодування. Документація стверджує: це прискорює налаштування. Також з'являються AES-шифрування і зарезервоване поле даних для користувацьких навантажень. Ключ шифрування має бути рівно 16 байт і передається у структурі запуску. Якщо ключ заданий, телефонний додаток зашифрує broadcast; ESP32 розшифровує його «на льоту».

Airkiss і обидва варіанти ESPTouch увімкнюються одночасно. Перелік smartconfig_type_t містить чотири значення: SC_TYPE_ESPTOUCH, SC_TYPE_AIRKISS, SC_TYPE_ESPTOUCH_AIRKISS і SC_TYPE_ESPTOUCH_V2. За замовчуванням поєднуються класичний ESPTouch і Airkiss. Перемикання на v2 окремо або додавання його до набору вимагає виклику esp_smartconfig_set_type до esp_smartconfig_start.

Шифрування додає випадковий IV

Починаючи з версії бібліотеки SmartConfig 3.0.2, ESPTouch v2 використовує випадковий ініціалізаційний вектор для AES. Структура запуску містить булевий прапорець esp_touch_v2_enable_crypt. Коли шифрування увімкнено, а опція випадкового IV вимкнена, IV дорівнює нулю — це зберігає сумісність зі старими телефонними додатками. Коли опція випадкового IV увімкнена, IV стає випадковим значенням для кожного сеансу налаштування.

Компроміс чіткий: передача випадкового IV пристрою, що налаштовується, подовжує загальний час provisioning. ESP32 визначає режим, перевіряючи прапорець всередині отриманого пакета provisioning. Окремий handshake не потрібен. Зарезервоване поле даних, яке з'явилося у v2, залишається доступним незалежно від налаштувань шифрування; його довжина і вміст визначаються додатком.

Таймаути та швидкий режим

Глобальний таймаут керує цілою процедурою. esp_esptouch_set_timeout приймає значення від 15 до 255 секунд зі зміщенням 45 секунд. Таймер стартує, коли пристрій досягає стану SC_STATUS_FIND_CHANNEL. Якщо таймаут вичерпано, SmartConfig автоматично перезапускається з початку.

Швидкий режим — окремий перемикач. esp_smartconfig_fast_mode(true) треба викликати до esp_smartconfig_start. Він вимагає відповідного телефонного додатку. Документація зазначає сумісність режимів, але не описує різницю в кодуванні.

Отримання даних та події

Після успішної події SC_EVENT_GOT_SSID_PSWD прошивка отримує зарезервовані дані, надіслані телефонним додатком ESPTouch v2. esp_smartconfig_get_rvd_data копіює до довжини наданого буфера у виділений масив. Структура події також несе IPv4-адресу телефону та байт-токен, яким ESP32 надсилає остаточне підтвердження.

Чотири події позначають етапи provisioning. SC_EVENT_SCAN_DONE сигналізує про завершення початкового сканування каналів. SC_EVENT_FOUND_CHANNEL означає, що канал цільової AP ідентифіковано. SC_EVENT_GOT_SSID_PSWD доставляє облікові дані та метадані. SC_EVENT_SEND_ACK_DONE підтверджує, що пакет підтвердження покинув радіо. Прошивка переходить у звичайний station-режим після третьої події і викликає esp_smartconfig_stop після четвертої.

Структура стартової конфігурації включає булеве enable_log. Якщо встановлено, бібліотека виводить детальну діагностику у серійну консоль. Макрос за замовчуванням SMARTCONFIG_START_CONFIG_DEFAULT ініціалізує всі поля стандартними значеннями: логування вимкнено, v2-шифрування вимкнено, вказівник ключа null.

Універсально кращого методу provisioning не існує. Вибір залежить від телефонних додатків, доступних кінцевим користувачам, і від потреби у шифрованій передачі облікових даних. Площа API невелика — сім функцій, дві структури, два переліки. Але поєднання вибору протоколу та шифрування з налаштуванням таймаутів покриває широкий спектр сценаріїв безголового розгортання.

Джерела, за якими написано статтю

  • "Espressif ESP-IDF Programming Guide
    https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_smartconfig.html"

Читайте також