乐趣区

关于物联网:通过案例理解-MQTT-主题与通配符

什么是 MQTT 主题?

MQTT 主题实质上是一个 UTF-8 编码的字符串,是 MQTT 协定进行音讯路由的根底。MQTT 主题相似 URL 门路,应用斜杠 / 进行分层:

chat/room/1
sensor/10/temperature
sensor/+/temperature
sensor/#

MQTT 主题不须要事后创立,MQTT 客户端在订阅或公布时即创立了主题,同时也无需被动删除主题。为了防止歧义且易于了解,通常不倡议主题以 / 结尾或结尾,例如 /chatchat/

下图是一个简略的 MQTT 订阅与公布流程,APP 1 订阅了 sensor/2/temperature 主题后,将能接管到 Sensor 2 公布到该主题的音讯。

MQTT 主题通配符

MQTT 主题通配符蕴含单层通配符 + 及多层通配符 #,次要用于客户端一次订阅多个主题。

留神 :通配符只能用于订阅,不能用于公布。

单层通配符

加号 (“+”U+002B) 是用于单个主题层级匹配的通配符。在应用单层通配符时,单层通配符必须占据整个层级,例如:

+ 无效
sensor/+ 无效
sensor/+/temperature 无效
sensor+ 有效(没有占据整个层级)

如果客户端订阅了主题 sensor/+/temperature,将会收到以下主题的音讯:

sensor/1/temperature
sensor/2/temperature
...
sensor/n/temperature

然而不会匹配以下主题:

sensor/temperature
sensor/bedroom/1/temperature

多层通配符

井字符号(“#”U+0023)是用于匹配主题中任意层级的通配符。多层通配符示意它的父级和任意数量的子层级,在应用多层通配符时,它必须占据整个层级并且必须是主题的最初一个字符,例如:

# 无效,匹配所有主题
sensor/# 无效
sensor/bedroom# 有效(没有占据整个层级)sensor/#/temperature 有效(不是主题最初一个字符)

如果客户端订阅主题 senser/#,它将会收到以下主题的音讯:

sensor
sensor/temperature
sensor/1/temperature

以 $ 结尾的主题

零碎主题

$SYS/ 结尾的主题为零碎主题,零碎主题次要用于获取 MQTT 服务器本身运行状态、音讯统计、客户端高低线事件等数据。目前,MQTT 协定暂未明确规定 $SYS/ 主题规范,但大多数 MQTT 服务器都遵循该规范倡议。

例如,EMQX 服务器反对通过以下主题获取集群状态。

EMQX 还反对客户端高低线事件、收发流量、音讯收发、系统监控等丰盛的零碎主题,用户可通过订阅 $SYS/# 主题获取所有零碎主题音讯。具体请见:EMQX 零碎主题文档。

共享订阅

共享订阅是 MQTT 5.0 引入的新个性,用于在多个订阅者之间实现订阅的负载平衡,MQTT 5.0 规定的共享订阅主题以 $share 结尾。

尽管 MQTT 协定在 5.0 版本才引入共享订阅,然而 EMQX 从 MQTT 3.1.1 版本开始就反对共享订阅。

下图中,3 个订阅者用共享订阅的形式订阅了同一个主题 $share/g/topic,其中 topic 是它们订阅的实在主题名,而 $share/g/ 是共享订阅前缀(g/ 是群组名,可为任意 UTF-8 编码字符串)。

另外,对于 MQTT 5.0 以下的版本,EMQX 还反对不带群组的共享订阅前缀 $queue,对于共享订阅的更多详情请查看 EMQX 共享订阅文档。

不同场景中的主题设计

智能家居

比方咱们用传感器监测卧室、客厅以及厨房的温度、湿度和空气质量,能够设计以下几个主题:

  • myhome/bedroom/temperature
  • myhome/bedroom/humidity
  • myhome/bedroom/airquality
  • myhome/livingroom/temperature
  • myhome/livingroom/humidity
  • myhome/livingroom/airquality
  • myhome/kitchen/temperature
  • myhome/kitchen/humidity
  • myhome/kitchen/airquality

接下来,能够通过订阅 myhome/bedroom/+ 主题获取卧室的温度、湿度及空气质量数据,订阅 myhome/+/temperature 主题获取三个房间的温度数据,订阅 myhome/# 获取所有的数据。

充电桩

充电桩的上行主题格局为 ocpp/cp/${cid}/notify/${action},上行主题格局为 ocpp/cp/${cid}/reply/${action}

  • ocpp/cp/cp001/notify/bootNotification

    充电桩上线时向该主题公布上线申请。

  • ocpp/cp/cp001/notify/startTransaction

    向该主题公布充电申请。

  • ocpp/cp/cp001/reply/bootNotification

    充电桩上线前需订阅该主题接管上线应答。

  • ocpp/cp/cp001/reply/startTransaction

    充电桩发动充电申请前需订阅该主题接管充电申请应答。

即时消息

  • chat/user/${user_id}/inbox

    一对一聊天 :用户上线后订阅该收件箱主题,将能接管到好友发送给本人的音讯。给好友回复音讯时,只须要将该主题的 user_id 换为好友的的 id 即可。

  • chat/group/${group_id}/inbox

    群聊 :用户加群胜利后,可订阅该主题获取对应群组的音讯,回复群聊时间接给该主题公布音讯即可。

  • req/user/${user_id}/add

    增加好友 :可向该主题公布增加好友的申请(user_id 为对方的 id)。

    接管好友申请 :用户可订阅该主题(user_id 为本人的 id)接管其余用户发动的好友申请。

  • resp/user/${user_id}/add

    接管好友申请的回复 :用户增加好友前,需订阅该主题接管申请后果(user_id 为本人的 id)。

    回复好友申请 :用户向该主题发送音讯表明是否批准好友申请(user_id 为对方的 id)。

  • user/${user_id}/state

    用户在线状态 :用户能够订阅该主题获取好友的在线状态。

MQTT 主题常见问题及解答

主题的层级及长度有什么限度吗?

MQTT 协定规定主题的长度为两个字节,因而主题最多可蕴含 65,535 个字符。

倡议主题层级为 7 个以内。

服务器对主题数量有限度吗?

不同音讯服务器对最大主题数量的反对各不统一,目前 EMQX 的默认配置对主题数量没有限度,然而主题数量越多将会耗费越多的服务器内存。思考到连贯到 MQTT Broker 的设施数量个别较多,咱们倡议一个客户端订阅的主题数量最好管制在 10 个以内。

通配符主题订阅与一般主题订阅性能是否统一?

通配符主题订阅的性能弱于一般主题订阅,且会耗费更多的服务器资源,用户可依据理论业务状况抉择订阅类型。

同一个主题能被共享订阅与一般订阅同时应用吗?

能够,然而不倡议同时应用。

常见的 MQTT 主题应用倡议有哪些?

  • 不倡议应用 # 订阅所有主题;
  • 不倡议主题以 / 结尾或结尾,例如 /chatchat/
  • 不倡议在主题里增加空格及非 ASCII 特殊字符;
  • 同一主题层级内倡议应用下划线 _ 或横杆 - 连贯单词(或者应用驼峰命名)。

版权申明:本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/jmeter-extension-development-custom-functions

退出移动版