• 欢迎大家分享资料!前往留言板评论即可!

MQTT主题的通配符

合宙 模组资料网 2年前 (2021-05-15) 314次浏览 0个评论 扫描二维码

做二次开发时,开发者可能会面临一个窘境:

设备百千万,识别怎么办?
心里很烦乱,后端直哭惨。

所以,为了区分不同的设备,通常建议开发者对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层级,所以也不符合要求,无法收到数据。

###延伸用法
1. 如果开发者想要订阅所有主题,那么连接到服务器后,订阅
“`#“` 就可以啦;
2. “`/sys“` 和 “`sys“` 是两个不同的主题。所以,如果开发者想要使用 “`+“` 订阅 “`/sys“`,那么要写成这样:“`+/+“` ;
3. 小心使用 “`#“`,以免造成不可预估的后果;
4. 主题中的其他字符,如 “`*“` 、 “`$“` 等,均当作普通字符串处理,无其他特殊含义。


转载请注明原文链接:MQTT主题的通配符
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址