Инструмент инициализации OpenWeave Factory

Посмотреть исходный код на GitHub

Инструмент OpenWeave Factory Provisioning Tool предоставляет удобные средства для предоставления постоянной информации о конфигурации для каждого устройства на устройствах с поддержкой Weave. Средство Factory Provisioning Tool предназначено для использования в рамках процесса производственной линии, в ходе которого отдельные устройства маркируются уникальным идентификатором и учетными данными перед отправкой клиентам. Он также может использоваться разработчиками для персонализации опытного оборудования, используемого в процессе разработки.

Теория Операции

Целью OpenWeave Factory Provisioning Tool является вставка выбранной информации о конфигурации в постоянное хранилище конфигурации устройства, где она может быть получена и использована микропрограммой устройства во время выполнения. Постоянная конфигурация устройства обычно хранится во внутренней флэш-памяти устройства, хотя сведения о том, как именно хранятся данные и в каком формате, различаются от платформы к платформе. Сам Factory Provisioning Tool не зависит от окончательного формата хранилища и полагается на код в прошивке устройства для правильной записи данных. Пользовательский интерфейс инструмента также в значительной степени не зависит от типа конфигурируемого оборудования, а это означает, что аналогичные производственные процессы могут использоваться в линейках продуктов, основанных на разных аппаратных платформах.

Factory Provisioning Tool предназначен для работы на хост-компьютере, который подключен к целевому устройству через какой-либо интерфейс отладки или управления, например порт JTAG или SWD. Инструмент работает, вводя информацию о предоставлении в оперативную память устройства в специально закодированном виде. Затем устройству предписывается перезапуститься, после чего код, встроенный в прошивку устройства, находит закодированные данные, проверяет их целостность и записывает содержащиеся значения в постоянное хранилище в формате, подходящем для платформы.

Код на устройстве, который обнаруживает и обрабатывает введенные данные подготовки, встроен в уровень устройства OpenWeave и может быть включен на любой поддерживаемой платформе. После включения код запускается автоматически при каждой загрузке устройства на ранней стадии процесса инициализации устройства. Код работает путем сканирования области оперативной памяти, зависящей от платформы. На платформах со скромным объемом памяти (например, <1M) сканирование охватывает всю доступную оперативную память.

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

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

Factory Provisioning Tool использует набор внешних инструментов разработки для взаимодействия с целевым устройством. Конкретные используемые инструменты зависят от типа целевого устройства. В настоящее время поддерживаются два интерфейса устройств:

  • отладочный зонд SEGGER J-Link, подключенный к порту JTAG или SWD устройства
  • последовательный порт USB, подключенный к Espressif ESP32

Интерфейс J-Link основан на инструменте SEGGER J-Link Commander (JLinkExe), который должен быть отдельно установлен на хост-компьютере.

Интерфейс ESP32 основан на команде Espressif esptool.py, которая предоставляется как часть ESP-IDF SDK Espressif.

Типы информации, которые могут быть предоставлены

Инструмент OpenWeave Factory Provisioning Tool может предоставлять следующие типы информации:

  • Серийный номер устройства
  • Идентификатор устройства 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 и закрытый ключ, могут быть указаны либо в виде строк base-64, либо в виде имен файлов, содержащих нужные данные в необработанном (двоичном) виде.

Ниже приведен полный список доступных аргументов командной строки.

Подготовка 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), либо программными (например, с помощью защищенного загрузчика, который блокирует отладочный доступ как часть процесса загрузки).

Запуск Factory Provisioning Tool

OpenWeave Factory Provisioning Tool поддерживает следующие параметры командной строки:

Вариант Описание
--цель <строка> Тип целевого устройства. Варианты: nrf52840 , esp32
--load-addr <шестнадцатеричные цифры> Адрес в памяти устройства, по которому будут записываться данные инициализации.
--подробный, -v Отрегулируйте уровень детализации вывода. Используйте несколько аргументов для увеличения детализации.
--serial-num <строка> Установите серийный номер устройства.
--device-id <шестнадцатеричные цифры> Установите идентификатор устройства, назначенный производителем.
--device-cert <base-64> | <имя-файла> Установите назначенный производителем сертификат устройства Weave.
--device-key <base-64> | <имя-файла> Установите назначенный производителем закрытый ключ устройства Weave.
--pairing-код <строка> Установите код сопряжения устройства.
--product-rev <целое число> Установите версию продукта для устройства.
--mfg-date <ГГГГ/ММ/ДД> | сегодня | в настоящее время Установите дату изготовления устройства.
--jlink-cmd <путь-имя> Путь к команде JLink. По умолчанию используется «JLinkExe».
--jlink-если SWD | JTAG Тип интерфейса J-Link. По умолчанию SWD.
--jlink-скорость <целое число> | адаптивный | авто Скорость интерфейса J-Link.
--jlink-sn <строка> Серийный номер датчика J-Link.
--esptool-cmd <путь-имя> Путь к команде esptool. По умолчанию используется «esptool.py».
--port <путь-имя> Имя устройства COM-порта для ESP32. По умолчанию /tty/USB0.
--speed <целое число> Скорость передачи для COM-порта. По умолчанию 115200.
--prov-csv-file <имя-файла> Чтение данных подготовки устройства из CSV-файла подготовки.
--prov-сервер <ссылка> Чтение данных подготовки устройства с сервера подготовки.
--disable-server-validation При использовании 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