在这篇文章中,我们重点介绍 MQTT 中的发布、订阅和取消订阅。在本系列的前面部分,我们介绍了发布/订阅模型的基础知识。在这篇文章中,我们将深入研究 MQTT 协议中发布/订阅的细节。如果您还没有阅读发布/订阅模式的基础知识,我们强烈建议您先阅读前几章节。
上节,我们研究了在 MQTT 客户端和代理之间建立连接。本节,我们将在讨论发送和接收消息时以这些信息为基础。在这篇博文的最后,我们还有一个关于该主题的视频,作为这篇博文的补充。
Publish 发布
MQTT 客户端可以在连接到代理后立即发布消息。MQTT 对代理上的消息进行基于主题的过滤(有关详细信息,请参阅第 2 部分)。每条消息都必须包含一个主题,代理可以使用该主题将消息转发给感兴趣的客户端。通常,每条消息都有一个有效负载,其中包含要以字节格式传输的数据。MQTT 与数据无关。客户端的用例决定了有效负载的结构。发送客户端(发布者)决定是否要发送二进制数据、文本数据,甚至是成熟的 XML 或 JSON。
MQTT 中的 PUBLISH 消息有几个属性,我们想详细讨论:
数据包标识符(Packet Identifier) 数据包标识符在客户端和代理之间流动时唯一标识消息。数据包标识符仅与大于零的 QoS 级别相关。客户端库和/或代理负责设置此内部 MQTT 标识符。
主题名称(Topic Name) 主题名称是一个简单的字符串,其层次结构以正斜杠作为分隔符。例如,“我的家/客厅/温度”或“德国/慕尼黑/十月节/人”。有关主题的详细信息,请参阅 MQTT 要点的第 5 部分 。
QoS 此数字指示消息的服务质量级别 (QoS)。有三个级别:0、1 和 2。服务级别确定邮件到达目标收件人(客户端或代理)的保证类型。有关 QoS 的详细信息,请参阅 MQTT 要点的第 6 部分 。
保留标志(Retain Flag) 此标志定义消息是否由代理保存为指定主题的最后一个已知良好值。当新客户端订阅主题时,它们会收到保留在该主题上的最后一条消息。有关保留消息的详细信息,请参阅 MQTT 要点的第 8 部分 。
有效负载(Payload) 这是消息的实际内容。MQTT 与数据无关。可以发送图像、任何编码的文本、加密数据以及二进制的几乎每个数据。
DUP 标志(DUP flag) 该标志指示消息是重复的,并且由于目标收件人(客户端或代理)未确认原始消息而重新发送。这仅与大于 0 的 QoS 相关。通常,重新发送/复制机制由 MQTT 客户端库或代理作为实现细节进行处理。有关更多信息,请参阅 MQTT 要点的第 6 部分。
当客户端将消息发送到 MQTT 代理进行发布时,代理会读取消息、确认消息(根据 QoS 级别)并处理消息。代理的处理包括确定哪些客户端订阅了主题并将消息发送给它们。
最初发布消息的客户端只关心将 PUBLISH 消息传递给代理。一旦代理收到 PUBLISH 消息,代理就有责任将消息传递给所有订阅者。发布客户端不会获得有关是否有人对已发布的消息感兴趣或有多少客户端从代理接收消息的任何反馈。
Subscribe 订阅
如果没有人收到消息,发布消息就没有意义。换句话说,如果没有客户端订阅消息的主题。要接收有关感兴趣主题的消息,客户端会向 MQTT 代理发送 SUBSCRIBE 消息。此订阅消息非常简单,它包含一个唯一的数据包标识符和一个订阅列表。
数据包标识符(Packet Identifier) 数据包标识符唯一地标识一条消息,因为它在客户端和代理之间流动。客户端库和/或代理负责设置此内部 MQTT 标识符。
订阅列表(List of Subscriptions) 一个 SUBSCRIBE 消息可以包含一个客户端的多个订阅。每个订阅由一个主题和一个 QoS 级别组成。订阅消息中的主题可以包含通配符,使订阅主题模式而不是特定主题成为可能。如果一个客户端有重叠的订阅,则代理会为该主题传送具有最高 QoS 级别的消息。
Suback 发布确认
为了确认每个订阅,代理向客户端发送 SUBACK 确认消息。此消息包含原始订阅消息的数据包标识符(以清楚地标识消息)和返回代码列表。
数据包标识符(Packet Identifier) 数据包标识符是用于标识消息的唯一标识符。它与 SUBSCRIBE 消息中的相同。
Return Code 代理为它在 SUBSCRIBE 消息中接收到的每个主题/QoS 对发送一个返回码。例如,如果 SUBSCRIBE 消息有五个订阅,则 SUBACK 消息包含五个返回码。返回代码确认每个主题并显示代理授予的 QoS 级别。如果代理拒绝订阅,则 SUBACK 消息包含该特定主题的失败返回代码。例如,如果客户端没有足够的权限订阅主题或主题格式不正确。
客户端成功发送 SUBSCRIBE 消息并收到 SUBACK 消息后,它会获取与 SUBSCRIBE 消息包含的订阅中的主题匹配的每条已发布消息。
Unsubscribe 退订
与 SUBSCRIBE 消息对应的是 UNSUBSCRIBE 消息。此消息删除代理上客户端的现有订阅。 UNSUBSCRIBE 消息类似于 SUBSCRIBE 消息,具有数据包标识符和主题列表。
数据包标识符(Packet Identifier) 数据包标识符唯一地标识一条消息,因为它在客户端和代理之间流动。客户端库和/或代理负责设置此内部 MQTT 标识符。
主题列表(List of Topic) 主题列表可以包含客户端想要取消订阅的多个主题。只需要发送主题(无 QoS)。代理取消订阅该主题,而不管它最初订阅的 QoS 级别如何。
Unsuback 取消订阅
为了确认取消订阅,代理向客户端发送 UNSUBACK 确认消息。该消息仅包含原始 UNSUBSCRIBE 消息的数据包标识符(以明确标识该消息)。
数据包标识符(Packet Identifier) 数据包标识符唯一标识消息。如前所述,这与 UNSUBSCRIBE 消息中的数据包标识符相同。
从代理收到 UNSUBACK 后,客户端可以假定 UNSUBSCRIBE 消息中的订阅已删除。
我们的 MQTT Essentials 系列的第四部分到此结束。我们希望你喜欢它。在我们的下一篇文章中,我们将深入探讨如何使用 MQTT 主题。我们将介绍主题基础知识、如何使用通配符,并提供大量实际示例。
系列的第四部分到此结束。我们希望你喜欢它。在我们的下一篇文章中,我们将深入探讨如何使用 MQTT 主题。我们将介绍主题基础知识、如何使用通配符,并提供大量实际示例。