MQTT基础

一、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等等;

文章来源

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容