5个版本 (破坏性更新)
0.6.0 | 2022年6月7日 |
---|---|
0.5.0 | 2022年6月3日 |
0.4.0 | 2022年6月2日 |
0.2.0 | 2022年4月6日 |
0.1.0 | 2022年3月30日 |
#1961 in 嵌入式开发
9KB
246 行
Drogue Ajour(à jour => 更新过的)
Drogue Ajour是Drogue IoT Cloud的附加组件,允许您为Drogue IoT Cloud应用程序管理设备固件更新。它可以用来监控所有可通过Drogue Cloud访问令牌访问的应用程序,或单个应用程序。
您可以在本地或Kubernetes上运行Drogue Ajour(推荐用于生产环境)。
架构
Drogue Ajour使用Drogue IoT Cloud事件流和命令API与具有固件更新功能的设备通信。Drogue IoT设备注册表用于存储特定设备的“期望”固件和版本。在Application
中定义时,以下扩展的架构将被应用,以覆盖应用级别的属性:
spec:
firmware:
oci:
image: 'image-within-repo:1234'
如果定义在Application
中,它将应用于每个设备属性,在这种情况下将覆盖应用级别的属性。
作为参考架构,Drogue Ajour使用Open Container Initiative (OCI)注册表来存储设备固件的容器镜像。这允许重用Kubernetes中常用的现有基础设施。然而,Drogue Ajour还与Eclipse Hawkbit集成以存储固件(如下所述)。
构建和部署固件与Drogue Ajour解耦,只要可以从固件元数据中检索到预期的清单格式(例如,在OCI中,作为容器镜像上的标签)。作为参考架构,以下tekton管道显示了如何构建和部署固件到OCI注册表。
Drogue IoT应用程序和设备对象包含自定义属性,用于定义每个设备(或所有设备)应提供所需的固件版本。
+----------------+ +------------------+ +--------------+
| | -------> | | -------> | |
| Device/Gateway | | Drogue IoT Cloud | | Drogue Ajour |
| | <------- | | <------- | |
+----------------+ +------------------+ +--------------+
|
|
|
|
+-------------------------+ +-------------------+
| | | |
| Firmware Build Pipeline | -------> | Firmware Registry |
| | | |
+-------------------------+ +-------------------+
Hawkbit集成
要使用Hawkbit集成而不是OCI,需要按如下方式扩展架构
spec:
firmware:
hawkbit:
controller: mycontroller
协议
Drugue Ajour使用在'dfu'通道和'dfu'命令中发送的自定义应用程序级协议,以与设备或网关进行通信。该协议是无状态的,这意味着Drugue Ajour将仅跟踪发送固件更新到报告其状态的设备的设备。
该协议设计为在更新期间,设备不需要持续在线,但可以按自己的节奏接收固件。
该协议使用紧凑二进制对象表示法(CBOR),以确保与嵌入式设备配合使用的小消息大小。为了描述目的,这里提供的示例以JSON形式提供,CBOR值将在实施开始后跟随。
典型的固件更新周期如下
- 在任何给定时间,设备向'dfu'通道发布以下有效载荷的消息
{
"version": "0.1.0",
"correlation_id": 1 // Optional: Opaque request identifier, for devices that aggregate multiple updates
"mtu": 512, // Optional: The desired block size to use for firmware blobs
}
这允许Drugue Ajour检查是否确实需要更新。
- Drugue Ajour检查特定设备的所需固件,并尝试在固件注册表中定位它。
3a. 如果设备已更新,则向设备发送以下有效载荷的'dfu'命令
{
"sync": {
"version": "0.1.0", // Desired firmware version
"correlation_id": 1 // Optional: Should be set to the id from the device status
"poll": 300, // The amount of time to wait before checking in again
}
}
3b. 如果设备需要更新,则向设备发送以下有效载荷的'dfu'命令
{
"write": {
"version": "0.1.1", // Version of blob
"offset": 0, // Offset this blob should be written to
"data": aGVsbG8= // Base64-encoded firmware block (Binary in CBOR)
}
}
3c. 如果没有关于固件的新信息,并且服务器需要客户端等待再次询问,则发送'wait'命令。
{
"write": {
"poll": 300, // The amount of time to wait before checking in again
}
}
4a. 当设备看到"同步"操作时,如果尚未执行,它应该将其当前固件版本标记为"良好"。可以使用'poll'字段作为设备在再次检查之前应等待多长时间的启发式方法。
4b. 当设备看到"写入"操作时,它应将其提供的写入存储。一旦持久化,它应报告下一个预期偏移量和最后接收的版本
{
"version": "0.1.0",
"mtu": 512, // The desired block size to use for the next firmware block
"status": {
"version": "0.1.1", // Version of the last block the device received from the server. To safeguard against new versions arriving
"offset": 512, // Current write offset after applying the last firmware block.
}
}
5b. 当服务器从设备接收到下一个事件时,它将重复步骤4b,直到完整的固件发送完毕。当最终块确认已写入,并且希望部署新固件时,fleet-manager将发送以下命令
{
"swap": {
"version": "0.1.1",
"checksum": "097d501382f5817eb2c5f741d37845158c76dd6a8af899001b36b5a75188aeeb"
}
}
6b. 当设备接收到'swap'命令时,它应启动固件更新,并在重新上线后立即报告更新后的版本。
客户端
drgdfu
实现了上述协议,可以使用文件作为服务器或使用作为网关设备的Drogue IoT云端点。
依赖项
~0.4–1MB
~24K SLoC