设计mqtt主题的好方法?
我是mqtt设计的新手 正如我从internet上的一些教程中看到的,常见的mqtt主题有以下格式:/home/room/device\u type/device\u id 我看不出这样做有什么好处。不知道如何使用这种设计 在我看来,设备(dev)可能订阅(sub)控制主题,发布(pub)状态主题。像这样:设计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
- 发布:clients/dev/devid/stat
- 子:clients/dev/devid/ctrl
非常感谢我发现以下主题拆分方案在多个应用程序中都非常有效
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”等概念,以及一个可以从当前船只/主页开始,但可以轻松向上扩展到其他船只/飞机/物品的树 我的两分钱:
- broker=此特定代理的信息
- 经纪人/客户
- 经纪人/客户/计数
- broker/clients/0/name或broker/clients[0]/name
- 经纪人/主题
- home=此当前位置(也可以是“此处”或其他位置)
- 家庭/厨房/温度“19C”
- 家庭/厨房/温度/硬件/类型“ESP8266”
- 家庭/车库/大门/设置“关闭”
- 位置=所有已知位置的列表
- 位置/0/uuid
- 位置/0/名称
- 位置/0/地址
- 基本主题规范
- 基本有效载荷规格
//
,例如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"
},
...
}
}