#嵌入式设备 #固件 #DFU #物联网设备 #OTA #无标准

无标准 drogue-ajour-protocol

专为嵌入式设备设计的固件更新协议

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 嵌入式开发

Apache-2.0

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值将在实施开始后跟随。

典型的固件更新周期如下

  1. 在任何给定时间,设备向'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检查是否确实需要更新。

  1. 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