【MQTT从入门到提高系列 | 08】MQTT3.1.1主题Topic详解

这是机器未来的第34篇文章

原文首发地址:http://t.csdn.cn/DwLgX

mqtt-slogon-5

文章目录

  • 1. 主题Topic
    • 1.1 主题级别分隔符
    • 1.2. 多级通配符#
    • 1.3 单级通配符+
    • 1.4 $开头的特殊主题
    • 1.5 主题语法
  • 2. 错误处理

1. 主题Topic

主题级别分隔符用于将结构引入主题名称。如果存在,它将主题名称划分为多个“主题级别”。

举例:阀门的状态数据主题:/topic/valve/state

订阅的主题过滤器可以包含特殊的通配符,允许您一次订阅多个主题。

通配符可以在主题过滤器中使用,但不得在主题名称[MQTT-4.7.1-1]中使用

1.1 主题级别分隔符

  • 正斜杠 (‘/’ U+002F) 用于分隔主题树中的每个级别,并为主题名称提供层次结构。
  • 主题级别分隔符可以出现在主题过滤器或主题名称中的任何位置。

topicName:/topic/valve/upload
topicFilter:/topic/valve/#

  • 相邻主题级别分隔符(2个连续的’/')表示零长度主题级别。

topicName:/topic/valve//control

1.2. 多级通配符#

  • 数字符号 (‘#’ U+0023) 是一个通配符,可匹配主题中任意数量的级别。多级通配符代表父级和任意数量的子级。
  • 多级通配符必须单独指定或在主题级分隔符之后指定。
  • 在任何一种情况下,它都必须是主题过滤器 [MQTT-4.7.1-2]中指定的最后一个字符
    举例:
    • 主题列表
      • sport/tennis/player1
      • sport/tennis/player1/ranking
      • sport/tennis/player1/score/wimbledon
序号 示例 合法状态 适配主题 备注
1 sport/tennis/# 合法 sport/tennis/player1
sport/tennis/player1/ranking
sport/tennis/player1/score/wimbledon
2 sport/# 合法 sport
sport/tennis
sport/tennis/player1
sport/tennis/player1/ranking
sport/tennis/player1/score/wimbledon
多级通配符可匹配父级目录
3 sport/tennis# 非法 不满足【单独指定】或【主题级分隔符之后】
4 sport/tennis/#/ranking 非法 不满足【主题过滤器 中指定的最后一个字符】

1.3 单级通配符+

加号 (‘+’ U+002B) 是一个通配符,仅匹配一个主题级别。

  • 在使用它的地方,它必须占据过滤器的整个级别
  • 主题过滤器中的多个级别使用,并且可以与多级通配符一起使用
    举例:
    • 主题列表
      • sport/tennis/player1
      • sport/tennis/player1/ranking
      • sport/tennis/player1/score/wimbledon
序号 示例 合法状态 适配主题 备注
1 sport/tennis/+ 合法 sport/tennis/player1
2 sport/+ 合法 sport/
sport/tennis
单级通配符仅可匹配同级别主题,不可匹配子主题,也不可匹配父主题
3 + 合法 sport 单级通配符仅可匹配同级别主题
4 +/tennis/# 合法 sport/tennis/player1
sport/tennis/player1/ranking
sport/tennis/player1/score/wimbledon
5 sport+ 非法 不满足【必须占据过滤器的整个级别】

1.4 $开头的特殊主题

  • 多级通配符#和单级通配符+不能匹配以$开头的特殊主题;
  • 开头的特殊主题常用于特殊控制目的,例如 开头的特殊主题常用于特殊控制目的,例如 开头的特殊主题常用于特殊控制目的,例如SYS/,客户端不能定义以$开头的主题
  • 如果客户端需要订阅 开头的主题,需要单独订阅 开头的主题,需要单独订阅 开头的主题,需要单独订阅主题,用法如下:
    • 例如 主题的名称为: 主题的名称为: 主题的名称为:SYS/monitor/Clients,则客户端订阅主题过滤器可以设置为: $SYS/monitor/+或$SYS/monitor/#
  • 客户端要接收来自以 $SYS/ 开头的主题和不以 $ 开头的主题的消息,它必须同时订阅“#”和“$SYS/#”

1.5 主题语法

  • 所有主题名称和主题过滤器必须至少有一个字符长 [MQTT-4.7.3-1],主题分级标识符’/'也算占1个字节
  • 主题名称和主题过滤器区分大小写
  • 主题名称和主题过滤器可以包含空格字符
  • 前导或尾随“/”创建不同的主题名称或主题过滤器
    • topic和/topic、topic和topic/这两对都不是相同的主题名称
  • 仅包含“/”字符的主题名称或主题过滤器是有效的
  • 主题名称和主题过滤器不得包含空字符 (Unicode U+0000) [ Unicode ] [MQTT-4.7.3-2]
  • 主题名称和主题过滤器是 UTF-8 编码的字符串,它们的编码不得超过 65535 字节 [MQTT-4.7.3-3]。见第 1.5.3 节

2. 错误处理

除非另有说明,如果服务器或客户端遇到协议违规,它必须关闭它收到导致协议违规的控制数据包的网络连接 [MQTT-4.8.0-1]。

客户端或服务器实现可能会遇到阻止成功处理 MQTT 数据包的瞬态错误(例如内部缓冲区已满情况)。

如果客户端或服务器在处理入站控制数据包时遇到瞬态错误,它必须关闭接收该控制数据包的网络连接 [MQTT-4.8.0-2]。如果服务器检测到瞬态错误,它不应该断开连接或对其与任何其他客户端的交互产生任何其他影响

《MQTT快速入门系列》快速导航:

  • 【MQTT从入门到提高系列 | 01】从0到1快速搭建MQTT测试环境
  • 【MQTT从入门到提高系列 | 02】MQTT3.1.1TLS加密传输
  • 【MQTT从入门到提高系列 | 03】一文掌握MQTT3.1.1协议框架
  • 【MQTT从入门到提高系列 | 04】MQTT应用协议之CONNECT
  • 【MQTT从入门到提高系列 | 05】MQTT3.1.1之PUBLISH发布工作流
  • 【MQTT从入门到提高系列 | 06】MQTT3.1.1之SUBSCRIBE订阅工作流
  • 【MQTT从入门到提高系列 | 07】MQTT3.1.1之链路保活及断开

写在末尾:

  • 博客简介:专注AIoT领域,追逐未来时代的脉搏,记录路途中的技术成长!
  • 专栏简介:从0到1掌握MQTT分布式协议。
  • 面向人群:零基础编程爱好者
  • 专栏计划:接下来会逐步发布跨入人工智能的系列博文,敬请期待
    • Python零基础快速入门系列
    • 快速入门Python数据科学系列
    • 人工智能开发环境搭建系列
    • 机器学习系列
    • 物体检测快速入门系列
    • 自动驾驶物体检测系列

你可能感兴趣的:(MQTT从入门到提高系列,服务器,运维,MQTT,物联网,分布式消息中间件)