设计mqtt主题的好方法?

Lon*_*gLT 5 mqtt

我对mqtt设计非常陌生。

从互联网上的一些教程中可以看到,常见的mqtt主题具有以下格式:/ home / room / device_type / device_id

我看不到这样做的好处。而且不知道如何使用这种设计。

从我的角度来看,设备(dev)可能会订阅(sub)来控制主题,而会发布(pub)到状态主题。像这样:

  • pub:客户端/ dev /设备/统计
  • 子:clients / dev / devid / ctrl

这样,看来客户端和设备的sub,pub逻辑非常简单

可能有人请告诉我设计MQTT主题的一些好办法吗?

(!),请不要开始话题“/”(此人被推荐HiveMQ队)

编辑:

我想通了,不管是什么样的设计,模型必须服务,能够至少包括:

  1. 单独控制:将控制命令发送到特定设备。
  2. 组控制:向一组设备发送控制命令:类型,已定义的组
  3. 能够接收设备状态。

非常感谢你

Ale*_*nko 6

我发现以下主题拆分方案在多个应用程序中效果很好

protocol_prefix / src_id / dest_id / message_id / extra_properties
Run Code Online (Sandbox Code Playgroud)
  • protocol_prefix用于区分可以同时使用的不同协议/应用程序
  • src_id是发布消息的 mqtt 客户端的 ID。它应该与用于连接到 MQTT 代理的“客户端 ID”相同。它允许快速 ACL 控制来检查是否允许客户端发布特定主题。
  • dest_id是“目的地”单元的客户端 ID,即消息的目的地。还允许对代理进行快速 ACL 控制,以确定是否允许客户端订阅特定主题。可以保留“目的地”字符串,以指定将消息广播给任何感兴趣的人。例如所有
  • message_id是所用协议中消息的实际 ID。我通常使用数值(当然是字符串),因为连接到 MQTT 代理的 IOT 或其他嵌入式系统可以有其他 I/O 链接,我想使用相同的协议(但具有不同的传输帧)来控制使用这些其他 I/O 链接的设备。我通常在此类通信链接中使用数字消息 ID。
  • extra_properties是一个可选的子主题,可用于传达其他 MQTT 特定的额外信息(例如,逗号分隔的键=值对)。一个很好的例子是在客户端实际发送消息时报告消息的时间戳。在“保留”消息的情况下,它可以帮助识别接收到的消息的相关性。随着 MQTTv5 协议有望很快到来,对这个子主题的需求可能会消失,因为会有其他方式来传达额外的属性。

希望能帮助到你。


WeS*_*See 5

我们在制造领域(工业物联网,不是物联网!)做了一些工作。

在我们的场景中,有许多不同公司的服务器端应用程序通过 MQTT 进行通信。因此我们需要一些整体结构。我们称之为“制造消息堆栈”。

最底层是MQTT,然后是“消息传递层”。它主要包括

  • 基本主题规范
  • 基本有效负载规格

在消息传递层之上,有领域消息层,涵盖各种领域特定主题,如系统消息、警报、物理设备/数字孪生消息或其他制造相关消息。

主题

主题大致定义为<senderapp>/<app-id>/<message-name>/<args>例如pacman/pacman-1/gameover(这只是用于说明的示例!)

发布 MQTT 消息的应用程序的开发人员定义<message-name><args>依赖于有效负载的语义。

<senderapp><app-id>的是发送应用程序,允许从定义的来源(发布者)快速选择消息。我们在使用 Docker、Rancher 以及即将推出的 Kubernetes 构建的微服务环境中部署应用程序。

有效载荷

有效负载以 JSON 格式指定。每个构建中都有一个 JSON 模式参考 URL,这是一个指向发布应用程序 API 的 URL,该应用程序保存所发送消息的更多信息(例如 JSON 模式)。这样订阅者就可以按需获取MQTT消息的元数据。静态元数据不与消息一起发送以减少有效负载大小。

有效负载样本:

{
    "$schema": "http://app/api/messages/message1.json",
    "score": 1234,
    "highscore": false
}
Run Code Online (Sandbox Code Playgroud)

发布者的消息元数据

发布应用程序保存可以在 API 中发送的所有消息的索引 http://<app>/api/messages/index.json

{
    "message1": "message1.json",
    ...
}
Run Code Online (Sandbox Code Playgroud)

每条消息均由其 JSON 模式描述message1.json

{
    "$schema": "http://json-schema.org/draft-06/schema#",
    "title": "Pacman end of game",
    "properties": {
        "score": {
            "description": "Players score at the end of game",
            "type": "integer"
        },
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我们还没有发布我们的制造消息堆栈。计划在未来几个月内出版。欢迎反馈。