MQTT通配符使用

我们在做设备需求开发时会遇见一些问题,主要如下所述:

在一个业务场景中,有各种不同得设备或者是采集器需要介入至平台

那么,为了区分不同的设备,通常建议开发者对MQTT的发布和订阅的主题做细分,以做到对设备的精确控制。

区分设备


嵌入式开发时,开发者应该将设备的主题规划如下:

  1. 订阅:/sys/device/8685754894158765/ctrl
  2. 上报:/sys/device/8685754894158765/reply

其中8685754894158765就是设备的IMEI。如此一来,只要服务端向某个设备的ctrl主题发布数据,设备收到后即可做出相应响应;设备也可以根据自己的逻辑,及时上报数据到reply主题。

如此一来,每个设备的逻辑很清晰了,但是服务端端呢?难道要去订阅每一个设备的不同主题吗?实际上并不复杂哦,使用MQTT的通配符就能轻松解决。

通配符

主题层级

譬如在上文的例子中:

  1. 订阅:/sys/device/8685754894158765/ctrl
  2. 上报:/sys/device/8685754894158765/reply

每一个 / 都是分隔符,用来分割主题的每一层级。以订阅的主题为例,它就被分割成了4个层级:

  1. /sys/device/8685754894158765/ctrl
  2. 层级1. sys
  3. 层级2. device
  4. 层级3. 8685754894158765
  5. 层级4. ctrl

不要小看层级哦,区分设备,使用通配符,全靠他们了。

多层通配符#


# 是可以匹配主题中任意层级次数的通配符。
比如,如果你订阅了 /sys/device/#,那么,你可以接收到以下这些主题的消息:

  1. /sys/device
  2. /sys/device/8685754894158765/reply
  3. /sys/device/8685754894158766/reply
  4. /sys/device/8685754894158767/reply
  5. /sys/device/abce/efg/h/ijkl
  6. ...

通过示例我们可以看出,#可以匹配大于等于0的层级。
服务端使用通配符 # 订阅主题。设备上报数据,服务端收到数据后,再根据设备的上报的 真实主题 和 payload 进行处理。

单层通配符+


+ 只可匹配主题的某一层级。

比如,如果你订阅了 /sys/device/+,那么,你可以接收到以下这些主题的消息:

  1. /sys/device/8685754894158765
  2. /sys/device/8685754894158766
  3. /sys/device/8685754894158767
  4. /sys/device/abce
  5. ...

但是不能收到如下主题的消息:

  1. /sys/device/8685754894158767/reply
  2. /sys/device/abce/efg/h/ijkl
  3. /sys/device

因为他们都超过了 + 1层级的要求。需要注意的是,/sys/device因为是0层级,所以也不符合要求,无法收到数据。

扩展用法

    1. 如果开发者想要订阅所有主题,那么连接到服务器后,订阅 # 就可以啦;
    2. /sys 和 sys 是两个不同的主题。所以,如果开发者想要使用 + 订阅 /sys,那么要写成这样:+/+ ;
    3. 小心使用 #,以免造成不可预估的后果;
    4. 主题中的其他字符,如 * 、 $ 等,均当作普通字符串处理,无其他特殊含义。
posted @ 2020-06-08 17:14  小叮当2020  阅读(3903)  评论(0编辑  收藏  举报