ESP32 OTA без прошивки кода на устройство

Итак, я пытаюсь реализовать способ OTA для одновременного обновления около 100 устройств. Я много раз гуглил и всегда видел, что у вас запущен веб-сервер и вы загружаете файл .bin на само устройство, а затем прошиваете этот файл на устройство.

Это нормально, если у вас есть только 1-5 устройств, а не когда у вас есть сотни граничных устройств, которые вам нравятся, не имеют доступа к ним физически и / или через локальный IP-адрес (поскольку они находятся по всей стране).

У них есть доступ в Интернет и они общаются с сервером через MQTT, но мы также можем выполнять некоторые вызовы API.

Основная цель, которую я хочу достичь, заключается в следующем:

ESP загружается с каким-то прошитым загрузчиком, который посещает заранее определенный адрес сервера в загрузчике. Ответ - это двоичный файл, который должно запустить пограничное устройство. Бинарный файл загружается в ОЗУ устройства (или, если необходимо, на SD-карту или другую флеш-память). Когда двоичный файл загружается, он запускается НЕ ЗАПИСЫВАЕТСЯ НА УСТРОЙСТВО. Я хочу, чтобы когда я беру устройство и хочу реконструировать бинарный файл, я могу реконструировать только загрузчик, а не основной код, который будет извлечен с сервера.

Таким образом, основные вопросы;

  • Это вообще возможно? (Я делаю специальную плату, чтобы при необходимости на ней можно было разместить множество специальных компонентов)
  • Как мне это сделать? Я вообще не могу понять, как это происходит тогда
  • я что-нибудь упускаю?

Спасибо!


person Robin    schedule 13.04.2021    source источник
comment
Так что же происходит, когда устройство теряет мощность? Что запускает при перезапуске?   -  person romkey    schedule 13.04.2021
comment
Когда устройство теряет питание, весь код, извлеченный с сервера, должен исчезнуть. когда вы возвращаете устройству его мощность, ему необходимо повторно загрузить его двоичный файл и выполнить   -  person Robin    schedule 13.04.2021
comment
Если вы хотите защитить свой код, вам просто нужно зашифровать флеш-память, у esp32 уже есть инструменты для этого. В противном случае вам придется реализовать весь этот функционал самостоятельно.   -  person Daniel    schedule 14.04.2021


Ответы (1)


ESP32 может выполнять код из своего ОЗУ инструкций - должна быть возможность делать все, что вы хотите, с ограничением, что вы можете использовать до 128 КиБ (+32 КиБ при работе с одноядерным процессором) для кода вашего приложения. См. эта статья для удобного для программиста описания модели памяти. Однако этого будет достаточно для прошивки с простой функциональностью, но такие вещи, как MQTT через TLS, будет сложно уместить в 160 КиБ кода.

Также обратите внимание, что ESP IDF не поддерживает такую ​​экстравагантность, поэтому вы будете писать много низкоуровневого кода, начиная с ваших собственных сценариев компоновщика и инициализации среды выполнения C. Если вы подготовлены и у вас есть бюджет, продолжайте - это будет интересный и сложный проект.

В противном случае я бы рекомендовал оценить решение Espressif для защиты кода во флэш-памяти от чтения. Вы можете зашифровать весь Flash с использованием AES256 (все расшифровывается на лету) в сочетании с Secure Boot V2, чтобы гарантировать запуск только утвержденных образов. В любом подходе есть уязвимости, но так вы, вероятно, закончите работу со своим продуктом на порядок быстрее.

Что касается выполнения OTA для 100 устройств - с помощью нескольких строк кода на стороне сервера вы можете использовать свое MQTT-соединение для выдачи команды триггера обновления для всех из них одновременно. Не имеет значения, как реализован OTA - все они будут рады загрузить новый образ и обновиться параллельно.

person Tarmo    schedule 14.04.2021
comment
Итак, я прихожу к выводу: это невозможно? Я даже спрашиваю себя, можно ли прочитать .bin, который был прошит на esp? - person Robin; 16.04.2021
comment
Запуск приложения из ОЗУ возможен (если у вас есть то, что нужно), но в большинстве случаев это нецелесообразно. Что касается чтения .bin во Flash, здесь есть два аспекта. SPI Flash и микроконтроллер - это отдельные микросхемы, и шина SPI между ними открыта для физического доступа, что означает, что вы всегда можете прочитать содержимое Flash без особых усилий. Однако, если вы зашифруете содержимое Flash, это будет бесполезно без ключа дешифрования, который скрыт внутри микроконтроллера. Взломать это намного труднее (не невозможно, как и все незакрепленные механизмы защиты, просто сложно). - person Tarmo; 16.04.2021