MQTT——EMQX学习笔记07——topic、topic filter和主题通配符

目录标题

    • 一、思考
    • 二、主题通配符
    • 三、topic和topic filter

一、思考

  1. 订阅时需要填写的topic
    MQTT——EMQX学习笔记07——topic、topic filter和主题通配符_第1张图片
  2. 发布时需要填写的topic
    MQTT——EMQX学习笔记07——topic、topic filter和主题通配符_第2张图片
  3. 上面两个topic有什么不同?
  • 订阅时的topic叫做主题过滤器(topic filter),通过这个主题过滤器我们可以筛选主题,订阅多个主题。
  • 发布时的topic才叫做主题名,它是用来标记这条消息是什么类型的(也就是什么主题的)。

二、主题通配符

  1. 主题层级分隔符——’/’
    斜杠(’/’ U+002F)用于分割主题的每个层级, 为主题名提供一个分层结构. 当客户端订阅指定的主题过滤器包含两种通配符时, 主题层级分隔符就很有用了. 主题层级分隔符可以出现在主题过滤器或主题名字的任何位置. 相邻的主题层次分隔符表示一个零长度的主题层级. (个人理解:其实斜杠(’/’ U+002F)没有特殊的含义,它只是为了方便我们对主题名的分层管理而定义的。比如topic=t/1,你可以理解为主题名为:t/1 把他们看成一个整体。当然你也可理解为这个主题名是t下面的1,只是便于对主题名的分层管理。)
  2. 通配符1——单层通配符 ‘+’
    直接看例子:
  • 订阅客户端,订阅了:t/+ 这个主题。
  • 发布客户端,发布了:t/1 这个主题的消息——A;t/a 这个主题的消息——B;t/1/1 这个主题的消息——C; t/1/a 这个主题的消息——D。
  • 最终订阅客户端只接收到了A、B这两个消息。也就是只能接收到只有一个斜杠的主题的消息。(顾名思义,单层通配符)
  1. 通配符2——多层通配符 ‘#’
    多层通配符单层相对应。还是上面的例子。
  • 订阅客户端,改为订阅:t/# 这个主题。
  • 发布客户端,发布的消息不变
  • 最终订阅客户端会接收到A、B、C、D的消息。也就是只要开头是t的消息,不管后面有多少层都会匹配上。(顾名思义,多层通配符)

三、topic和topic filter

下列规则应用于主题名和主题过滤器:

  • 所有的主题名和主题过滤器必须至少包含一个字符 [MQTT-4.7.3-1].
  • 主题名和主题过滤器是大小写敏感的.
  • 主题名和主题过滤器可以包含空格字符.
  • 主题名或主题过滤器以前置或后置斜杠‘/’区分.
  • 只包含斜杠‘/’的主题名或主题过滤器是合法的.
  • 主题名和主题过滤器不能包含空字符(Unicode U+0000) [Unicode] [MQTT-4.7.3-2].
  • 主题名和主题过滤器是UTF-8编码字符串, 它们不能超过65,535字节 [MQTT-4.7.3-3]. 见1.5.4节 .
  • 主题名不能使用通配符, 但是主题过滤器中可以使用通配符.
除了不能超过UTF-8编码字符串的长度限制之外, 主题名或主题过滤器的层级数量没有其它限制.
匹配订阅时, 服务端不能对主题名或主题过滤器执行任何规范化(normalization)处理, 不能修改或替换任何未识别的字符.
[MQTT-4.7.3-4]. 主题过滤器中的每个非通配符层级需要逐字符匹配主题名中对应的层级才算匹配成功.

注意: 主题名最好不要以 $ 开头。

$ SYS/被广泛用作包含服务端特定信息或控制接口的主题的前缀.
• 应用不能使用$字符开头的主题. 比如: $share/{ShareName}/{filter} 为共享订阅(主题过滤器) $delayed/{DelayInterval}/{TopicName} (主题名)

你可能感兴趣的:(MQTT,物联网,MQTT,EMQX)