MQTT协议中的topic

摘要:
主题层级分隔符可以出现在主题过滤器或主题名字的任何位置。相邻的主题层次分隔符表示一个零长度的主题层级。如主题:˃˃1  root/light˃˃2  root/tv/contrl/sensor˃˃3  root/tv/contrl/light˃˃4  root/airconditioning/sensor3、多层通配符——“#”“#”是用于匹配主题中任意层级的通配符。多层通配符表示它的父级和任意数量的子层级。˃˃2  #//是有效的,会收到所有的应用消息。˃˃4  school/teacher#//无效的。

1、MQTT协议中的topic

定阅与发布必须要有主题,只有当定阅了某个主题后,才能收到相应主题的payload,才能进行通信。

2、 主题层级分隔符——“/”

主题层级分隔符使得主题名结构化。如果存在分隔符,它将主题名分割为多个主题层级。

斜杠(‘/’ U+002F)用于分割主题的每个层级,为主题名提供一个分层结构。当客户端订阅指定的主题过滤器包含两种通配符时,主题层级分隔符就很有用了。主题层级分隔符可以出现在主题过滤器或主题名字的任何位置。相邻的主题层次分隔符表示一个零长度的主题层级。

如主题:

>>1  root/light
>>2  root/tv/contrl/sensor
>>3  root/tv/contrl/light
>>4  root/airconditioning/sensor

3、 多层通配符——“#”

“#”是用于匹配主题中任意层级的通配符。多层通配符表示它的父级和任意数量的子层级。多层通配符必须位于它自己的层级或者跟在主题层级分隔符后面。不管哪种情况,它都必须是主题过滤器的最后一个字符 .

例如,如果客户端订阅主题 “china/guangzhou/#”,它会收到使用下列主题名发布的消息:

>>1  china/guangzhou
>>2  china/guangzhou/huangpu
>>3  china/guangzhou/tianhe/zhongshanlu
>>4  china/guangzhou/tianhe/zhongshanlu/num123

定阅主题示例

>>1  school/# //也匹配单独的 “school” ,因为 # 包括它的父级。
>>2  # //是有效的,会收到所有的应用消息。
>>3  school/teacher/# //有效的。
>>4  school/teacher# //无效的。
>>5  school/teacher/#/lever //无效的,必须是主题过滤器的最后一个字符

4、 单层通配符—-“+”

加号是只能用于单个主题层级匹配的通配符。在主题过滤器的任意层级都可以使用单层通配符,包括第一个和最后一个层级。然而它必须占据过滤器的整个层级 。可以在主题过滤器中的多个层级中使用它,也可以和多层通配符一起使用。

>>1  china/+ 只能匹配 china/guangzhou
>>2  china/+/+/zhongshanlu 能匹配china/guangzhou/tianhe/zhongshanlu和china/shenzhen/nanshan/zhongshanlu

5、 通配符 —-“$”

通配符“$”表示匹配一个字符,只要不是放在主题的最开头,即:

>>1  $xx
>>2  /$xx
>>3  /xx$

其它情况下都表示匹配一个字符。

如果客户端想同时接受以 “SYS/”开头主题的消息和不以“SYS/”开头主题的消息和不以 开头主题的消息, 它需要同时订阅 “#” 和 “$SYS/#”。

6、 总结

  1. 所有的主题名和主题过滤器必须至少包含一个字符
  2. 主题名或主题过滤器以前置或后置斜杠 “/” 区分
  3. 只包含斜杠 “/” 的主题名或主题过滤器是合法的
  4. 主题名和主题过滤器是 UTF-8 编码字符串, 它们不能超过 65535 字节
  5. 主题名和主题过滤器是区分大小写的

免责声明:文章转载自《MQTT协议中的topic》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ORACLE 物理读 逻辑读 一致性读 当前模式读总结浅析[问题解决]同时显示多个Notification时PendingIntent的Intent被覆盖?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转 shell中字分隔的妙用:变量IFS

IFS 的全称是 Interal Field Separator ,即“内部区域分隔符”,它也是一个内置环境变量,存储着默认的文本分隔符,默认下这分隔符是空格符(space character),制表符(tab) 以及新行(newline) 。先看下面一个简单示例: ? 1 2 3 4 5 6 7 8 #!/bin/sh msg="welcom...

ROS4 : ROS节点和主题

  依照<ROS-3 : Catkin工作空间和ROS功能包>,创建catkin工作空间,并在起src下创建功能包ros_demo_pkg,依赖项为roscpp、std_msgs、actionlib、actionlib_msgs,并构建该空功能包。ROS中节点间的基本通讯方式是topic,即publish/subscribe模式。以下介绍如何创...

三个屏保软件

虽然液晶屏幕不再需要屏保了, 但有时候为了防止别人乱动电脑, 看起来也不错, 起码还能看表. 1. Padbury Clock 支持黑白主题, 可选是否24小时制, 是否显示分隔符等, 配置项比较全 效果比较满意: 2. FlipClock 配置项比较少, 有分页的效果, 但是不会显示分隔符, 看起来有点怪 3. Fliqlo  以前在window...

Django web编程2 -- 编辑页面内容

你将创建一些表单,让用户能够添加主题和条目,以及编辑既有的条目。你还将学习Django如何防范对基于表单的网页发起的常见攻击,这让你无需花太多时间考虑确保应用程序安全的问题。 然后,我们将实现一个用户身份验证系统。你将创建一个注册页面,供用户创建账户,并让有些页面只能供已登录的用户访问。接下来,我们将修改一些视图函数, 使得用户只能看到自己的数据。你将学习...

【RabbitMQ】一文带你搞定springboot整合RabbitMQ涉及消息的发送确认,消息的消费确认机制,延时队列的实现

说明 这一篇里,我们将继续介绍RabbitMQ的高级特性,通过本篇的学习,你将收获: 什么是延时队列 延时队列使用场景 RabbitMQ中的TTL 如何利用RabbitMQ来实现延时队列 本文大纲 什么是延迟队列 延时队列,首先,它是一种队列,队列意味着内部的元素是有序的,元素出队和入队是有方向性的,元素从一端进入,从另一端取出。 其次,延时队列,最...

python文件路径分隔符的详细分析

写了挺久的python,文件分隔符的掌握肯定是必须的,但是我之前写的都是不规范的文件路径分隔符,例如‘’C:User emppython.txt’,一直都没有报过错。也不知为啥,今天查阅资料才知道自己写的都是些假的python,所以就在此记录一下。 主要是需要考虑分隔符的问题:在Windows系统下的分隔符是: (反斜杠)。 在Linux系统下的分隔符是:...