跳到主要内容

MQTT主题结构和语法

作为一种发布/订阅消息协议,MQTT 依赖于分层主题。客户端可以在特定主题上发布消息,客户端可以接收与它们当前主题过滤器匹配的已发布消息。MQTT 主题是 UTF-8 字符串,由一个或多个主题级别组成,这些级别由正斜杠(/)字符分隔,从而为组织主题创建了信息层次结构。在创建主题字符串时,重要的是要注意 Solace PubSub+ 事件代理支持最多 128 个级别的主题字符串,最大长度为 250 字节,因此超过这些限制的 MQTT 客户端连接将被关闭。

Solace PubSub+ 允许在 MQTT 客户端和非 MQTT 客户端(例如,SMF 和 REST 客户端)之间交换消息,前提是这些客户端使用相交的主题层次结构。然而,为了部署使用不同 Solace 支持的消息协议的客户端应用程序,架构师和程序员应避免使用冲突的特殊字符,并使用通用主题语法子集,以确保以一致的方式满足主题过滤器。有关更多信息,请参阅跨协议消息传递的主题推荐。

MQTT主题名称和过滤器中的特殊字符

PubSub+ 事件代理按以下方式解释 MQTT 主题名称和过滤器中的特殊字符:

  • 如果事件代理在发布数据包中的主题名称中收到 +# 字符,它将它们视为文字字符。大多数 MQTT API 不允许在主题名称中使用这些字符,符合 MQTT 规范。 事件代理自动为每个客户端创建以 #P2P/ 前缀开头的主题订阅,这允许消息直接发送到该客户端(例如,在请求/回复场景中)。然而,#P2P 中的前导 # 不是有效的 MQTT 语法。因此,为了利用这些特殊的 Solace 订阅,MQTT 客户端可以使用字符串 _P2P 代替 #P2P。事件代理认为这两个字符串是等效的。

  • MQTT 主题名称或主题过滤器中的前导 ! 与 SMF 主题或订阅中的前导 ! 的处理方式相同。有关更多信息,请参阅系统级订阅异常配置。

  • 格式为 $share/{ShareName}/{filter} 的 MQTT 主题过滤器表示共享订阅。有关更多信息,请参阅共享订阅。

  • $noexport 开头的 MQTT 主题过滤器表明事件代理不应导出共享订阅。有关详细信息,请参阅特殊 Solace MQTT 主题。

跨协议消息传递的主题推荐

当 MQTT 和非 MQTT 客户端使用相交的主题层次结构时,MQTT 客户端可以接收非 MQTT 客户端(例如,SMF 或 REST 客户端)发布的消息,非 MQTT 客户端也可以接收 MQTT 客户端发布的消息。希望在协议之间通信的应用程序应避免使用冲突的特殊字符,并使用通用主题语法子集。

具体来说,这意味着应用程序必须:

  • 避免使用 + 字符。它在 MQTT 主题名称中是非法的。尽管 SMF 将 MQTT 主题名称中的 + 字符视为文字,但 MQTT API 可能会阻止它。
  • 避免使用 # 字符。它在 MQTT 主题名称中是非法的。尽管 SMF 将 MQTT 主题名称中的 # 字符视为文字,但 MQTT API 可能会阻止它。
  • 避免使用 * 字符。SMF 将 * 字符视为通配符,但 MQTT 将其视为文字。SMF 客户端不一定能够订阅包含此字符的主题。
  • 避免使用 > 字符作为独立的最终主题级别。SMF 将 > 字符视为通配符,但 MQTT 将其视为文字。因此,订阅此类主题的 SMF 客户端可能会吸引额外的流量。
  • 避免在主题开头使用 $ 字符。在 MQTT 中,以 $ 开头的主题名称保留供服务器实现使用,客户端不应使用。这使得此类主题不适合客户端之间的消息传递。
  • 避免使用空的主题级别。MQTT 支持空的主题级别,Solace PubSub+ 事件代理版本 7.1.1 或更高版本允许在 SMF 主题中使用空的主题级别。然而,使用空主题级别与 SMF 主题存在一些限制:
    • 使用 Solace 消息 API 的客户端应用程序可以发布到带有空级别的主题,但它们不能使用带有空级别的主题过滤器或订阅。
    • ACL 配置文件不允许带有空主题级别的 SMF 发布或订阅主题异常。

使用订阅管理器与 MQTT 客户端

配置为消息 VPN 上的订阅管理器的客户端应用程序可以代表同一消息 VPN 中的其他客户端添加或删除 QoS 0 的主题过滤器。(有关更多信息,请参阅代表其他客户端管理订阅。)

尽管您可以使用订阅管理器客户端为 MQTT 客户端添加或删除主题过滤器,但这些主题过滤器只能使用 SMF 语法。因此,为了避免 MQTT 客户端的订阅解析错误,这些主题过滤器应考虑以下几点编写:

  • 不允许使用 SMF 通配符 >,因为在 MQTT 中没有等效物——在 SMF 中,> 字符必须匹配 1 个或多个主题级别,而在 MQTT 中,# 字符必须匹配 0 个或多个主题级别。
  • 必须使用 ASCII 字符 0x03 代替 MQTT 通配符 #
  • 必须使用 SMF 通配符 * 代替 MQTT 通配符 + 用于 MQTT 客户端。*+ 通配符是完全等效的。

特殊Saydo MQTT主题

PubSub+ 事件代理使用多个特殊主题来实现某些 Solace 消息功能。这些主题中的每一个都以 $ 字符开头,然后是一个特定的保留字符序列。

主题描述
$noexport/防止订阅(共享或非共享)被暴露给 MNR 或 DMR。
有关更多信息,请参阅保留主题。
$SYS/client/client-name当 MQTT 客户端订阅此特殊主题时,事件代理将响应 MQTT 会话的客户端名称。客户端名称是配置代表其他客户端的订阅管理器所必需的。有关更多信息,请参阅使用特殊主题请求会话信息和代表其他客户端管理订阅。
$SYS/client/reply-to当 MQTT 客户端订阅此特殊主题时,事件代理将响应 MQTT 客户端的 reply-to 目的地。换句话说,发布到此主题的消息正文提供了为客户端保留的 reply-to 主题/目的地。reply-to 目的地是实现请求/回复消息模式所必需的。有关更多信息,请参阅使用特殊主题请求会话信息。
在 MQTT 5.0 中,对 reply-to 主题的需求已被 CONNECT/CONNACK 交换中添加的响应信息所取代。有关详细信息,请参阅 3.2 CONNACK – Connect
acknowledgement。