MQTT主题是一种寻址方式,它允许MQTT客户端共享信息。
MQTT主题的结构类似于文件系统中的文件夹和文件,使用正斜杠(/)作为分隔符。
使用这个系统,您可以创建一个用户友好的和自描述的命名结构,由您自己选择。
主题名称:
- 区分大小写
- 使用UTF-8字符串。
- 必须包含至少一个字符才能有效。
$ SYS主题
除$ SYS主题外,没有默认主题或标准主题结构。
默认情况下,除了$ SYS主题外,在服务器(broker)上不会创建任何主题。
所有主题均由订阅或发布客户端创建,并且不是永久性的。
仅当客户端已订阅主题,或者服务器(broker)具有针对该主题存储保留消息或最后遗嘱消息时,该主题才存在。
$ SYS主题是一个保留的主题,大多数MQTT服务器(broker)都使用它来发布有关服务器(broker)的信息。
它们是MQTT客户端的只读主题。 该主题结构没有标准,但是这里有一个指导原则,大多数服务器(broker)实现似乎都在遵循。
订阅主题
客户可以订阅单个或多个主题。
订阅多个主题时,可以使用两个通配符。 他们是:
#(哈希字符)——多级通配符
+(加号)——单级通配符
通配符只能用于表示一个或多个级别,比如 / house /#,而不能用作表示多个字符的名称的一部分,例如 hou#则是无效的.
主题命名示例
有效主题订阅
订阅单个主题
- /
- /house
- house/room/main-light
- house/room/side-light
使用主题通配符
订阅主题 house/#
包括
- house/room1/main-light
- house/room1/alarm
- house/garage/main-light
- house/main-door
- etc
订阅主题 house/+/main-light
包括
- house/room1/main-light
- house/room2/main-light
- house/garage/main-light
但不包括
- house/room1/side-light
- house/room2/side-light
无效的主题订阅
house+ – 原因-无主题级别
house# – 原因-无主题级别
发布主题
客户只能发布到单个主题。 也就是说,不允许在发布时使用通配符。
例如,要将消息发布到两个主题,您需要两次发布消息。
何时创建主题
在以下情况下动态创建主题:
- 有人订阅了一个主题
- 某人向主题发布消息将保留的消息设置为True。
什么时候从服务器(broker)删除主题
- 当最后一个向该服务器(broker)订阅的客户端断开连接时并且清除会话设置为true。
- 当客户端连接时,清除会话设置为True。
重新发布主题数据
更改或组合命名方案时,很可能会这样做。
这个想法是客户会订阅一个主题,例如hub1 / sensor1,并使用新主题命名house1 / main-light重新发布数据。
常见问答
问:我如何订阅所有主题?
答:订阅#
问:我如何订阅所有$ SYS主题?
答:订阅$ SYS /#
问:我应该以/开头我的主题层次结构吗?
答:不需要,只是在结构中增加了另一个层次。
问:我可以获取服务器(broker)所有主题的列表吗?
答:除非您订阅所有主题并进行扫描,否则不能。
问:我可以告诉谁订阅了一个主题吗?
答:否
问:我如何发现主题?
答:目前,除了列出所有主题以外,没有其他机制。
http://www.steves-internet-guide.com/understanding-mqtt-topics/