ESP-Jumpstart: быстрое создание приложений на ESP32. Часть 2

Вторая статья из цикла статей, посвященных контроллеру ESP32, подготовленных инженерами Espressif, рассказывает о том, как дать возможность пользователю сконфигурировать контроллер для работы в домашней сети, где хранить настройки и как осуществить сброс контроллера в заводское состояние
6942
В избранное

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

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

В рамках этой статьи будет показано, как изменить прошивку таким образом, чтобы конечный пользователь мог настроить учетные данные своей сети Wi-Fi в работающем устройстве. Кроме того, мы реализуем функционал «Сброс к заводским настройкам», который позволит удалить пользовательские данные из устройства. Исходный код для этой статьи приведен в папке 4_network_config/ проекта esp-jumpstart.

Обзор процесса настройки

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

Процесс настройки сети

Рис. 1. Процесс настройки сети

Для передачи учетных данных можно использовать несколько различных каналов. В проекте ESP-Jumpstart реализована поддержка следующих механизмов передачи данных:

  • SoftAP
  • Bluetooth с низким энергопотреблением (BLE)

У каждого из них есть свои плюсы и минусы. "Лучшего" способа сделать это не существует, некоторые разработчики выбирают один из них, другие - другой, в зависимости от того, что они ценят больше.

SoftAP

При использовании механизма SoftAP контроллер запускает собственную точку доступа Wi-Fi. Пользователь может подключить свой смартфон к этой сети и использовать созданное соединение для передачи учетных данных Wi-Fi в контроллер. Многие устройства на рынке сегодня используют такой механизм. В этом случае для настройки сети пользователь должен:

  • переключить Wi-Fi своего телефона на сеть, поднятую розеткой;
  • запустить приложение на телефоне;
  • ввести в приложении учетные данные домашней сети Wi-Fi, которые затем будут переданы в розетку через соединение SoftAP.

С точки зрения пользовательского опыта, первый шаг требует, чтобы пользователь изменил настройки Wi-Fi сети своего телефона. Это может сбивать с толку некоторых пользователей. Изменение сети Wi-Fi программно с помощью приложения для телефона не всегда возможно (iOS и некоторые варианты Android не позволяют это делать приложениям). Но преимущество такого метода состоит в том, что он очень надежен (SoftAP - это просто реализация Wi-Fi сети) и не требует большого количества дополнительного кода (и занимаемого места) в прошивке устройства.

BLE

При использовании Bluetooth с низким энергопотреблением (BLE) ваша розетка будет видна как BLE устройство. Телефоны, находящиеся поблизости, смогут увидеть это устройство и предложить пользователю установить с ним BLE-соединение. Затем это соединение будет использоваться для передачи учетных данных в контроллер. В таком варианте подключения пользователю не нужно задумываться о переключении между сетями Wi-Fi. Кроме того, как iOS, так и Android позволяют телефонному приложению сканировать находящиеся поблизости устройства BLE и подключаться к ним через приложение. Это существенно облегчает взаимодействие с конечным пользователем.

Однако одним из побочных эффектов использования конфигурации сети через BLE является то, что этот вариант работы потребует кода для реализации Bluetooth соединения. Это означает, что ваши требования к флэш-памяти увеличатся, поскольку увеличится размер прошивки. В режиме конфигурации сети BLE также будет потреблять оперативную память до завершения настройки сети.

Демо приложение

Прежде чем углубляться в детали рабочего процесса настройки сети, давайте попробуем выполнить настройку в демо приложении (см. каталог 4_network_config/).

  • Перейдите в приложение 4_network_config
  • Соберите прошивку и загрузите ее в контроллер
  • По умолчанию прошивка запускается в режиме BLE
  • Установите приложение на телефон для настройки сети.
    Android: https://play.google.com/store/apps/details?id=com.espressif.provble,
    iOS: https://apps.apple.com/in/app/esp-ble-provisioning/id1473590141
  • Запустите приложение и следуйте указаниям мастера
  • По окончании настройки устройство будет подключено к домашней сети Wi-Fi
  • Если вы сейчас перезагрузите контроллер, он НЕ войдет в режим настройки сети. Вместо этого он сразу подключится к настроенной сети Wi-Fi. Это тот результат, который мы хотим получить

Для пользователей ESP8266

ESP8266 поддерживает только инициализацию на основе SoftAP, так как у него нет встроенного Bluetooth. Для выполнения подключения используйте приложение ESP SoftAP Provisioning.

Модуль Unified Provisioning

Espressif предоставляет модуль Unified Provisioning для помощи в настройке пользовательской сети. Когда этот модуль вызывается из исполняемого файла прошивки, он берет на себя весь процесс настройки пользовательских параметров (запуск/ остановка интерфейса softAP/ BLE, безопасный обмен учетными данными, их хранение для последующего использования и т. д.). Модуль обладает следующими возможностями:

  • Расширяемый протокол. Протокол предоставляет разработчикам возможность отправлять пользовательские данные в процессе настройки контроллера. Формат представления данных оставлен на усмотрение приложения.
  • Транспортная гибкость: протокол может использовать Wi-Fi (сервер SoftAP + HTTP) или BLE в качестве транспорта. Инфраструктура модуля предоставляет возможность легко добавлять поддержку для любого другого транспорта, если он поддерживает двухстороннюю связь.
  • Гибкая настройка схемы безопасности. Понятно, что для каждого варианта использования может потребоваться отдельная схема безопасности для защиты передаваемых данных. Для некоторых приложений достаточно работы с SoftAP, защищенным WPA2. Или приложения могут считать транспорт по умолчанию небезопасным и реализовывать защиту на уровне приложения. Унифицированная структура инициализации модуля позволяет приложению выбирать безопасность по своему усмотрению.
  • Компактное представление данных: протокол использует Google Protocol Buffers для передачи данных для настройки сессии и Wi-Fi. Решение обеспечивает компактное представление данных и возможность их анализа. Обратите внимание, что это представление данных не является обязательным для конкретного приложения, и разработчики могут выбрать представление по своему выбору.

Более подробно о входящих в состав инфраструктуры настройки контроллера компонентах можно получить по следующим ссылкам:

Код

Код для вызова единой системы конфигурации через прошивку показан ниже:

wifi_prov_mgr_init(config);
if (wifi_prov_mgr_is_provisioned(&provisioned) != ESP_OK) {

     return;
}
  if (provisioned != true) {
    /* Start provisioning service */
    wifi_prov_mgr_start_provisioning(security, pop,
                service_name, service_key);
} else {
    /* Start the station */
    wifi_init_sta();
}

Компонент wifi_provisioning предоставляет оболочку для унифицированного интерфейса настройки. Обратите внимание на несколько моментов:

  • Вызов Wifi_prov_mgr_init инициализирует менеджер конфигурации Wi-Fi. Этот вызов API должен быть выполнен перед вызовом любых других функций API этого модуля.
  • В wifi_prov_mgr_is_provisionined () проверяется наличие сохраненных учетных данных сети Wi-Fi. Обычно эти настройки хранятся в разделе флэш памяти, называемом NVS . Подробнее о NVS будет рассказано позже.
  • Если учетные данные сети Wi-Fi недоступны, микропрограмма запускает процесс конфигурации с помощью вызова функции wifi_prov_mgr_start_provisioning () . Этот вызов API позаботится обо всем, в частности:
    1. Будет запущен транспорт SoftAP или BLE в соответствии с настройками.
    2. Будет обеспечен безопасный прием любых сетевых учетных данных из приложения на телефоне.
    3. Принятые учетные данные будут сохранены для последующего использования в NVS.
    4. После успешного получения настроек будут деинициализированы все компоненты (SoftAP, BLE, HTTP-сервер и т. д.), которые использовались менеджером конфигурации. Это гарантирует, что после завершения инициализации вся использованная модулем память будет освобождена.
  • Если в NVS были обнаружены настройки сети Wi-Fi, запускается интерфейс станции с помощью вызова wifi_init_sta (). 

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

Унифицированный модуль конфигурации должен обрабатывать события интерфейса Wi-Fi. Следовательно, в обработчик событий нужно добавить вызов функции wifi_prov_mgr_event_handler, которая позаботится об этом:

esp_err_t event_handler(void *ctx, system_event_t *event)
{
     wifi_prov_mgr_event_handler(ctx, event);
 
     switch(event->event_id) {
     case SYSTEM_EVENT_STA_START:
...
...
...

Настройка модуля

В приведенном выше на несколько абзацев коде мы в первой строке инициализируем модуль конфигурации. Для инициализации должна использоваться структура конфигурации, пример которой приведен ниже:

/* Configuration for the provisioning manager */
wifi_prov_mgr_config_t config = {
    .scheme = wifi_prov_scheme_ble,
    .scheme_event_handler = WIFI_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BTDM,
    .app_event_handler = {
        .event_cb = prov_event_handler,
        .user_data = NULL
    }
};
wifi_prov_mgr_init(config);

Параметры следующие:

  1. Scheme: Выбирает транспорт, который будет использоваться модулем настройки для конфигурации. Возможные значения SoftAP (wifi_prov_scheme_softap) или BLE (wifi_prov_scheme_ble).
  2. Scheme Event Handler: Определяет обработчик событий, характерный для выбранной схемы.

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

  • WIFI_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BTDM - освобождает память, занятую как под обычный BT, так и под BLE (BTDM). Используется, когда основное приложение вообще не требует использования Bluetooth
  • WIFI_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BLE - освобождает только память. Используется, когда основное приложение использует обычный BT интерфейс.
  • WIFI_PROV_SCHEME_BLE_EVENT_HANDLER_FREE_BT - освобождает только память обычного. Используется, когда основное приложение использует BLE. В этом случае освобождение памяти происходит сразу после инициализации менеджера.
  • WIFI_PROV_EVENT_HANDLER_NONE - Обработчик не используется. Обычно такой вариант применяется, когда схема инициализации отличается от BLE (т. е., SoftAP или Console), или когда основное приложение хочет обрабатывать восстановление памяти самостоятельно, или когда для работы требуется как BLE, так и классический BT.
  1. Обработчик событий приложений: приложение может захотеть использовать события инициализации для определения своих параметров. Обработчик для перехвата этих событий может быть зарегистрирован в этом разделе. Здесь также могут быть определены любые пользовательские данные, которые будут переданы обработчику событий.

После вызова функции инициализации и проверки отсутствия сохраненных данных настроек сети в памяти, выполняется собственно запуск менеджера конфигурации:

/* Start provisioning service */
wifi_prov_mgr_start_provisioning(security, pop, service_name, service_key);

Давайте теперь рассмотрим параметры, используемые при вызове этого метода API:

  1. Безопасность. Модуль настроек конфигурации в настоящее время поддерживает два метода защиты для передачи учетных данных: security0 и security1. Security0 не использует какой либо защиты данных при обмене учетными данными. Этот режим в основном используется на этапе разработки. Security1 включает настройки безопасности, которые состоят из безопасного рукопожатия с использованием обмена ключами X25519, подтверждения владения (pop) и AES-CTR для шифрования/ дешифрования сообщений.
  2. Подтверждение владения (Proof of Possession, pop): когда пользователь включает новое интеллектуальное устройство, оно запускается в режиме конфигурации с включенным BLE или SoftAP для конфигурации. Как убедиться, что устройство настраивает именно владелец устройства, а не его соседи? Этот параметр служит именно для этих целей. В следующей главе будет подробно рассказано об этой опции.
  3. Имя устройства(Service Name): когда пользователь запускает приложение для настройки сети, он увидит список ненастроенных устройств, находящихся рядом с ним. Имя устройства - это имя, под которым конкретное устройство будет видно пользователю. Вы можете выбрать имя, которое хорошо ассоциируется с функционалом вашего устройства (abc-термостат). Обычной практикой является использование какого-либо уникального или случайного элемента в имени. Это помогает в случаях, когда может быть несколько ненастроенных устройств, которые пользователь настраивает одновременно. В режиме работы SoftAP имя устройства отображается как SSID точки доступа Wi-Fi. В режиме BLE этот параметр задает именно имя устройства BLE.
  4. Сервисный ключ: Сервисный ключ является необязательным параметром, который, если используется, служит паролем для защиты транспорта от несанкционированного доступа. Этот параметр используется, если выбран транспорт SoftAP, и вы хотите, чтобы точка доступа Wi-Fi была защищена паролем. В режиме BLE эта опция игнорируется, так как BLE использует простой метод сопряжения.

Доказательство владения

Когда пользователь запускает новое интеллектуальное устройство, контроллер поднимает свою сеть (BLE или SoftAP) для конфигурации. Как убедиться, что устройство настраивает именно владелец устройства, а не его соседи?

В устройство можно заложить логику работы, которая потребует, что бы пользователь, настраивающий устройство, предоставил доказательство того, что он действительно владеет устройством, которое он настраивает. Доказательство владения может быть предоставлено путем выполнения каких-либо физических действий на устройстве или путем ввода некоторого уникального случайного ключа, который входит в комплект поставки, или путем ввода кода, отображенного на экране устройства, если оно, конечно, оборудовано таковым.

При изготовлении каждое устройство может быть запрограммировано с помощью уникального случайного ключа. Этот ключ затем может быть предоставлен унифицированному модулю конфигурации в качестве опции подтверждения владения. Когда пользователь настраивает устройство с помощью приложения на телефоне, введенный пользователем ключ передается на устройство. Модуль конфигурации проверяет, что переданный и сохраненный в прошивке ключи совпадают, а затем подтверждает конфигурацию.

Дополнительные детали

Более подробную информацию о модуле конфигурации можно получить по адресу: https://docs.espressif.com/projects/esp-idf/en/release-v3.3/api-reference/provisioning/provisioning.html. и https://docs.espressif.com/projects/esp-idf/en/release-v3.3/api-reference/provisioning/wifi_provisioning.html

NVS: постоянное хранилище значений ключей

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

NVS спроектирован таким образом, чтобы быть устойчивым к повреждению метаданных при сбое питания. Он также заботится о выравнивании износа флэш-памяти, распределяя записи по разделу NVS.

Разработчики приложений также могут использовать NVS для хранения любых дополнительных данных, которые вы хотите сохранить как часть прошивки вашего приложения. Любые типы данных, такие как целые числа, строки с нулевым символом в конце и двоичные объекты, могут храниться в памяти NVS. Этот раздел может использоваться для хранения любых пользовательских настроек вашего продукта. Для чтения и записи значений в NVS используются следующие функции.

/* Store the value of key 'my_key' to NVS */
nvs_set_u32(nvs_handle, "my_key", chosen_value);
 
/* Read the value of key 'my_key' from NVS */
nvs_get_u32(nvs_handle, "my_key", &chosen_value);

Более подробную информацию о хранилище NVS можно найти по адресу: https://docs.espressif.com/projects/esp-idf/en/release-v3.3/api-reference/storage/nvs_flash.html.

Сброс до заводских настроек

Одним из самых распространенных функционалов, который встречается практически в любом настраиваемом пользователем продукте, является сброс до заводских настроек. В нашем случае, если пользовательская конфигурация сохранена в NVS, как обсуждалось выше, восстановление заводских настроек может быть достигнуто простым стиранием раздела NVS.

Обычно это действие вызывается долгим нажатием кнопки, доступной на устройстве. Это можно легко реализовать с помощью функции iot_button_().

Код

В рассматриваемом сейчас приложении 4_network_config функционал обработки длительного нажатия можно повесить на ту же кнопку, что занимается переключением выхода.

/* Register 3 second press callback */
iot_button_add_on_press_cb(btn_handle, 3, button_press_3sec_cb, NULL);

Этот код приведет к вызову коллбэк функции button_press_3sec_cb () всякий раз, когда интервал между нажатием и отпусканием кнопки, связанной с btn_handle, превышает 3 секунды. (Инициализация btn_handle была сделана в предыдущей статье).

В самой функции обратного вызова нужно записать следующий код:

static void button_press_3sec_cb(void *arg)
{
    nvs_flash_erase();
    esp_restart();
}

Этот код сначала стирает все содержимое NVS, а затем выполняет перезагрузку контроллера. Поскольку NVS теперь не содержит информации, при очередной загрузке устройства будет запущен режим конфигурирования.

Теперь пользователь может настроить контроллер через приложение на телефоне для работы в своей домашней сети. После сохранения настроек розетка подключится к заданной сети. У пользователя также есть возможность стереть эти настройки длительным нажатием кнопки на устройстве.

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

Предыдущие главы:

  1. ESP-Jumpstart: быстрое создание приложений на ESP32. Часть 1

Источник:  https://docs.espressif.com/projects/esp-jumpstart/

Производитель: Espressif Systems (shanghai) Pte. Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP32-D0WDQ6
ESP32-D0WDQ6
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2590835 ИНФО PDF DT
Доступно: 3862 шт. от 9 шт. от 627,93
Выбрать
условия
поставки
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WDQ6 от 9 шт. от 627,93
3862 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-DEVKITC
ESP32-DEVKITC
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2610249 ИНФО
Поиск
предложений
Набор начального уровня для работы с семейством модулей ESP32-WROOM.
ESP32-DEVKITC
-
Поиск
предложений
ESP32-S0WD
ESP32-S0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739124 ИНФО PDF RND
Поиск
предложений
Система-на-кристалле (SoC) на базе 32-битного процессора Xtensa® 160 МГц 200 DMIPS
ESP32-S0WD
-
Поиск
предложений
ESP32-D0WD
ESP32-D0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739127 ИНФО PDF RND DT
Доступно: 6233 шт. 202,00
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WD 202,00 от 5 шт. 192,00 от 24 шт. 170,00 от 98 шт. 162,00 от 251 шт. 157,00
370 шт.
(на складе)
5863 шт.
(под заказ)
ESP32-WROOM-32U [4MB]
ESP32-WROOM-32U [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739131 ИНФО PDF RND DT
Доступно: 5715 шт. 407,00
SMD Module ESP32-WROOM-32U, ESP32-D0WD, 32Mbits SPI flash, UART mode, U.FL antenna connector
ESP32-WROOM-32U [4MB] 407,00 от 3 шт. 387,00 от 12 шт. 342,00 от 49 шт. 326,00 от 125 шт. 315,00
479 шт.
(на складе)
5236 шт.
(под заказ)
ESP32-SOLO-1
ESP32-SOLO-1
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739132 ИНФО PDF RND DT
Доступно: 2534 шт. 435,00
Wi-Fi+BT+BLE-модуль, построенный на базе одноядерной микросхемы ESP32-S0WD. Как отмечалось выше, ESP32-S0WD – младший представитель семейства ESP32. Несмотря на это, ESP32-SOLO-1 может применяться в широком спектре приложений – от малопотребляющих датчиков (наиболее оптимальный вариант), до приложений с беспроводной передачей звука, ESP32-S0WD, Single Core, 32Mbits SPI flash, UART Mode
ESP32-SOLO-1 435,00 от 2 шт. 413,00 от 11 шт. 366,00 от 46 шт. 348,00 от 117 шт. 337,00
436 шт.
(на складе)
2098 шт.
(под заказ)
ESP32-PICO-D4
ESP32-PICO-D4
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739133 ИНФО PDF RND DT
Доступно: 4606 шт. от 1 шт. от 438,76
Выбрать
условия
поставки
SIP module ESP32 with 4MByte Flash, Dual Core MCU, Wi-Fi & Bluetooth Combo, LGA48-pin, 7*7mm
ESP32-PICO-D4 от 1 шт. от 438,76
4606 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-DEVKITC-VB
ESP32-DEVKITC-VB
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796550 ИНФО PDF OBS
Поиск
предложений
Небольшая отладочная плата общего назначения на основе встроенного WiFi-BT-BLE MCU модуля ESP32-WROVER-B с 4 МБ внешней SPI Flash, 8 МБ PSRAM и со встроенной PCB антенной.
ESP32-DEVKITC-VB
-
Поиск
предложений
ESP32-LyraT
ESP32-LyraT
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796570 ИНФО RND
Доступно: 182 шт. 2340,00
Смарт аудио платформа ESP32-LyraT. Плата представляет собой практически готовое решение для производительных и беспроводных аудио устройств.
ESP32-LyraT 2340,00 от 2 шт. 2070,00 от 8 шт. 1970,00 от 22 шт. 1910,00 от 44 шт. 1870,00
9 шт.
(на складе)
173 шт.
(под заказ)
ESP32-LyraTD-MSC
ESP32-LyraTD-MSC
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796571 ИНФО
Поиск
предложений
Смарт аудиоплатформа ESP32-LyraTD-MSC.
ESP32-LyraTD-MSC
-
Поиск
предложений
ESP32-PICO-KIT
ESP32-PICO-KIT
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796573 ИНФО RND
Доступно: 379 шт. 1270,00
Макетная плата позволяет ознакомиться с возможностями SiP-микросхемы ESP32-PICO-D4. Кроме самой беспроводной микросхемы на плате расположены Flash 4 Мбайт, кнопки, светодиоды, разъем Micro-USB для отладки. Стоит отметить, что данная плата может использоваться как автономно, так и в составе более сложной системы, так как все выводы микросхемы ESP32-PICO-D4 доступны через разъемы, расположенные по бокам платы.
ESP32-PICO-KIT 1270,00 от 4 шт. 1120,00 от 15 шт. 1070,00 от 40 шт. 1030,00 от 80 шт. 1010,00
97 шт.
(на складе)
282 шт.
(под заказ)

Сравнение позиций

  • ()