0

我成功地做了以下事情:

  • 创建 hono 租户并为其注册设备。
  • 将一个简单的基于 python 的边缘设备连接到 hono。
  • 将 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)

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

据我从同上文档中了解到,同上提供了两个沟通渠道。双通道用于通过命令和事件与双胞胎进行通信,而实时通道则通过消息直接与设备进行通信。但是在协议主题部分 中,通道可以是双胞胎,也可以是活动的,也可以用于事件或命令,这是令人困惑的。

  • 我想知道将事件从设备发送到同上的推荐方式是什么?
  • 是否应该使用事件或消息(发件箱)通过实时频道发送?
  • 将事件定义为双胞胎中的一个特征并将正常命令/修改发送到它的值是否更好?

提前感谢您的任何建议!

4

1 回答 1

1

我以正确的间隔接收所有传入的遥测消息 - 即每秒。在事件消息的情况下,它们似乎被同上缓冲并每隔几秒钟发送到 amqp-client,而不是在从设备发送时发送!为什么?

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

  • 我想知道将事件从设备发送到同上的推荐方式是什么?
  • 是否应该使用事件或消息(发件箱)通过实时频道发送?

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

Ditto 中的事件是作为CQRS架构样式的一部分持久化的实体。坚持后,可以通知相关方。
因此,现场活动应采用相同的 Ditto活动格式,不得与 Hono 活动混淆。

  • 将事件定义为双胞胎中的一个特征并将正常命令/修改发送到它的值是否更好?

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

于 2020-12-15T07:19:35.943 回答