文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

订阅和退订

MQTT Essentials Part 4 Banner

欢迎来学习MQTT基础入门的第四部分,这是关于MQTT协议核心特征和概念的系列博客。在这篇文章中,我们将重点讨论有关MQTT的发布、订阅和退订。在第二部分中,我们学习了发布/订阅的基础知识,与此相比,这篇文章将说一说MQTT协议中发布和订阅的具体内容。如果你还没有读过第2部分 关于发布/订阅模式的基础知识 ,我们强烈建议你首先去读一读。

上周我们学习了如何在MQTT客户端和代理之间创建一个连接。 那么本周的这篇文章将讨论如何发送和接收消息。

第 1 段(可获 1.46 积分)

发布

当MQTT客户端和代理(broker)建立连接后,就可以发布消息了。MQTT的代理具有基于主题的消息过滤机制(更多详细内容可查看第2部分),因此每个消息必须包含一个主题,代理(broker)根据主题将消息转发给感兴趣的客户端。每个消息通常拥有payload,其中包含了以字节格式传输的实际数据。MQTT是数据不可知的,也就是说它完全依赖于使用场景来决定如何构建有效载荷(payload)。如果想要发送二进制数据、文本数据或者甚至是完整的XML或JSON数据,也是完全能满足要求的。MQTT的消息发布还有更多特性,下面我们将详细讨论:

第 2 段(可获 1.55 积分)

MQTT Publish attributes

主题名称

它是一个简单的字符串,使用分层结构,并且用左斜杠作为分隔符。例如,“myhome/livingroom/temperature”或“Germany/Munich/Octoberfest/people”。有关主题的更多细节可以在MQTT基础入门的第5部分中找到。

服务质量(QoS)

即消息的服务质量(QoS:Quality of Service Level)。级别(0、1或2)决定了消息到达另一端(客户端或代理)时的质量保证。有关服务质量的更多细节可以在MQTT基础入门的第6部分中找到。

保持标志(Retain-Flag)

该标志确定代理是否持久保存某个特定主题的消息。订阅该主题的新客户端将在订阅后立即收到该主题的最后保留消息。在接下来的文章中将讨论有关消息保持的更多内容以及最佳实践。

第 3 段(可获 1.71 积分)

有效载荷(Payload)
这是消息的实际内容。MQTT是完全数据未知的,发送的有可能是图片、任何编码的文本、加密的数据,但实际上每个数据都是二进制的形式。

包标识符(Packet Identifier)
包标识符是客户端和代理之间的唯一标识符,用于标识消息流中的消息。它只与大于零的服务质量有关。设置此MQTT内部标识符是客户端库和/或代理的责任。

重复标志(DUP flag)
该重复标志表示,此消息是重复的,是因为另一端没有识别原始消息而重发的。这只是和大于0时的QoS有关,更多细节在第6部分,关于QoS级别。发送/复制机制的实现细节通常由MQTT客户端库或代理处理。

第 4 段(可获 1.78 积分)

因此,当客户端向MQTT代理服务器发送一个publish时,代理服务器将阅读该publish,必要时(根据QoS级别)识别该publish,然后进行处理。处理包括确定哪个客户端订阅了该主题,然后将消息发送给订阅了该主题的那个客户端。

MQTT Publish Message Flow

最初发布消息的客户端只关心向代理服务器传递publish消息。自此,代理服务器就负责将消息传递给所有的订阅者。某人是否对发布的消息感兴趣,以及到底有多少客户端收到了代理服务器的消息,对此,发布客户端不会得到任何反馈。

第 5 段(可获 1.46 积分)

订阅(Subscribe)

如果没有人收到消息,或者换句话说,如果没有客户订阅任何主题,发布消息就没有意义了。客户端需要向MQTT代理服务器发送订阅消息以便收到相关消息。订阅消息非常简单,它只包含一个唯一的包标识符和一个订阅列表。

MQTT Subscribe attributes

包标识符(Packet Identifier)
包标识符是客户端和代理之间的唯一标识符,用于标识消息流中的某个消息。它仅仅与大于零的服务质量有关。设置此MQTT内部标识符是客户端库和/或代理服务器的责任。

第 6 段(可获 1.36 积分)

订阅列表
订阅消息可以包含对某个客户端的任意数量的订阅。每个订阅都是由一对主题和QoS级别组成。订阅消息的主题还可以包含通配符,这使得可以订阅特定的主题模式。如果对一个客户端有重叠订阅,则代理服务器将使用该主题的最高QoS级别传递消息。

订阅应答(Suback)

每个订阅都将由代理服务器通过向客户端发送一个SUBACK消息进行确认。此消息包含与原始订阅消息(以标识消息)相同的数据包标识符和返回代码列表。

第 7 段(可获 1.51 积分)

MQTT SUBACK attributes

包标识符(Packet Identifier)
包标识符是用来识别某个消息的唯一标识。它和SUBSCRIBE消息中的相同。

返回代码(Return Code)
代理服务器会为订阅消息中收到的每个主题/ QoS对发送一个返回代码。因此,如果订阅消息有5个订阅,将有5个返回代码,以确认代理服务器授权的具有QoS级别的每个主题。如果订阅被代理服务器禁止(例如,如果客户端不允许订阅此主题,由于权限不足或该主题有问题),代理服务器将向指定主题响应失败返回代码。

第 8 段(可获 1.39 积分)
返回代码返回代码响应
0成功 – 最大 QoS 0
1成功 – 最大 QoS 1
2成功 – 最大 QoS 2
128失败

MQTT Subscribe Flow

当某个客户端成功发送订阅(SUBSCRIBE)消息并收到了订阅响应(SUBACK)消息,它将接收到与订阅主题匹配的每个已发布消息。

退订(Unsubscribe)

和订阅(SUBSCRIBE)消息相对应的是退订(UNSUBSCRIBE)消息,它将从代理服务器上删除某个客户端已存在的订阅。退订消息和订阅消息很相似,同样包括一个包标识符和主题列表。

MQTT Unsubscribe attributes

包标识符(Packet Identifier)
包标识符是用来标识消息的唯一标识符。退订消息的确认包含相同的标识符。

第 9 段(可获 1.41 积分)

主题列表
主题列表包含客户端希望退订的任意数量的主题。只需要把主题作为字符串来发送(无需QoS),无论最初订阅时QoS级别是什么,这些主题都将被退订。

退订响应(Unsuback)

代理服务器将通过退订响应(UNSUBACK)消息确认退订请求。该消息只包含一个包标识符。

MQTT UNSUBACK attributes

包标识符(Packet Identifier)
数据包标识符是用来标识消息的唯一标识符。它和退订消息中的相同。

Unsubscribe Flow

客户端从代理服务器接收到退订响应(UNSUBACK)消息后,就认为退订(UNSUBSCRIBE)消息中的订阅已被删除了。

第 10 段(可获 1.35 积分)

至此,我们的MQTT基础入门系列的第四部分就结束了。我们希望你喜欢它。在接下来的文章中我们将深入讨论MQTT主题的使用。我们将讲解通配符的基础知识以及使用方法,并给出大量的实例。

祝一周愉快,我们希望在下一个MQTT Monday

为了能将每一篇最新文章直接发送到你的收件箱,如果你还没有注册我们的电子简讯的话,接下来可以注册一下。如果你喜欢用RSS,也可以订阅我们的RSS feed

第 11 段(可获 1.31 积分)

文章评论