MQTT:主题和主题通配符
一、主题
MQTT的消息是以主题进行分类的,主题可以使用单级主题和多级主题,多级主题的标志是用/
分隔的。例如:单级主题 sensor
,多级主题 sensor/temperature
、 sensor/temperature/room1
在客户端向主题发布或者订阅消息之前,无需去创建主题。
主题使用建议:
-
绝不使用斜杆开头的主题名,例如:
/myhome/groundfloor/livingroom
-
绝不在主题名中使用空格
-
保持主题名短小和简洁
-
仅使用ASCII码,避免使用ASCII码中的非打印字符
二、主题通配符
客户端可以对于具体的主题进行订阅,但某一类主题全部进行订阅,此时需要通配符来解决了。MQTT中给出了两种通配符:单级通配符(+)和多级通配符(#)
📌 注意:主题通配符仅能用来订阅,不能用作发布
- 单级通配符(+)
例如:想订阅所有房间的温度传感器的温度消息,对于所有房间的房间号是不能提前预知的,但是可以通过单级通配符搞定所有房间号。
- 多级通配符(#)
例如:想订阅房间号room1的所有不同传感器的消息,对于所有不同传感器的类型是不能提前预知的,但是可以通过多级通配符搞定不同类型传感器名称。
📌 注意:多级通配符只能放在最后一级
三、+ 和 # 混合
设想一个问题:如果我想房子(home)订阅一楼(floor1)所有房间的硬件传感器设备(sensorDevice)下的所有传感器,应该如何定义这个主题呢?
分析:所有房间、所有硬件传感器,肯定不能使用两个多级通配符#,那么就可以+ 和 # 混用。
主题:home/floor1/+/sensorDevice/#
当然,可能有人会想到一种取巧的办法,既然要订阅很多未知的主题,直接订阅主题:#
,可以使用所有的主题。确实可行,但这会牺牲主机的性能,订阅了很多没有用的主题。