IoT
AWS

ESP32: OTA обновления в Amazon FreeRTOS

В статье рассказано об основах OTA обновления прошивки для ESP32 контроллера, работающего под управление Amazon FreeRTOS. Большое количество выдержек из документации позволит с нуля создать и загрузить прошивку в контроллер и запустить процесс обновления
1876
В избранное

Контроллер ESP32 поддерживает возможность безопасного OTA обновления встроенной прошивки при использовании Amazon FreeRTOS. Это дает следующие преимущества:

  • Возможность безопасного развертывания новой прошивки на ESP32 (для одного контроллера или их группы, с возможностью добавления новых устройств)
  • После развертывания новой прошивки происходит проверка ее подлинности и целостности
  • Безопасные обновления OTA поддерживаются контроллером ESP32 на аппаратном уровне

Как это работает

Рассмотрим, как это работает:

  • Образ прошивки (или содержимое любого другого раздела: файловой системы, данных конфигурации) предварительно загружается в корзину S3 на AWS.
  • Настраивается задание OTA AWS с подключением необходимых сертификатов (для демонстрационных целей сертификат может быть самоподписанным) и профилем подписи кода (схема безопасности для ESP32 - ECDSA + SHA256).
  • В прошивке контроллера должен быть включен агент OTA Amazon FreeRTOS и подключен сертификат, который отвечает за проверку образа обновления прошивки (по сути, это будет открытый ключ ECDSA).
  • Задание OTA AWS берет образ прошивки из корзины S3, подписывает его и отправляет его через MQTT + TLS небольшими порциями агенту OTA в контроллере.
  • Агент OTA записывает все полученные части прошивки в свое хранилище.
  • После окончания загрузки прошивки ее подпись проверяется контроллером и разрешается для загрузки.
  • В процессе загрузки агент OTA снова взаимодействует с заданием OTA AWS, проверяя работоспособность микропрограммы, если все в порядке, образ прошивки помечается как допустимый, разрешая загрузчику удаление всех старых экземпляров микропрограммы из хранилища микроконтроллера.

Процесс настройки в подробностях

Начало работы с ESP32

В этой главе приведены инструкции по началу работы с контроллеров ESP32 (Amazon рекомендует использовать ESP32-DevKitC или ESP32-WROVER-KIT).

Примечание

В настоящее время порт Amazon FreeRTOS для ESP32-WROVER-KIT и ESP DevKitC не поддерживает следующие функции:

  • Lightweight IP (LwIP).
  • Симметричная многопроцессорная обработка (SMP).

Общее представление

Раздел содержит базовые инструкции для выполнения следующих шагов по началу работы:

  1. Подключение платы к компьютеру.
  2. Установка программного обеспечения на компьютер для разработки и отладки встроенных приложений для вашей платы микроконтроллера.
  3. Компиляция демонстрационного приложения Amazon FreeRTOS для получения двоичного образа прошивки.
  4. Загрузка прошивки в контроллер и запуск приложения.
  5. Мониторинг и отладка приложения через последовательный порт.

Предварительные шаги

Прежде чем начать работу с Amazon FreeRTOS, необходимо настроить учетную запись AWS и дать нужные разрешения.

Порядок создания учетной записи AWS приведен в разделе  «Создание и активация учетной записи AWS».

Инструкция по добавлению пользователя IAM в учетную запись AWS, расположена в Руководстве пользователя IAM. Для работы Amazon FreeRTOS и передачи данных в AWS IoT нужно включить следующие политики IAM:

  • AmazonFreeRTOSFullAccess
  • AWSIoTFullAccess

Чтобы добавить нужную политику к пользователю IAM, потребуется выполнить следующие шаги:

  • Перейти к консоли IAM и на панели навигации выбрать «Users».
  • Ввести свое имя пользователя в текстовое поле поиска, а затем выбрать его из списка.
  • Выбрать Add permissions.
  • Выбрать Attach existing policies directly.
  • В поле поиска ввести требуемую политику, например AmazonFreeRTOSFullAccess, выбрать её из списка, а затем нажать Next: Review.
  • Выбрать Add permissions.

Настройка среды разработки

Чтобы работать с отладочной платой, вам необходимо скачать и установить набор инструментов.

Настройка Toolchain

Для настройки toolchain выберите одну из ссылок в соответствии с используемой операционной системой:

Примечание

Вам нужно будет остановиться перед ссылкой «Get ESP-IDF» в разделе «Next Steps»   и вернуться к инструкциям на этой странице. Если вы уже устанавливали ранее ESP-IDF,  перед продолжением убедитесь, что вы удалили переменную среды IDF_PATH  из конфигурации вашей системы.

Примечание

Версия 3.1.5 ESP-IDF (версия, используемая Amazon FreeRTOS) не поддерживает последнюю версию компилятора ESP32. Вы должны использовать компилятор, который совместим с версией 3.1.5 ESP-IDF (см. Ссылки выше). Чтобы проверить версию вашего компилятора, выполните команду "xtensa-esp32-elf-gcc --version".

Установка CMake

Система сборки CMake необходима для создания прошивки Amazon FreeRTOS. Для работы потребуется версия 3.13 и выше. Вы можете скачать последнюю версию CMake с CMake.org. Там доступны как исходные, так и двоичные дистрибутивы.

Для получения дополнительной информации об использовании CMake для разработки под Amazon FreeRTOS см. раздел Использование CMake с Amazon FreeRTOS.

Подключение платы к компьютеру

Для подключения платы через USB вам понадобятся драйверы CP210x USB to UART Bridge VCP или виртуального COM-порта FTDI. При необходимости вы можете скачать их с сайта Silicon Labs  и FTDI, соответственно. После их установки и подключения платы в вашей системе появится COM порт.

Загрузка и настройка Amazon FreeRTOS

После настройки среды разработки вы можете загрузить Amazon FreeRTOS из GitHub или из консоли Amazon FreeRTOS.

Настройка демоприложения Amazon FreeRTOS

  1. Если вы используете MacOS или Linux, откройте окно терминала. Если вы работаете в Windows, откройте mingwexe.
  2. Убедитесь, что у вас установлен Python 7.10 или новее, выполнив команду python --version. Установленная версия отобразится на экране. Если у вас не установлен Python, вы можете установить его с веб-сайта Python.
  3. Для запуска команд AWS IoT вам необходим интерфейс командной строки AWS (AWS CLI). Если вы работаете в Windows, используйте команду easy_install awscli для установки CLI AWS в среде mingw. Инструкции для MacOS и Linux приведены в разделе Установка интерфейса командной строки AWS.
  4. Выполните aws configure и настройте AWS CLI, указав свой идентификатор ключа доступа AWS, секретный ключ доступа и регион по умолчанию. См. раздел Конфигурирование интерфейса командной строки AWS.
  5. Установите AWS SDK для Python (boto3), используя следующую команду:
    • В Windows, в среде mingw32, выполните easy_install boto3
    • В macOS или Linux выполните pip install tornado nose --user, а затем pip install boto3 --user

Amazon FreeRTOS включает в себя скрипт SetupAWS.py, упрощающий настройку платы Espressif для подключения к AWS IoT. Чтобы задать настройки скрипта, откройте файл <amazon-freertos>/tools/aws_config_quick_start/configure.json и определите следующие атрибуты:

afr_source_dir - Полный путь к каталогу amazon-freertos на вашем компьютере. Убедитесь, что вы используете разделитель "/" для указания этого пути.

thing_name - Имя платы в AWS IoT.

wifi_ssid - SSID сети Wi-Fi.

wifi_password - Пароль для сети Wi-Fi.

wifi_security  Настройка безопасности для сети Wi-Fi.

Допустимые значения параметра:

  • eWiFiSecurityOpen (Открытая сеть)
  • eWiFiSecurityWEP (WEP)
  • eWiFiSecurityWPA (WPA)
  • eWiFiSecurityWPA2 (WPA2)

Запуск скрипта конфигурации

Если вы используете MacOS или Linux, откройте окно терминала. В Windows, выполните mingw32.exe. Затем перейдите в каталог <amazon-freertos>/tools/aws_config_quick_start и запустите команду python SetupAWS.py setup .

Скрипт выполнит следующие действия:

  • Создаст устройство IoT, сертификат и политику
  • Подключит политику IoT к сертификату, а сертификат к устройству IoT AWS
  • Занесет введенные ранее учетные записи в заголовочный файл aws_clientcredential.h
  • Отформатирует ваш сертификат и закрытый ключ и запишет их в aws_clientcredential.h

Прошивка и запуск демонстрационного проекта Amazon FreeRTOS

Будем использовать CMake для генерации файлов сборки, Make для сборки двоичного файла приложения и утилиту IDF Espressif для прошивки контроллера.

Сборка Amazon FreeRTOS под Windows

В Windows вы должны указать генератор сборки для CMake, в противном случае CMake по умолчанию будет использовать Visual Studio. Espressif официально рекомендует систему сборки Ninja (она совместима с операционными системами Windows, Linux и MacOS). Вы должны запускать команды CMake непосредственно в командной строке Windows. Запуск команд CMake в виртуальной среде Linux, такой как MSYS2 или WSL, не поддерживается.

Используйте CMake для генерации файлов сборки, а затем используйте Make для сборки приложения.

Для генерации файлов сборки демо-приложения с помощью CMake:

  1. Перейдите в корневой каталог вашей директории загрузки Amazon FreeRTOS.
  2. Используйте следующую команду для генерации файлов сборки:

cmake -DVENDOR=espressif -DBOARD=esp32_wrover_kit -DCOMPILER=xtensa-esp32 \-GNinja -S. -B your-build-directory

Примечание

Если вы хотите собрать приложение с возможностью отладки, добавьте флаг -DCMAKE_BUILD_TYPE=Debug к этой команде. Для генерации файлов сборки тестового приложения, добавьте флаг -DAFR_ENABLE_TESTS=1.

Для сборки приложения перейдите в каталог your-build-directory и выполните команду ninja или используйте интерфейс CMake:

cmake --build your-build-directory

Примечание

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

Прошивка и запуск Amazon FreeRTOS

Используйте утилиту IDF ( <amazon-freertos>/vendors/espressif/esp-idf/tools/idf.py) для прошивки контроллера, запуска приложения и просмотра логов.

Для стирания флеш-памяти перейдите в папку <amazon-freertos> и используйте команду:

./vendors/espressif/esp-idf/tools/idf.py erase_flash -B build

Для записи двоичного файл прошивки в контроллер можно использовать команду make flash или скрипт IDF ./vendors/espressif/esp-idf/tools/idf.py flash -B build

Команда для мониторинга:

./vendors/espressif/esp-idf/tools/idf.py monitor -p /dev/ttyUSB1 -B build

Поиск неисправностей

  • Если плата постоянно сбрасывается, попробуйте перед прошивкой стереть память, используя команду make erase_flash
  • Если вы видите ошибки при запуске idf_monitor.py, используйте Python версии 2.7
  • Необходимые библиотеки из ESP-IDF уже включены в Amazon FreeRTOS, поэтому нет необходимости загружать их извне. Если переменная окружения IDF_PATH установлена, мы рекомендуем ее очистить перед сборкой Amazon FreeRTOS
  • В Windows для сборки проекта может потребоваться 3-4 минуты. Вы можете использовать ключ -j4 команды make, чтобы сократить время сборки:
    • make flash monitor -j4
  • Если ваше устройство не может подключиться к AWS IoT, откройте файл aws_clientcredential.h и убедитесь, что в файле правильно определены переменные конфигурации. Параметр clientcredentialMQTT_BROKER_ENDPOINT[] должен выглядеть примерно так: <1234567890123>-ats.iot.<us-east-1>.amazonaws.com

Подробнее об устранении ошибок, связанных с началом работы с Amazon FreeRTOS можно прочитать в разделе Устранение неполадок при запуске.

Создание прошивки с поддержкой OTA

Теперь пройдем по шагам для получения действующего функционала обновления OTA на контроллере ESP32:

Чтобы использовать обновления OTA, вам необходимо выполнить следующие шаги:

Создание сертификата цифровой подписи для контроллера Espressif ESP32

Контроллеры Espressif ESP32 поддерживают самоподписанные сертификаты подписи кода SHA-256 с ECDSA.

Примечание

Чтобы создать сертификат для подписи кода, установите OpenSSL на свой компьютер. После установки OpenSSL убедитесь, что команда openssl назначена исполняемому файлу OpenSSL в командной строке и терминале.

Для импорта цифрового сертификата для подписи кода, закрытого ключа и цепочки сертификатов в диспетчер сертификатов AWS нужно будет использовать интерфейс командной строки AWS. Подробная информация об этой программе приведена в разделе Установка интерфейса командной строки AWS.

В рабочей папке создайте файл с именем cert_config.txt со следующим содержимым:

[ req ]
prompt             = no
distinguished_name = my_dn

[ my_dn ]
commonName = test_signer@amazon.com

[ my_exts ]
keyUsage         = digitalSignature
extendedKeyUsage = codeSigning

(Замените тестовый емайл test_signer@amazon.com на ваш реальный адрес электронной почты)

Сформируйте приватный ключ ECDSA для подписи кода:

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 \
-pkeyopt ec_param_enc:named_curve -outform PEM -out ecdsasigner.key

Создайте сертификат ECDSA для подписи кода:

openssl req -new -x509 -config cert_config.txt -extensions my_exts \
-nodes -days 365 -key ecdsasigner.key -out ecdsasigner.crt

Импортируйте сертификат, приватный ключ и цепочку сертификатов в AWS Certificate Manager:

aws acm import-certificate --certificate file://ecdsasigner.crt \
--private-key file://ecdsasigner.key

Команда отобразит ARN (Amazon Resource Name) для импортированного сертификата. Этот ARN потребуется при создании задания обновления OTA.

Примечание

Этот шаг был описан исходя из предположения, что вы собираетесь использовать для подписи своей прошивки средства AWS IoT. Разумеется, при необходимости, вы можете подписать образы прошивки самостоятельно.

Загрузка Amazon FreeRTOS с библиотекой OTA

Чтобы включить библиотеку OTA в конфигурацию Amazon FreeRTOS, которую вы загружаете с консоли, вы можете настроить предопределенную конфигурацию или создать конфигурацию для платформы, поддерживающей функции OTA. На странице конфигурации Configure Amazon FreeRTOS Software в разделе Libraries выберите OTA Updates. В разделе «Demo projects» вы можете включить пример проекта с поддержкой OTA обновления (подробная информация о демо-проекте приведена в разделе Демонстрационное приложение для беспроводных обновлений).

Установка прошивки с OTA на ESP32

Эта глава написана исходя из предположения, что вы уже выполнили подготовительные шаги, настроили среду разработки и сформировали сертификаты. Прежде чем пытаться выполнить обновление OTA, имеет смысл проверить работу MQTT, как описано на странице «Начало работы с Amazon FreeRTOS», чтобы убедиться, что плата и среда настроены правильно.

Прошивки платы

Откройте файл <amazon-freertos>/vendors/<vendor>/boards/<board>/aws_demos/config_files/aws_demo_config.h, закомментируйте строку #define CONFIG_MQTT_DEMO_ENABLED и раскомментируйте define CONFIG_OTA_UPDATE_DEMO_ENABLED.

Скопируйте сформированный ранее SHA-256/ECDSA сертификат подписи, кода в файл demos/include/aws_ota_codesigner_certificate.h. Он должен быть записан следующим образом.

static const char signingcredentialSIGNING_CERTIFICATE_PEM[] = "-----BEGIN
CERTIFICATE-----\n"
   ...base64 data...\n"

      -----END CERTIFICATE-----\n";

Создайте и прошейте контроллер, как это было описано ранее. После запуска make flash monitor вы должны увидеть примерно следующий лог сообщений (порядок некоторых сообщений может отличаться, т.к. приложение выполняет несколько задач одновременно):

I (28) boot: ESP-IDF v3.1-dev-322-gf307f41-dirty 2nd stage bootloader
I (28) boot: compile time 16:32:33
I (29) boot: Enabling RNG early entropy source...
I (34) boot: SPI Speed : 40MHzI (38) boot: SPI Mode : DIO
I (42) boot: SPI Flash Size : 4MB
I (46) boot: Partition Table:
I (50) boot: ## Label Usage Type ST Offset Length
I (57) boot: 0 nvs WiFi data 01 02 00010000 00006000
I (64) boot: 1 otadata OTA data 01 00 00016000 00002000
I (72) boot: 2 phy_init RF data 01 01 00018000 00001000
I (79) boot: 3 ota_0 OTA app 00 10 00020000 00100000
I (87) boot: 4 ota_1 OTA app 00 11 00120000 00100000
I (94) boot: 5 storage Unknown data 01 82 00220000 00010000
I (102) boot: End of partition tableI (106) esp_image: segment 0: paddr=0x00020020 vaddr=0x3f400020 size=0x14784 ( 83844) map
I (144) esp_image: segment 1: paddr=0x000347ac vaddr=0x3ffb0000 size=0x023ec ( 9196) load
I (148) esp_image: segment 2: paddr=0x00036ba0 vaddr=0x40080000 size=0x00400 ( 1024) load
I (151) esp_image: segment 3: paddr=0x00036fa8 vaddr=0x40080400 size=0x09068 ( 36968) load
I (175) esp_image: segment 4: paddr=0x00040018 vaddr=0x400d0018 size=0x719b8 (465336) map
I (337) esp_image: segment 5: paddr=0x000b19d8 vaddr=0x40089468 size=0x04934 ( 18740) load
I (345) esp_image: segment 6: paddr=0x000b6314 vaddr=0x400c0000 size=0x00000 ( 0) load
I (353) boot: Loaded app from partition at offset 0x20000
I (353) boot: ota rollback check done
I (354) boot: Disabling RNG early entropy source...
I (360) cpu_start: Pro cpu up.I (363) cpu_start: Single core mode
I (368) heap_init: Initializing. RAM available for dynamic allocation:
I (375) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (381) heap_init: At 3FFC0748 len 0001F8B8 (126 KiB): DRAM
I (387) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (393) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (400) heap_init: At 4008DD9C len 00012264 (72 KiB): IRAM
I (406) cpu_start: Pro cpu start user code
I (88) cpu_start: Starting scheduler on PRO CPU.
I (113) wifi: wifi firmware version: f79168c
I (113) wifi: config NVS flash: enabled
I (113) wifi: config nano formating: disabled
I (113) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE
I (123) system_api: Base MAC address is not set, read default base MAC address from BLK0 of EFUSE

...
2 302 [IP-task] vDHCPProcess: offer c0a86c13ip
3 303 [main] WiFi Connected to AP. Creating tasks which use network...
4 304 [OTA] OTA demo version 0.9.65 304 [OTA] Creating MQTT Client...
6 304 [OTA] Connecting to broker...
I (4353) wifi: pm start, type:0

I (8173) PKCS11: Initializing SPIFFS
I (8183) PKCS11: Partition size: total: 52961, used: 0
7 1277 [OTA] Connected to broker.
8 1280 [OTA Task] [prvSubscribeToJobNotificationTopics] OK: $aws/things/<Your_Thing_Name>/jobs/$next/get/accepted
I (12963) ota_pal: prvPAL_GetPlatformImageState
I (12963) esp_ota_ops: [0] aflags/seq:0x2/0x1, pflags/seq:0xffffffff/0x0
9 1285 [OTA Task] [prvSubscribeToJobNotificationTopics] OK:
$aws/things/<Your_Thing_Name>/jobs/notify-next
10 1286 [OTA Task] [OTA_CheckForUpdate] Request #0
11 1289 [OTA Task] [prvParseJSONbyModel] Extracted parameter [ clientToken:
0:<Your_Thing_Name> ]
12 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: execution
13 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: jobId
14 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: jobDocument
15 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: afr_ota
16 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: streamname
17 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: files
18 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: filepath
19 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: filesize
20 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: fileid
21 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: certfile
22 1289 [OTA Task] [prvParseJSONbyModel] parameter not present: sig-sha256-ecdsa
23 1289 [OTA Task] [prvParseJobDoc] Ignoring job without ID.
24 1289 [OTA Task] [prvOTA_Close] Context->0x3ffbb4a8
25 1290 [OTA] [OTA_AgentInit] Ready.
26 1390 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
27 1490 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
28 1590 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0
29 1690 [OTA] State: Ready Received: 1 Queued: 1 Processed: 1 Dropped: 0

[ ... ]

Контроллер ESP32 теперь находится в ожидании обновления OTA. Монитор ESP-IDF запускается командой make flash monitor (чтобы выйти, нужно нажать Ctrl +]).

Загруженное в контроллер демоприложение OTA выполняет следующие задачи:

  1. Инициализирует сетевой стек FreeRTOS и MQTT (см main.c.)
  2. Создает задачу OTA (vOTAUpdateDemoTask в aws_ota_update_demo.c.)
  3. Запускает MQTT-клиента, используя MQTT_AGENT_Create
  4. Подключается к брокеру AWS IoT MQTT с помощью MQTT_AGENT_Connect
  5. Вызывает создание задачи OTA OTA_AgentInit и регистрирует обратный вызов, который будет выполняться после завершения задачи OTA

Создание и настройка задачи OTA обновления

Создать задачу обновления прошивки в AWS можно несколькими способами, через веб интерфейс или через интерфейс командной строки AWS CLI. В рамках статьи будет рассмотрен только второй способ.

Цифровая подпись кода прошивки

Используя интерфейс командной строки AWS для выполнения OTA обновлений, вы можете подключить механизм подписи AWS IoT или подписать обновление прошивки самостоятельно. Список криптографических алгоритмов для создания подписи и хэширования, поддерживаемых AWS IoT, приведен в разделе Signing Configuration Overrides. Если вы хотите использовать криптографический алгоритм, который не поддерживается AWS IoT, вы можете подписать файл самостоятельно перед загрузкой в Amazon S3.

Подпись образа прошивки с помощью AWS IoT

Чтобы подписать образ прошивки с помощью механизмов AWS IoT, вы можете использовать AWS SDK или инструменты командной строки.

После установки и настройки средств подписи кода скопируйте образ неподписанной прошивки в корзину Amazon S3 и запустите задание подписи кода с помощью следующих команд консоли (команда put-signature-profile создает повторно используемый профиль для подписи кода, а команда start-signature-job запускает задание формирования подписи):

aws signer put-signing-profile \ 
   --profile-name <your_profile_name> \
    --signing-material certificateArn=arn:aws:acm::<your-region>:<your-aws-account-id>:certificate/<your-certificate-id> \
    --platform <your-hardware-platform> \
    --signing-parameters certname=<your_certificate_path_on_device>aws signer start-signing-job
   --source
's3={bucketName=
<your_s3_bucket>,key=<your_s3_object_key>,version=<your_s3_object_version_id>}' \ 
   --destination 's3={bucketName=<your_destination_bucket>}' \
    --profile-name <your_profile_name>

Примечание

Параметры <your-source-bucket-name> и <your-destination-bucket-name> могут ссылаться на одну и ту же корзину Amazon S3.

В командах put-signature-profile и start-signature-job используются следующие параметры:

source - Определяет расположение неподписанной прошивки в корзине S3

  • bucketName: Название корзины S3
  • key: Ключ (имя файла) вашей прошивки в S

version - Версия прошивки в S3. Версия отличается от версии прошивки. Вы можете найти номер версии, зайдя в консоль Amazon S3, выбрав корзину и в верхней части страницы, рядом с «Versions», нажав «Show».

destination - Расположение подписанной прошивки в корзине S3. Формат этого параметра совпадает с параметром source.

signing-material - ARN вашего сертификата для подписи кода. ARN формируется при импорте сертификата в ACM.

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

platform- Идентификатор аппаратной платформы, для которой создается обновление OTA. (Чтобы получить список доступных платформ, используйте команду aws signer list-signature-platform.)

После выполнения этих команд задание будет запущено и запишет подписанный образ прошивки в целевую корзину Amazon S3. Команда отобразит ARN и идентификатор задания, которые вам понадобятся позже. Дополнительную информацию о подписи кода смотри в разделе Подпись кода для AWS IoT .

Подпись прошивки вручную

Вы можете подписать прошивку самостоятельно и загрузить подписанный образ прошивки в корзину Amazon S3.

Создание потока обновления прошивки

Служба OTA Update отправляет обновления прошивки через сообщения MQTT. Для запуска механизма вы должны создать поток, содержащий подписанное вами обновление прошивки. Для этого нужно создать файл в формате JSON ( stream.json), идентифицирующий прошивку. Формат файла следующий.

[
  {
    "fileId":<your_file_id>,
    "s3Location":{
      "bucket":"<your_bucket_name>",
      "key":"<your_s3_object_key<"
    }
  }
]

В файле используются следующие атрибуты:

  • fileId - Произвольное целое число от 0 до 255, которое идентифицирует образ вашей прошивки
  • s3Location - Корзина и ключ для прошивки для потоковой передачи
    • bucket - Корзина Amazon S3, в которой хранится неподписанный образ прошивки
    • key - Имя файла подписанного образа прошивки в корзине Amazon S Это значение можно найти в консоли Amazon S3. Если для подписи кода был использован AWS IoT, то имя файла будет представлять собой GUID, сгенерированный на предыдущих шагах

Вот пример файла stream.json.


    { 
         "fileId":123,
          "s3Location": { 
              "bucket":"codesign-ota-bucket",
               "key":"48c67f3c-63bb-4f92-a98a-4ee0fbc2bef6
         } 
    }
]

Для создания потока используйте команду create-stream:

aws iot create-stream \ 
   --stream-id <your_stream_id> \
    --description <your_description>
   --files file://<stream.json>
   --role-arn <your_role_arn>

со следующими аргументами:

  • stream-id - Произвольная строка для идентификации потока
  • description - Необязательный параметр описания потока
  • files - Одна или несколько ссылок на файлы JSON из предыдущего абзаца
  • role-arn - Роль IAM, которая предоставляет доступ к корзине Amazon S3

Ключ Amazon S3 подписанного образа можно найти с помощью команды aws signer description-signature-job--job-id <my-job-id>, где my-job-id - идентификатор задания, полученный после выполнения команды create-signature-job.

... 
"signedObject": { 
   "s3": { 
     "bucketName": "ota-bucket", 
     "key": "7309da2c-9111-48ac-8ee4-5a4262af4429"
    }
  }
...

Создание OTA-обновления

Для создания задания обновления OTA используется команд create-ota-update.

aws iot create-ota-update \
    --ota-update-id "<my_ota_update>" \
    --target-selection SNAPSHOT \ 
   --description "<a cli ota update>" \
    --files file://<ota.json> \
    --targets arn:aws:iot:<your-aws-region>:<your-aws-account>:thing/<your-thing-name>
   --role-arn arn:aws:iam::<your-aws-account>:role/<your-ota-service-role>

со следующими параметрами:

ota-update-id - Произвольный идентификатор обновления OTA

target-selection - Одно из следующих значений:

  • SNAPSHOT: Задание прекращается после развертывания обновления для выбранного устройства или группы устройств
  • CONTINUOUS: Задание продолжает работать и будет выполнять обновление для всех устройств, вновь добавленных в группу

description - Произвольное описание обновления OTA

files - Ссылки на файлы JSON, содержащие данные об обновлении OTA. Полный список атрибутов приведен в оригинальной документации, обычно для стандартного сценария работы достаточно следующих параметров:

  • fileName - Полное имя файла образа прошивки
  • fileLocation - Содержит информацию об обновлении прошивки
    • stream - Поток, содержащий обновление прошивки
      • streamId - Идентификатор потока, использованный в команде CLI create-stream 
      • fileId - Идентификатор файла переданный в команде create-stream 
    • codeSigning - Содержит информацию о задании подписи кода
      • awsSignerJobId - Идентификатор задания, сгенерированный командой start-signature-job

targets - Один или несколько ARN, которые определяют устройства, которые будут обновлены

role-arn - ARN вашей роли

Вот пример файла, переданного в команду create-ota-update, которая использует подпись кода AWS IoT:

[
  { 
   "fileName": "firmware.bin",
   "fileLocation": { 
     "stream": {   
        "streamId": "004"
        "fileId":123
     
      }, 
      "codeSigning": {
         "awsSignerJobId": "48c67f3c-63bb-4f92-a98a-4ee0fbc2bef6"  
      }
   }
]

Примечание

Вообще команда create-ota-update может запускать задание подписи кода, создавать профиль и поток самостоятельно. Примеры таких команд приведены в документации.

Список активных обновлений OTA

Команда list-ota-updates позволяет получить список всех обновлений OTA.

aws iot list-ota-updates

Результат работы команды list-ota-updates выглядит следующим образом:

{
  "otaUpdates": [
         {
            "otaUpdateId": "my_ota_update2",
            "otaUpdateArn": "arn:aws:iot:us-west-2:123456789012:otaupdate/my_ota_update2",
           "creationDate": 1522778769.042
    },
    {
      "otaUpdateId": "my_ota_update1",
      "otaUpdateArn": "arn:aws:iot:us-west-2:123456789012:otaupdate/my_ota_update1",
      "creationDate": 1522775938.956
    },
    {
       "otaUpdateId": "my_ota_update",
       "otaUpdateArn": "arn:aws:iot:us-west-2:123456789012:otaupdate/my_ota_update",
      "creationDate": 1522775151.031
    }
  ]
}

Получение подробной информации об OTA обновлении

Команда get-ota-update позволяет получить статуса конкретного OTA-обновления:

aws iot get-ota-update --ota-update-id <your-ota-update-id>

Результат работы команды get-ota-update выглядит следующим образом:

{
  "otaUpdateInfo": {
    "otaUpdateId": "myotaupdate1",
    "otaUpdateArn":
    "arn:aws:iot:
us-west-2:123456789012:otaupdate/my_ota_update",
    "creationDate":
1522444438.424
    "lastModifiedDate":
1522444440.681,
    "description": "a test OTA update",
    "targets": [ 
     "arn:aws:iot:
us-west-2:123456789012:thing/myDevice"
    ], 
   "targetSelection": "SNAPSHOT", 
   "otaUpdateFiles": [
      {  
      "fileName": "
app.bin",
        "fileLocation": {  
        "stream": { 
           "streamId": "
003", 
           "fileId": 123  
        }  
      }  
   
    "codeSigning": {
          "awsSignerJobId": "
592932bb-24a1-4f91-8ddd-66145352ad19", 
         "customCodeSigning": {} 
       } 
     }  
  ], 
   "otaUpdateStatus": "
OTA-STATUS", 
   "awsIotJobId": "
f76da3c0_10eb_41df_9029_ba7abc20f609",  
  "awsIotJobArn": "arn:aws:iot:
us-west-
2
:123456789012:job/f76da3c0_10eb_41df_9029_ba7abc20f609"
  }
}

Атрибут otaUpdateStatus может иметь следующие значения:

  • CREATE_PENDING - Ожидается создание OTA-обновления
  • CREATE_IN_PROGRESS - OTA-обновление создается
  • CREATE_COMPLETE - OTA обновление создано
  • CREATE_FAILED - Не удалось создать OTA обновление
  • DELETE_IN_PROGRESS - OTA обновление удаляется
  • DELETE_FAILED - Не удалось удалить обновление OTA

Удаление данных, связанных с OTA обновлением

Интерфейс командной строки AWS можно использовать для удаления потоков, обновлений OTA и заданий IoT AWS, созданных во время обновления OTA.

Удаление OTA-потока

После создания OTA-обновления, AWS создает поток для разбиения прошивки на части для отправки через MQTT. Вы можете удалить этот поток командой delete-stream:

aws iot delete-stream --stream-id <your_stream_id>

Удаление OTA-обновления

При создании OTA-обновления создаются следующие элементы:

  • Запись в базе данных заданий на обновление OTA.
  • Задание AWS IoT для выполнения обновления.
  • Задания AWS IoT для каждого обновляемого устройства.

Команда delete-ota-update удаляет запись только в базе данных заданий обновлений OTA. Для удаления задания необходимо использовать команду delete-job.

Пример использования команды delete-ota-update для удаления обновления OTA:

aws iot delete-ota-update --ota-update-id <your_ota_update_id>

В команде могут использоваться следующие ключи:

ota-update-id - Идентификатор OTA-обновления для удаления

delete-stream - Удаляет поток, связанный с обновлением OTA

force-delete-aws-job - Удаляет задание AWS IoT, связанное с обновлением OTA. Если этот ключ не установлен и задание находится в In_Progress состоянии, задание не удаляется.

Удаление задания IoT, созданного для обновления OTA

Amazon FreeRTOS создает задание AWS IoT для выполнения OTA-обновления. Отдельное задания также создается для каждого устройства, на котором нужно будет выполнить обновление прошивки. Команду  delete-job можно использовать для удаления задания и связанных с ним выполнений задания:

aws iot delete-job --job-id <your-job-id --no-force

Параметр no-force указывает, что нужно удалять только те задания, которые находятся в терминальном состоянии (COMPLETED или CANCELLED). Для удаления заданий в прочих состояниях нужно передать параметр --force.

Заключение

Под управлением Amazon FreeRTOS контроллер ESP32 может использовать один и тот же механизм проверки встроенного ПО для обеспечения безопасной загрузки и обновления прошивки. Поскольку в обоих случаях используется одинаковый алгоритм ECDSA + SHA256, то один и тот же открытый ключ можно применить как для проверки образа прошивки OTA, так и для проверки образа прошивки при загрузке.
Настоятельно рекомендуется использовать оба механизма безопасности в конечных продуктах.

Используемые материалы:

Производитель: Espressif Systems (shanghai) Pte. Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP-WROVER-KIT
ESP-WROVER-KIT
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2736589 ИНФО RND
Доступно: 100 шт. 3510,00
отладочная плата, предназначенная для создания высокопроизводительных устройств на базе модулей ESP32-WROVER. Плата отличается богатым набором периферии: LCD, RGB-светодиоды, Micro SD Card, разъем для подключения камеры, по 4 Мбайт Flash и PSRAM. Для загрузки и отладки программ предлагается использовать JTAG. Подключение по USB осуществляется с помощью моста USB-UART FT2232HL.
ESP-WROVER-KIT 3510,00 от 2 шт. 3190,00 от 3 шт. 3070,00 от 5 шт. 2930,00 от 12 шт. 2780,00
7 шт.
(на складе)
93 шт.
(под заказ)
ESP32-DEVKITC-32D
ESP32-DEVKITC-32D
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2791131 ИНФО
Доступно: 265 шт. от 1 шт. от 1017,20
Выбрать
условия
поставки
Отладочная плата ESP32-DEVKITC-32D от компании  ESPRESSIF SYSTEMS
ESP32-DEVKITC-32D от 1 шт. от 1017,20
265 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-DEVKITC-32U
ESP32-DEVKITC-32U
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796548 ИНФО RND
Доступно: 93 шт. от 1 шт. от 1123,34
Выбрать
условия
поставки
Малогабаритная отладочная плата на основе модуля ESP32-WROOM-32D с 4МБ Flash, созданного на базе флагманской SoC ESP32-D0W, представляющей собой двухъядерный беспроводной процессор, поддерживающий WiFi 802.11 b/g/n (802.11n до 150 Mbps), Bluetooth v4.2 BR/EDR и BLE.
ESP32-DEVKITC-32U от 1 шт. от 1123,34
93 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-DEVKITC-S1
ESP32-DEVKITC-S1
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796549 ИНФО PDF RND
Доступно: 38 шт. от 1 шт. от 1100,19
Выбрать
условия
поставки
ESP32 General Development Kit, embeds ESP32-SOLO-1, 32Mbit
ESP32-DEVKITC-S1 от 1 шт. от 1100,19
38 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-DEVKITC-VB
ESP32-DEVKITC-VB
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796550 ИНФО PDF RND
Доступно: 453 шт. от 1 шт. от 1176,49
Выбрать
условия
поставки
Небольшая отладочная плата общего назначения на основе встроенного WiFi-BT-BLE MCU модуля ESP32-WROVER-B с 4 МБ внешней SPI Flash, 8 МБ PSRAM и со встроенной PCB антенной.
ESP32-DEVKITC-VB от 1 шт. от 1176,49
453 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-DEVKITC-32D-F
ESP32-DEVKITC-32D-F
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796552 ИНФО RND
Доступно: 427 шт. от 1 шт. от 1000,64
Выбрать
условия
поставки
SP32 General Development Kit, embeds ESP32-WROOM-32D, female header connector
ESP32-DEVKITC-32D-F от 1 шт. от 1000,64
427 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-PICO-KIT
ESP32-PICO-KIT
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2796573 ИНФО RND
Доступно: 117 шт. от 1 шт. от 998,96
Выбрать
условия
поставки
отладочный набор, позволяющий ознакомиться с возможностями SiP-микросхемы ESP32-PICO-D4. Кроме самой беспроводной микросхемы на плате расположены Flash 4 Мбайт, кнопки, светодиоды, разъем Micro-USB для отладки. Стоит отметить, что данный набор может использоваться как автономно, так и в составе более сложной системы, так как все выводы микросхемы ESP32-PICO-D4 доступны через разъемы, расположенные по бокам платы.
ESP32-PICO-KIT от 1 шт. от 998,96
117 шт.
(под заказ)
Выбрать
условия
поставки
ESP32-PICO-KIT-F
ESP32-PICO-KIT-F
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 3174768
Поиск
предложений
отладочный набор, позволяющий ознакомиться с возможностями SiP-микросхемы ESP32-PICO-D4. Кроме самой беспроводной микросхемы на плате расположены Flash 4 Мбайт, кнопки, светодиоды, разъем Micro-USB для отладки. Стоит отметить, что данный набор может использоваться как автономно, так и в составе более сложной системы, так как все выводы микросхемы ESP32-PICO-D4 доступны через разъемы, расположенные по бокам платы.
ESP32-PICO-KIT-F
-
Поиск
предложений

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

  • ()