设计mqtt主题的好方法?

设计mqtt主题的好方法?,mqtt,Mqtt,我是mqtt设计的新手 正如我从internet上的一些教程中看到的,常见的mqtt主题有以下格式:/home/room/device\u type/device\u id 我看不出这样做有什么好处。不知道如何使用这种设计 在我看来,设备(dev)可能订阅(sub)控制主题,发布(pub)状态主题。像这样: 发布:clients/dev/devid/stat 子:clients/dev/devid/ctrl 这样看来,sub、pub逻辑对于客户端和设备都非常简单 有人能告诉我一些设计mqtt

我是mqtt设计的新手

正如我从internet上的一些教程中看到的,常见的mqtt主题有以下格式:/home/room/device\u type/device\u id

我看不出这样做有什么好处。不知道如何使用这种设计

在我看来,设备(dev)可能订阅(sub)控制主题,发布(pub)状态主题。像这样:

  • 发布:clients/dev/devid/stat
  • 子:clients/dev/devid/ctrl
这样看来,sub、pub逻辑对于客户端和设备都非常简单

有人能告诉我一些设计mqtt主题的好方法吗

(!)请不要以“/”开头主题(此主题已由HiveMQ团队推荐)

编辑:

我刚刚发现,对于任何类型的设计,模型必须至少能够:

  • 单独控制:向特定设备发送控制命令
  • 组控制:向一组设备发送控制命令:类型,定义的组
  • 能够接收设备的状态

  • 非常感谢

    我发现以下主题拆分方案在多个应用程序中都非常有效

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

    希望能有所帮助。

    我认为如果主题是反映物理世界,我们应该看看信号K之类的东西

    编辑: 该规范也在不断成熟,但它包含了服务器/代理的“self”等概念,以及一个可以从当前船只/主页开始,但可以轻松向上扩展到其他船只/飞机/物品的树

    我的两分钱:

  • 除非以“/set”结尾,否则所有主题都是只读的
  • 理想情况下,主题是合理规范化和细粒度的。我能理解将值分组到一个组主题中。IMHO,这种决策应该是特定于应用程序的
  • 有效载荷应为字符串,以避免端性问题
  • 这里有一个建议的树:

    • broker=此特定代理的信息
      • 经纪人/客户
      • 经纪人/客户/计数
      • broker/clients/0/name或broker/clients[0]/name
      • 经纪人/主题
    • home=此当前位置(也可以是“此处”或其他位置)
      • 家庭/厨房/温度“19C”
      • 家庭/厨房/温度/硬件/类型“ESP8266”
      • 家庭/车库/大门/设置“关闭”
    • 位置=所有已知位置的列表
      • 位置/0/uuid
      • 位置/0/名称
      • 位置/0/地址

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

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

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

    • 基本主题规范
    • 基本有效载荷规格
    在消息层之上,还有域消息层,涵盖各种特定于域的主题,如系统消息、警报、物理设备/数字孪生消息或其他与制造相关的消息

    主题

    这些主题大致定义为
    //
    ,例如
    pacman/pacman-1/gameover
    (这只是一个示例,仅供说明!)

    发布MQTT消息的应用程序的开发人员根据有效负载的语义定义

    指的是发送应用程序,允许快速选择来自定义来源(发布者)的消息。我们在由Docker、Rancher和Kubernetes构建的微服务环境中部署应用程序

    有效载荷

    有效负载是以JSON格式指定的。在每个页面中都有一个JSON模式引用URL 构建发布应用程序API的URL,该API保存所发送消息的进一步信息(如JSON模式)。因此,订户可以按需获取MQTT消息的元数据。静态元数据不会随消息一起发送以减小有效负载大小

    有效载荷样本:

    {
        "$schema": "http://app/api/messages/message1.json",
        "score": 1234,
        "highscore": false
    }
    
    出版商的消息元数据

    发布应用程序保存所有消息的索引
    {
        "message1": "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"
            },
            ...
        }
    }