通过 hono 将事件从边缘设备发送到同上
Sending events form edge-device to ditto via hono
我成功地完成了以下操作:
- 正在创建 hono 租户并为其注册设备。
- 将基于 python 的简单边缘设备连接到 hono。
- 将 hono 连接到 ditto。
- 正在为上述边缘设备创建孪生。
通过 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
对于事件或命令,频道可以是双胞胎或直播,这很令人困惑。
- 我想知道从设备向同上发送事件的推荐方法是什么?
- 应该使用事件或消息(发件箱)通过实时频道发送吗?
- 将事件定义为孪生中的一个特征并将正常 command/modify 发送到它的值是否更好?
提前感谢您的任何建议!
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”保证。
我成功地完成了以下操作:
- 正在创建 hono 租户并为其注册设备。
- 将基于 python 的简单边缘设备连接到 hono。
- 将 hono 连接到 ditto。
- 正在为上述边缘设备创建孪生。
通过 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 对于事件或命令,频道可以是双胞胎或直播,这很令人困惑。
- 我想知道从设备向同上发送事件的推荐方法是什么?
- 应该使用事件或消息(发件箱)通过实时频道发送吗?
- 将事件定义为孪生中的一个特征并将正常 command/modify 发送到它的值是否更好?
提前感谢您的任何建议!
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”保证。