MQTT topic规则和经验

MQTT topic匹配规则基础

1.主题层级分隔符—“/”:

用于分割主题层级,/分割后的主题,这是消息主题层级设计中很重要的符号

e.g:aaaa/bbbb和 aaaa/bbbb/cccc 和aaaa/bbbb/cccc/dddd ,这样的消息主题格式,是一个层层递进的关系,可通过多层通配符同时匹配两者,或者单层通配符只匹配一个。 这在现实场景中,可以应用到:公司的部门层级推送、国家城市层级推送等包含层级关系的场景。

2.单层通配符—-“+”:

单层通配符只能匹配一层主题。e.g: aaaa/+ 可以匹配 aaaa/bbbb ,但是不能匹配aaaa/bbbb/cccc。 单独的+号可以匹配单层的所有推送

3.多层通配符—-“#”:

#:多层通配符,多层通配符可以匹配于多层主题。比如: aaaa/# 不但可以匹配aaaa/bbbb,还可以匹配aaaa/bbbb/cccc/dddd。 也就是说,多层通配符可以匹配符合通配符之前主题层级的所有子集主题。单独的#匹配所有的消息主题.

4.通配符 —-“$”:

通配符“$”表示匹配一个字符,只要不是放在主题的最开头,即:

$xx/$xx/xx$

其它情况下都表示匹配一个字符。

如果客户端想同时接受以 “SYS/”开头主题的消息和不以 开头主题的消息, 它需要同时订阅 “#” 和 ““$SYS/#”。

5.总结:

a、所有的主题名和主题过滤器必须至少包含一个字符

b、主题名或主题过滤器以前置或后置斜杠 “/” 区分

c、只包含斜杠 “/” 的主题名或主题过滤器是合法的

d、主题名和主题过滤器是 UTF-8 编码字符串, 它们不能超过 65535 字节

e、主题名和主题过滤器是区分大小写的

f、单层通配符和多层通配符只能用于订阅(subscribe)消息而不能用于发布(publish)消息,层级分隔符两种情况下均可使用

MQTT topic 设计经验:

a、不要在最前面加/比如:/home/device/light, 等于在最前面有一个空字符串层级,这完全没有必要而且增加了broker之类的处理,home/device/light才是合理的。

b、就使用英文+数字字符,不要使用空格、特殊字符这些都会增加处理的复杂性,有时候还会有兼容性问题

c、将设备ID或识别码包含在topic中多方面原因:便于订阅特定设备、便于后续的过滤、便于权限控制

d、不要在运行中创建 topic这个好理解,交流还是有预期比较好。在规模较大的系统中,随意的创建 topic 会导致维护困难、处理复杂度增加,最主要的肯定非常容易导致遗漏和未知行为。

e、命名简单明确太长了看太累,看不懂会困惑,太累或困惑都容易出错;

f、topic 应该尽可能细致,能详细定位到不同的设备和消息

 

猜你喜欢

转载自blog.csdn.net/liuyuinsdu/article/details/114057038