做二次开发时,开发者可能会面临一个窘境:
设备百千万,识别怎么办?
心里很烦乱,后端直哭惨。
所以,为了区分不同的设备,通常建议开发者对MQTT的发布和订阅的主题做细分,以做到对设备的精确控制。
###区分设备
嵌入式开发时,开发者应该将设备的主题规划如下:
订阅:/sys/device/8685754894158765/ctrl上报:/sys/device/8685754894158765/reply
其中8685754894158765
就是设备的IMEI。如此一来,只要服务端向某个设备的ctrl主题发布数据,设备收到后即可做出相应响应;设备也可以根据自己的逻辑,及时上报数据到reply主题。
如此一来,每个设备的逻辑很清晰了,但是服务端端呢?难道要去订阅每一个设备的不同主题吗?实际上并不复杂哦,使用MQTT的通配符就能轻松解决。
##通配符
###主题层级
譬如在上文的例子中:
订阅:/sys/device/8685754894158765/ctrl上报:/sys/device/8685754894158765/reply
每一个 /
都是分隔符,用来分割主题的每一层级。以订阅的主题为例,它就被分割成了4个层级:
/sys/device/8685754894158765/ctrl层级1. sys层级2. device层级3. 8685754894158765层级4. ctrl
不要小看层级哦,区分设备,使用通配符,全靠他们了。
#
#
是可以匹配主题中任意层级次数的通配符。
比如,如果你订阅了 /sys/device/#
,那么,你可以接收到以下这些主题的消息:
/sys/device/sys/device/8685754894158765/reply/sys/device/8685754894158766/reply/sys/device/8685754894158767/reply/sys/device/abce/efg/h/ijkl...
通过示例我们可以看出,#
可以匹配大于等于0的层级。
服务端使用通配符 #
订阅主题。设备上报数据,服务端收到数据后,再根据设备的上报的 真实主题 和 payload 进行处理。
+
+
只可匹配主题的某一层级。
比如,如果你订阅了 /sys/device/+
,那么,你可以接收到以下这些主题的消息:
/sys/device/8685754894158765/sys/device/8685754894158766/sys/device/8685754894158767/sys/device/abce...
但是不能收到如下主题的消息:
/sys/device/8685754894158767/reply/sys/device/abce/efg/h/ijkl/sys/device
因为他们都超过了 +
1层级的要求。需要注意的是,/sys/device
因为是0层级,所以也不符合要求,无法收到数据。
###延伸用法
#
就可以啦;/sys
和 sys
是两个不同的主题。所以,如果开发者想要使用 +
订阅 /sys
,那么要写成这样:+/+
;#
,以免造成不可预估的后果;*
、 $
等,均当作普通字符串处理,无其他特殊含义。联系客服