通过 hono 将事件从边缘设备发送到同上

Sending events form edge-device to ditto via hono

我成功地完成了以下操作:

通过 hono 将边缘设备的遥测数据发送到同上,效果很好。

我还每秒发送一个伪事件 通过hono形成边缘设备到同上,如下所示:

# sending an event from edge-device to ditto through hono-mqtt-adapter
correlation_id = ''.join(random.choices(string.ascii_uppercase + string.digits, k=10))
data = {
    "topic": "de.iot1/dev1/things/live/messages/fire",
    "headers": {
        "content-type": "text/plain",
        "correlation-id": correlation_id
     },
     "path": "/outbox/messages/fire",
     "value": "Fire detected"
}
payload = json.dumps(data)
mqtt_client.publish("event", payload=payload, qos=1)

另一方面,我写了一个简单的 ditto-amqp-client,它只接收所有 dittos incomming 消息。我收到所有传入的遥测消息作为它们的正确间隔 - 即每秒。在事件消息的情况下,它们似乎被同上缓冲并每隔几秒发送到 amqp-client 而不是在它们从设备发送时!为什么?

据我了解 ditto-doc, ditto offers two communication channels. twin-channel for communicating with the twin through commands and events and a live-channel to communicate with the device directly through messages. But in the section protocol-topics 对于事件或命令,频道可以是双胞胎或直播,这很令人困惑。

提前感谢您的任何建议!

I receive all incoming telemetry messages as their correct interval - i.e. every second. In the case of events messages they seems to be buffered by ditto and sent to amqp-client every couple of seconds and not at the time they are send from the device! Why?

由于 Ditto 不进行“存储转发”,而是立即发布应用事件,因此我无法从 Ditto 方面进行真正的解释。也许通过发送事件(在 Hono 中使用 AMQP 代理持久化),这些事件会在一定延迟后被消耗(在代理持久化之后),但是我无法解释“每隔几秒”。
您可以通过将环境变量 LOG_LEVEL_APPLICATION 设置为 DEBUG 来在 Ditto 的连接服务中启用 DEBUG 日志记录 - 这样您将看到何时收到消息以及何时将它们再次转发到您的 AMQP 端点。

  • I would like to know what is the recommended way to send an event form the device to ditto?
  • Should one send it through live channels using events or messages (outbox)?

当您谈论“检测到火灾”事件(包含不应存储在由 Ditto 管理的孪生中的有效负载)时,我会将其作为实时 消息 发送设备(使用具有“QoS 1”的 Hono 事件通道 - 至少一次 - 语义)。
但是,连接到 Ditto 的应用程序(例如通过 Websocket 或通过 HTTP webhook)必须使用实时消息并且 acknowledging 它收到了消息。

Ditto 中的事件是作为 CQRS 架构风格的一部分持久存在的实体。坚持后,可以通知感兴趣的人。
所以 现场活动 应该在同一个 Ditto event format 中,不能与 Hono 活动混淆。

  • Is it better to define the event as a feature in the twin and send normal command/modify to its value?

这取决于您的要求。
您还可以在功能中将“fireDetected”设为 boolean 属性 并订阅此 属性 的更改。但是这应该只能通过设备设置(使用适当的 Ditto 策略)——并且不能再使用通过组合 Hono 和 Ditto 获得的“QoS 1”保证。