IOT-MQTT协议-操作行为-TOPIC

4.7 Topic Names and Topic Filters  主题名称和主题过滤器

4.7.1 Topic wildcards  主题通配符

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

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

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

4.7.1.1  Topic level separator 主题级别分隔符

正斜杠('/'U + 002F)用于分隔主题树中的每个级别,并为主题名称提供分层结构。当订阅客户端指定的主题过滤器中遇到两个通配符中的任何一个时,主题级别分隔符的使用很重要。主题级别分隔符可以出现在主题过滤器或主题名称中的任何位置。相邻的主题级别分隔符表示零长度的主题级别。

4.7.1.2 Multi-level wildcard 多级通配符

数字符号('#'U + 0023)是一个通配符,可以匹配主题中的任意数量的级别。多级通配符表示父级和任意数量的子级别。多级通配符必须单独指定或在主题级别分隔符之后指定。在任何一种情况下,它必须是主题过滤器 [MQTT-4.7.1-2]中指定的最后一个字符。

非规范性评论

例如,如果客户订阅“sport / tennis / player1 /#”,它将接收使用这些主题名称发布的消息:

·“sport / tennis / player1”

·“sport / tennis / player1 / score / wimbledon”

非规范性评论

·“sport /#”也与单一的“运动”相匹配,因为#包括父级。

·“#”有效,将接收每个应用程序消息

·“sport / tennis /#”有效

·“sport / tennis#”无效

·“运动/网球/#/排名”无效

4.7.1.3  Single level wildcard  单级通配符

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

单级通配符可以在主题过滤器中的任何级别使用,包括第一级和最后一级。在使用它的地方必须占据过滤器的整个级别 [MQTT-4.7.1-3]。它可以在主题过滤器中的多个级别使用,并且可以与多级通配符一起使用。

非规范性评论

For example, “sport/tennis/+” matches “sport/tennis/player1” and “sport/tennis/player2”, but not 
 “sport/tennis/player1/ranking”. Also, because the single-level wildcard matches only a single level, 
 “sport/+” does not match “sport” but it does match “sport/”. 
 

非规范性评论

 “+” is valid 
  “+/tennis/#” is valid 
  “sport+” is not valid 
  “sport/+/player1” is valid                                                                                                                                            
  “/finance” matches “+/+” and “/+”, but not “+” 

4.7.2   Topics beginning with $   以$开头的主题

服务器必须不匹配主题过滤器,以带有$字符 [MQTT-4.7.2-1]的主题名称的通配符(#或+)开头。服务器应该阻止客户端使用此类主题名称与其他客户端交换消息。服务器实现可以使用以前导$字符开头的主题名称用于其他目的。 

非规范性评论

·$ SYS /已被广泛用作包含特定于服务器的信息或控制API的主题的前缀

·应用程序不能将具有前导$字符的主题用于其自身目的

非规范性评论

·订阅“#”将不会收到发布到以$开头的主题的任何消息

·订阅“+ / monitor / Clients”将不会收到发布到“$ SYS / monitor / Clients”的任何消息

·订阅“$ SYS /#”将收到发布到以“$ SYS /”开头的主题的消息

·订阅“$ SYS / monitor / +”将收到发布到“$ SYS / monitor / Clients”的消息

·对于客户端接收来自以$ SYS /开头的主题的消息,以及从不以$开头的主题接收消息,它必须同时订阅“#”和“$ SYS /#”

4.7.3  Topic semantic and usage  主题语义和用法

以下规则适用于主题名称和主题过滤器:

  • 所有主题名称和主题过滤器必须至少有一个字符长 [MQTT-4.7.3-1]
  • 主题名称和主题过滤器区分大小写
  • 主题名称和主题过滤器可以包含空格字符
  • 前导或尾随'/'创建一个独特的主题名称或主题过滤器
  • 仅包含'/'字符的主题名称或主题过滤器有效 
  • 主题名称和主题过滤器不得包含空字符(Unicode U + 0000)Unicode ] [MQTT-4.7.3-2]
  • 主题名称和主题过滤器是UTF-8编码的字符串,它们不能编码为超过65535字节 [MQTT-4.7.3-3]。见1.5.3节

除了UTF-8编码字符串的总长度所强加的级别外,主题名称或主题过滤器中的级别数量没有限制。

当它执行订阅匹配时,服务器不得执行主题名称或主题过滤器的任何规范化,或者对未识别字符的任何修改或替换 [MQTT-4.7.3-4]。主题过滤器中的每个非通配级别必须匹配主题名称字符中的相应级别才能使匹配成功。

非规范性评论

The UTF-8 encoding rules mean that the comparison of Topic Filter and Topic Name could be 
 performed either by comparing the encoded UTF-8 bytes, or by comparing decoded Unicode 
 characters

非规范性评论

“ACCOUNTS” and “Accounts” are two different topic names 
“Accounts payable” is a valid topic name 
“/finance” is different from “finance”

应用程序消息将发送到每个客户端订阅,其主题筛选器与附加到应用程序消息的主题名称匹配。主题资源可以由管理员在服务器中预定义,也可以由服务器在收到第一个订阅或具有该主题名称的应用程序消息时动态创建。服务器还可以使用安全组件有选择地授权给定客户端的主题资源上的操作。

4.8 Handling errors 处理错误

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

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

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

 

中文版地址:https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/0301-CONNECT.html

你可能感兴趣的:(MQTT)