一、MQTT topic匹配规则基础
1.主题层级分隔符—“/”:
用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号
e.g:aaaa/bbbb和 aaaa/bbbb/cccc 和aaaa/bbbb/cccc/dddd。
这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。 这在现实场景中,可以应用到:公司的部门层级推送、国家城市层级推送等包含层级关系的场景。
2.单层通配符—“+”:
单层通配符只能匹配一层主题。
e.g: aaaa/+ 可以匹配 aaaa/bbbb ,但是不能匹配aaaa/bbbb/cccc。 单独的+号可以匹配单层的所有推送。
3.多层通配符—“#”:
“#”:多层通配符,多层通配符可以匹配于多层主题。
e.g: aaaa/# 不但可以匹配aaaa/bbbb,还可以匹配aaaa/bbbb/cccc/dddd。
也就是说,多层通配符可以匹配符合通配符之前主题层级的所有子集主题。单独的#匹配所有的消息主题。
4.通配符 —“$”:
通配符$
表示匹配一个字符,只要不是放在主题的最开头,即:
$xx/$xx/xx$
其它情况下都表示匹配一个字符。
如果客户端想同时接受以 “SYS/”开头主题的消息和不以 开头主题的消息, 它需要同时订阅 “#” 和 “$SYS/#”。
5.总结:
a、所有的主题名和主题过滤器必须至少包含一个字符;
b、主题名或主题过滤器以前置或后置斜杠 “/” 区分;
c、只包含斜杠 “/” 的主题名或主题过滤器是合法的;
d、主题名和主题过滤器是 UTF-8 编码字符串, 它们不能超过 65535 字节;
e、主题名和主题过滤器是区分大小写的;
注: 单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用。
二、MQTT topic 设计实践:
1、不要在最前面加/
比如: /home/device/light, 等于在最前面有一个空字符串层级,这完全没有必要而且增加了broker之类的处理,home/device/light才是合理的。
2、使用英文+数字,不要使用空格、特殊字符
这些都会增加处理的复杂性,有时候还会有兼容性问题。
3、将设备ID或识别码包含在topic中
多方面原因:便于订阅特定设备、便于后续的过滤、便于权限控制。
4、不要在运行中创建 topic
在规模较大的系统中,随意的创建 topic 会导致维护困难、处理复杂度增加,最主要的肯定非常容易导致遗漏和未知行为。
5、命名简单明确
太长了看太累,看不懂会困惑,太累或困惑都容易出错;topic 应该尽可能细致,能详细定位到不同的设备和消息。
三、Mosquitto 系统topic功能
mosquitto的系统topic主要是以$
SYS开头的topic,这些topic只能mosquitto自己发送,客户端只能订阅,无法发送;mosquitto的系统topic主要用于mosquitto对外发布一些自身状态的消息,例如当前客户端连接数量等等,如下所示:
当前mosquitto维持的客户端数量:$
SYS/broker/clients/total
当前mosquitto维护的活跃的客户端数量:$
SYS/broker/clients/inactive等等;