Посмотреть исходный код на GitHub |
Инструмент OpenWeave Factory Provisioning Tool предоставляет удобные средства для предоставления постоянной информации о конфигурации каждого устройства на устройства с поддержкой Weave. Factory Provisioning Tool предназначен для использования в рамках производственной линии, которая маркирует отдельные устройства уникальной идентификационной и учетной информацией перед отправкой клиентам. Разработчики также могут использовать его для персонализации предсерийного оборудования, используемого в процессе разработки.
Теория работы
Целью OpenWeave Factory Provisioning Tool является внедрение выбранной информации о конфигурации в постоянное хранилище конфигурации устройства, где она может быть выбрана и использована во время выполнения микропрограммой устройства. Постоянная конфигурация устройства обычно хранится во внутренней флэш-памяти устройства, хотя подробности того, как именно хранятся данные и в каком формате, варьируются от платформы к платформе. Сам инструмент Factory Provisioning Tool не зависит от окончательного формата хранения и использует код встроенного ПО устройства для правильной записи данных. Пользовательский интерфейс инструмента также в значительной степени не зависит от типа настраиваемого оборудования, а это означает, что аналогичные производственные процессы могут использоваться в разных линейках продуктов, основанных на разных аппаратных платформах.
Factory Provisioning Tool предназначен для работы на хост-компьютере, который подключен к целевому устройству через какой-либо интерфейс отладки или управления, например, порт JTAG или SWD. Инструмент работает путем введения информации об обеспечении в оперативную память устройства в специально закодированной форме. Затем устройству дается команда на перезагрузку, после чего код, встроенный в прошивку устройства, находит закодированные данные, проверяет их целостность и записывает содержащиеся значения в постоянное хранилище в формате, подходящем для платформы.
Код на устройстве, который обнаруживает и обрабатывает введенные данные обеспечения, встроен в уровень устройства OpenWeave и может быть включен на любой поддерживаемой платформе. После включения код запускается автоматически при каждой загрузке устройства на раннем этапе процесса инициализации устройства. Код работает путем сканирования области оперативной памяти, зависящей от платформы. На платформах с небольшим объемом памяти (например, <1 МБ) сканирование охватывает всю доступную оперативную память.
При размещении в оперативной памяти данные обеспечения кодируются с помощью легко идентифицируемого префикса, что позволяет быстро найти их в процессе сканирования. Значение проверки целостности на основе криптографического хеша используется для подтверждения достоверности данных перед обработкой.
По умолчанию инструмент подготовки выбирает место в оперативной памяти, в которое необходимо вставить данные подготовки, в зависимости от платформы целевого устройства. Этот выбор можно переопределить с помощью аргумента инструмента. Как правило, не требуется, чтобы встроенное ПО устройства резервировало место в ОЗУ специально для приема данных обеспечения. Чаще всего данные подготовки записываются в область ОЗУ, выделенную для других целей, но обычно не используемую на ранних этапах процесса загрузки устройства. Обычным выбором является верх исходного системного стека или дальний конец арены кучи.
Factory Provisioning Tool использует набор внешних инструментов разработки для взаимодействия с целевым устройством. Конкретные используемые инструменты зависят от типа целевого устройства. В настоящее время поддерживаются два интерфейса устройства:
- отладочный зонд SEGGER J-Link, подключенный к порту JTAG или SWD устройства.
- последовательный порт USB, подключенный к Espressif ESP32
Интерфейс J-Link основан на инструменте SEGGER J-Link Commander (JLinkExe), который необходимо отдельно установить на хост-компьютере.
Интерфейс ESP32 основан на команде Espressif esptool.py, которая предоставляется как часть Espressif ESP-IDF SDK.
Типы информации, которая может быть предоставлена
Инструмент подготовки OpenWeave Factory способен предоставлять следующие типы информации:
- Серийный номер устройства
- Идентификатор устройства Weave, присвоенный производителем
- Сертификат Weave и закрытый ключ, присвоенные производителем.
- Код сопряжения Weave
- Номер версии продукта
- Дата изготовления
Хотя обычно устройству для правильной работы требуется вся вышеуказанная информация, не требуется предоставлять всю информацию одновременно. Таким образом, предоставление различных типов информации может происходить на разных этапах производственного процесса. Кроме того, на следующем этапе подготовки можно заменить ранее предоставленные значения новыми значениями.
Источники обеспечивающей информации
Информацию о инициализации устройства можно передать в Factory Provisioning Tool следующими способами:
- Аргументы командной строки
- Использование файла CSV подготовки
- Получая значения с сервера обеспечения Nest.
Командная строка
В простейшей форме информация о подготовке устройства указывается непосредственно в командной строке OpenWeave Factory Provisioning Tool. Например:
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
--pairing-code NESTUS --mfg-date 2019/04/01
Значения двоичных данных, такие как сертификат Weave и закрытый ключ, могут быть указаны либо в виде строк в формате Base64, либо в виде имен файлов, содержащих нужные данные в необработанной (двоичной) форме.
Ниже приведен полный список доступных аргументов командной строки.
Предоставление CSV-файла
Чтобы обеспечить массовую подготовку устройств, Factory Provisioning Tool также может считывать данные подготовки из файла данных подготовки в формате CSV. Ожидается, что столбцы этого файла соответствуют конкретным типам данных обеспечения, то есть Serial_Num
, Certificate
, Private_Key
и т. д. Строки в файле содержат отдельные значения для конкретных устройств, индексированных по идентификатору устройства Weave ( Device_Id
). Идентификатор конкретного устройства, подлежащего подготовке, должен быть указан в командной строке. Например:
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
--prov-csv-file ./dev-provisioning-data.csv
Поддерживаются следующие столбцы CSV:
Имя | Формат | Описание |
---|---|---|
Device_Id | 16 шестнадцатеричных цифр | Идентификатор устройства Weave. Должен присутствовать. |
Serial_Num | нить | Серийный номер устройства. |
Certificate | строка base-64 | Сертификат устройства Weave, присвоенный производителем. |
Private_Key | строка base-64 | Закрытый ключ Weave, назначенный производителем. |
Pairing_Code | нить | Сплетите код сопряжения. |
Product_Rev | целое число | Номер версии продукта. |
Mfg_Date | ГГГГ/ММ/ДД | Дата изготовления устройства. |
Столбцы могут появляться в файле CSV в любом порядке. Все столбцы являются необязательными, за исключением Device_Id
. Любые значения, отсутствующие в файле CSV, просто не предоставляются на устройстве.
Пользователь может указать отдельные значения обеспечения в командной строке в дополнение к файлу CSV, и в этом случае значения командной строки имеют приоритет над значениями в файле.
Поддержка формата файла CSV инструментом Factory Provisioning Tool совместима с выводом команды gen-provisioning-data
инструмента weave
.
Сервер подготовки Nest
Factory Provisioning Tool поддерживает получение выбранной информации об обеспечении с сервера обеспечения Nest с использованием протокола на основе HTTPS. Протокол сервера обеспечения может использоваться для получения сертификата устройства Weave, назначенного производителем, соответствующего закрытого ключа и кода сопряжения Weave с сервера обеспечения.
Сетевое расположение сервера подготовки указывается путем указания базового URL-адреса в командной строке инструмента подготовки. Желаемая информация для обеспечения выбирается путем указания идентификатора устройства Weave в командной строке. Например:
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
--prov-server https://192.168.172.2:8000/
Пользователь может указать отдельные значения обеспечения в командной строке в дополнение к URL-адресу сервера обеспечения. В этом случае значения, указанные в командной строке, имеют приоритет над значениями, возвращаемыми сервером.
Включение/отключение поддержки заводской настройки
Поддержка заводской подготовки OpenWeave в микропрограмме устройства контролируется параметром конфигурации времени компиляции WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING
. Эта опция включена по умолчанию. Эту функцию можно отключить, переопределив параметр в файле WeaveProjectConfig.h
приложения. Например:
#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0
В целом можно безопасно включать заводскую подготовку в микропрограмме производственного устройства при условии, что интерфейс отладки устройства соответствующим образом отключен на производственных устройствах. Этого можно добиться либо аппаратными средствами (например, перегоранием предохранителей в SoC), либо программными средствами (например, с помощью безопасного загрузчика, который блокирует доступ к отладке в рамках процесса загрузки).
Запуск инструмента заводской подготовки
Инструмент подготовки OpenWeave Factory поддерживает следующие параметры командной строки:
Вариант | Описание |
---|---|
--target <строка> | Тип целевого устройства. Варианты: nrf52840 , esp32. |
--load-addr <шестнадцатеричные цифры> | Адрес в памяти устройства, по которому будут записаны данные обеспечения. |
--verbose, -v | Отрегулируйте уровень детализации вывода. Используйте несколько аргументов для повышения многословности. |
--serial-num <строка> | Установите серийный номер устройства. |
--device-id <шестнадцатеричные цифры> | Установите идентификатор устройства, присвоенный производителем. |
--device-cert <base-64> | <имя-файла> | Установите сертификат устройства Weave, присвоенный производителем. |
--device-key <base-64> | <имя-файла> | Установите закрытый ключ устройства Weave, назначенный производителем. |
--pairing-code <строка> | Установите код сопряжения устройства. |
--product-rev <целое число> | Установите версию продукта для устройства. |
--mfg-date <ГГГГ/ММ/ДД> | сегодня | сейчас | Установите дату изготовления устройства. |
--jlink-cmd <имя-путь> | Путь к команде JLink. По умолчанию — «JLinkExe». |
--jlink-if SWD | JTAG | Тип интерфейса J-Link. По умолчанию SWD. |
--jlink-speed <целое число> | адаптивный | авто | Скорость интерфейса J-Link. |
--jlink-sn <строка> | Серийный номер датчика J-Link. |
--esptool-cmd <имя-путь> | Путь к команде esptool. По умолчанию — «esptool.py». |
--port <имя-путь> | Имя устройства COM-порта для ESP32. По умолчанию /tty/USB0. |
--speed <целое число> | Скорость передачи данных для COM-порта. По умолчанию 115200. |
--prov-csv-file <имя-файла> | Считайте данные подготовки устройства из CSV-файла подготовки. |
--prov-server <url> | Считайте данные подготовки устройства с сервера подготовки. |
--disable-проверка-сервера | При использовании HTTPS отключите проверку сертификата, предоставленного сервером обеспечения. |
Примеры
Следующая команда устанавливает определенные значения для идентификатора устройства, серийного номера, версии продукта и кода сопряжения. Дата изготовления установлена на текущую дату. Сертификат устройства и закрытый ключ настроены на проверочные значения, указанные в CSV-файле, поставляемом с исходным репозиторием openweave-core
.
./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000042 \
--serial-num JAYS_DEVICE_42 --product-rev 1 --pairing-code NESTUS --mfg-date today \
--prov-csv-file ~/projects/openweave-core/certs/development/device/test-dev-provisioning-data.csv