什么是 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 发布到该主题的消息。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCKg8hRG-1665650058838)(C:\Users\DELL\Desktop\1013技术号三图片\MQTT 发布订阅 图1.png)]

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 服务器支持通过以下主题获取集群状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fKCgm9mH-1665650058842)(C:\Users\DELL\Desktop\1013技术号三图片\表格.png)]

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 编码字符串)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MWLrRILf-1665650058843)(C:\Users\DELL\Desktop\1013技术号三图片\MQTT 共享订阅 图2.png)]

另外,对于 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/advanced-features-of-mqtt-topics

通过案例理解 MQTT 主题与通配符相关推荐

  1. mqtt 变为乱码 接受16进制字节流_转战物联网#183;基础篇07-深入理解MQTT协议之控制报文(数据包)格式...

    在MQTT协议中,一个控制报文(数据包)的结构按照前后顺序分如下三部分: 结构名 中文名 解释说明 Fixed header 固定报头 报文的最开始部分,所有报文都包含这个部分 Variable he ...

  2. Mqtt主题那点事(topic)

    MQTT 其他文章: 01.Mqtt概念概述 02.MQTT客户端基本使用 java Paho 03.MQTT服务的安装(待完成) 04.MQTT 主题当前文章 05.MQTT断开重连(待完成) 文章 ...

  3. 【MQTT基础篇(七)】MQTT主题

    文章目录 MQTT主题 1 主题基本形式 2 主题分级 3 主题通配符 3.1 单级通配符: + 3.2 多级通配符 \# 4 主题应用注意事项 4.1 以$开始的主题 4.2 不要用 "/ ...

  4. 学习太极创客 — MQTT(八)ESP8266订阅MQTT主题

    视频链接:https://www.bilibili.com/video/BV1Wz4y1k7Fs/?spm_id_from=333.788.recommend_more_video.-1&vd ...

  5. 车联网 TSP 平台场景中的 MQTT 主题设计

    本文作者:田桢,前上汽大众平台架构师,现为中科创达汽车云技术负责人 前言 在车联网生态中,TSP(Telematics Service Provider)平台在产业链中居于核心地位,上接汽车.车载设备 ...

  6. 学习太极创客 — MQTT(七)MQTT 主题进阶

    视频链接:https://www.bilibili.com/video/BV1Va4y1W7Ub/?spm_id_from=autoNext&vd_source=b91967c499b2310 ...

  7. python模块之HTMLParser之穆雪峰的案例(理解其用法原理)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser之穆雪峰的案例(理解其用法原理) #http://www.cnblog ...

  8. DL之DNN优化技术:DNN优化器的参数优化—更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解、图表可视化比较

    DL之DNN优化技术:DNN优化器的参数优化-更新参数的四种最优化方法(SGD/Momentum/AdaGrad/Adam)的案例理解.图表可视化比较 目录 四种最优化方法简介 优化器案例理解 输出结 ...

  9. TF之DNN:利用DNN【784→500→10】对MNIST手写数字图片识别数据集(TF自带函数下载)预测(98%)+案例理解DNN过程

    TF之DNN:利用DNN[784→500→10]对MNIST手写数字图片识别数据集(TF自带函数下载)预测(98%)+案例理解DNN过程 目录 输出结果 案例理解DNN过程思路 代码设计 输出结果 案 ...

最新文章

  1. 优化VS 2005编译,脱离漫长的等待!
  2. golang中的strings.ToTitle
  3. 个人数据上云怎么办?树莓派+kodexplorer为你造云
  4. linux 安装ios jenkins 打包机器签名证书问题
  5. mysql的联表查询和去重复数据
  6. WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变...
  7. 贴片电阻上写着“0”,所谓的“零欧电阻”,在电子电路中的用处很大
  8. 使用ConcurrentLinkedQueue惨痛的教训
  9. git 查看修改明细_Git(查看修改记录)
  10. 算法设计与分析——prim算法
  11. Nmap扫描工具介绍
  12. 怎样去掉图片上的文字
  13. 针对《评人工智能如何走向新阶段》一文,继续发布国内外的跟贴留言466-476条如下:
  14. (三十三)远期利率协议的结算金、价值与定价
  15. 提取OTU表格中分类学名称
  16. 【CNN】——矩阵乘法优化
  17. 【Python】初学者也可以实现的人脸识别系统-0x1
  18. leetcode844 比较含退格的字符串(python)
  19. AutoCAD.Net开发问题之:层表事件的响应(续)
  20. Maven插件仓库地址

热门文章

  1. 使用软件starf**k_de(更新0.82b版本),免拔光驱线玩YS6
  2. 解决windows上鼠标右键新建没有文本文档的选项
  3. 研发项目工时统计工具哪个好?9大工时管理系统盘点
  4. 表达式计算 JexlEngine
  5. MySQL数据库---视图索引
  6. 发那科机器人示教盒复位键是哪个_发那科示教器维修 大连发那科机器人伺服放大器维修 伺服电机维修...
  7. Arcgis使用教程(三)空间数据采集与编辑
  8. 最快服务器地址,如何可以选择适合自己的最快的DNS服务器?
  9. Revit2016 笔记04
  10. 世界主要城市中英文对照表(json格式)