接上一篇分享,我们将使用工厂数据构建一个示例应用,讨论如何工厂数据以及大致介绍如何使用自己的工厂数据的实现。
1
使用工厂数据构建一个示例应用
您可以使用上述步骤手动生成工厂数据集,也可以使用 Telink 平台构建系统,该系统使用 Kconfig 选项自动创建工厂数据内容。
要启用自动生成工厂数据集,请转到示例应用的目录,并使用以下选项构建示例应用:
west build -- -DCONFIG_CHIP_FACTORY_DATA=y -DCONFIG_CHIP_FACTORY_DATA_BUILD=y
或者,您还可以将 `CONFIG_CHIP_FACTORY_DATA_BUILD=y` 的Kconfig设置添加到示例应用的 `prj.conf` 文件中。
注意,如果这一步遇到了 ModuleNotFoundError 的报错,请在 connectedhomeip 目录下执行以下命令更新依赖项后,再次尝试构建:
.environment/pigweed-venv/bin/python3 -m pip install -r scripts/setup/requirements.telink.txt
构建成功后会得到开启了工厂数据分区的应用的固件,和独立的工厂数据集二进制文件,烧录时需要分别烧录它们。
每个工厂数据参数都有一个默认值。这些在Kconfig文件中有描述。要为工厂数据参数设置一个新值,可以通过将其作为构建参数列表提供,或使用交互式 Kconfig 界面来完成。
1
提供工厂数据参数作为生成参数列表
这种提供工厂数据的方式可以与第三方构建脚本一起使用,因为它只使用一个命令。可以通过west命令的附加选项开启工厂数据功能:
west build -- -DCONFIG_CHIP_FACTORY_DATA=y --DCONFIG_CHIP_FACTORY_DATA_BUILD=y --DCONFIG_CHIP_DEVICE_DISCRIMINATOR=0xF11
或者,也可以将相关的 Kconfig 选项行添加到示例应用的 `prj.conf` 文件中。
2
分开烧录应用固件和工厂数据集
我们的应用固件和工厂数据集都是二进制 BIN 文件,可以使用 BDT 工具和 Telink burning key 烧录到设备的Flash指中。
烧录时使用 Telink BDT 工具的多地址烧录即可:
选择 Tool 中的 Multi-address download
此处以 v1.1-branch 分支上的固件为例,工厂数据的偏移值是 `0x104000`:
2
设置工厂数据
将独立的工厂数据集,合并到示例应用的固件之中的一种方法,是使用在[使用工厂数据构建一个示例应用](#使用工厂数据构建一个示例应用)中描述的Telink平台构建系统,并使用附加下面的选项构建示例应用 `-DCONFIG_CHIP_FACTORY_DATA_MERGE_WITH_FIRMWARE=y`:
west build --
-DCONFIG_CHIP_FACTORY_DATA=y
-DCONFIG_CHIP_FACTORY_DATA_BUILD=y
-DCONFIG_CHIP_FACTORY_DATA_MERGE_WITH_FIRMWARE=y
为了更好地理解以上设置项所对应的需求场景,可以参见下面的表格:
您还可以构建一个使用自动生成的新CD、DAC和PAI证书的示例应用。新生成的证书将被自动添加到工厂数据集里。要生成新证书,通过使用附加选项构建示例应用来禁用默认证书 `-DCHIP_FACTORY_DATA_USE_DEFAULT_CERTS=n`:
west build --
-DCONFIG_CHIP_FACTORY_DATA=y
-DCONFIG_CHIP_FACTORY_DATA_BUILD=y
-DCONFIG_CHIP_FACTORY_DATA_MERGE_WITH_FIRMWARE=y
-DCONFIG_CHIP_FACTORY_DATA_USE_DEFAULT_CERTS=n
注意:要使用Telink平台构建系统生成新的证书,您需要系统变量PATH中的 `chip-cert` 可执行文件。要了解如何获取 `chip-cert`,请参考[构建matter工具](#构建-matter-工具)中的步骤,并将新构建的可执行文件添加到系统变量PATH中。Cmake构建系统将自动找到这个可执行文件。
然后,在示例应用目录中,可以使用生成的一个二进制固件,便可以同时写入应用固件和新生成的工厂数据。
3
使用自己的工厂数据实现
上面介绍的工厂数据生成过程仅是对Telink平台有效的示例应用。根据用途和格式的不同,可以用不同的方式从设备的闪存中读取工厂数据集。在Telink示例中,工厂数据以 `CBOR` 格式存储。
还可以创建一个包含任意格式的所有工厂数据组件表的HEX文件,然后实现一个解析器来读取所有参数并将它们传递给提供程序。每个制造商都可以通过在Matter栈中实现解析器和工厂数据访问器来自行实现工厂数据集。
使用 Telink工厂数据提供程序(FactoryDataProvider.h)和工厂数据解析器(FactoryDataParser.h)作为示例。设备使用工厂数据解析器(FactoryDataParser.h)读取输出原始数据,将其解码并存储在 `FactoryData` 结构中。工厂数据提供程序(FactoryDataProvider.h)实现使用这个解析器获取所有需要的工厂数据参数,并将它们提供给Matter核心。
在Telink示例中, `FactoryDataProvider`是一个模板类,继承自`DeviceAttestationCredentialsProvider`, `CommissionableDataProvider`, 和 `DeviceInstanceInfoProvider` 类。
自定义实现必须继承这些类并实现它们的功能来从设备的闪存中获取所有工厂数据集。这些类是虚类,需要由派生类重写。
要覆盖继承的类,请完成以下步骤:
1、覆盖以下方法:
// ===== Members functions that implement the DeviceAttestationCredentialsProvider
CHIP_ERROR GetCertificationDeclaration(MutableByteSpan & outBuffer) override;
CHIP_ERROR GetFirmwareInformation(MutableByteSpan & out_firmware_info_buffer) override;
CHIP_ERROR GetDeviceAttestationCert(MutableByteSpan & outBuffer) override;
CHIP_ERROR GetProductAttestationIntermediateCert(MutableByteSpan & outBuffer) override;
CHIP_ERROR SignWithDeviceAttestationKey(const ByteSpan & messageToSign, MutableByteSpan & outSignBuffer) override;
// ===== Members functions that implement the CommissionableDataProvider
CHIP_ERROR GetSetupDiscriminator(uint16_t & setupDiscriminator) override;
CHIP_ERROR SetSetupDiscriminator(uint16_t setupDiscriminator) override;
CHIP_ERROR GetSpake2pIterationCount(uint32_t & iterationCount) override;
CHIP_ERROR GetSpake2pSalt(MutableByteSpan & saltBuf) override;
CHIP_ERROR GetSpake2pVerifier(MutableByteSpan & verifierBuf, size_t & verifierLen) override;
CHIP_ERROR GetSetupPasscode(uint32_t & setupPasscode) override;
CHIP_ERROR SetSetupPasscode(uint32_t setupPasscode) override;
// ===== Members functions that implement the DeviceInstanceInfoProvider
CHIP_ERROR GetVendorName(char * buf, size_t bufSize) override;
CHIP_ERROR GetVendorId(uint16_t & vendorId) override;
CHIP_ERROR GetProductName(char * buf, size_t bufSize) override;
CHIP_ERROR GetProductId(uint16_t & productId) override;
CHIP_ERROR GetSerialNumber(char * buf, size_t bufSize) override;
CHIP_ERROR GetManufacturingDate(uint16_t & year, uint8_t & month, uint8_t & day) override;
CHIP_ERROR GetHardwareVersion(uint16_t & hardwareVersion) override;
CHIP_ERROR GetHardwareVersionString(char * buf, size_t bufSize) override;
CHIP_ERROR GetRotatingDeviceIdUniqueId(MutableByteSpan & uniqueIdSpan) override;
2、将新创建的解析器和提供程序文件移动到项目目录中。
3、把文件添加到 `CMakeList.txt` 中。
4、禁用工厂数据提供程序的默认实现和Telink实现,以开始使用您自己的工厂数据解析器和提供程序实现。这可以通过以下方式之一来实现:
把Kconfig设置 `CONFIG_CHIP_FACTORY_DATA_CUSTOM_BACKEND=y` 加到 `prj.conf` 文件中。
用以下选项构建一个示例:
west build -- -DCONFIG_CHIP_FACTORY_DATA_CUSTOM_BACKEND=y
全部0条评论
快来发表一下你的评论吧 !