本文翻译自http://www.hivemq.com/blog/mqtt-essentials-part-4-mqtt-publish-subscribe-unsubscribe
未经允许,不得转载
发布
在MQTT客户端与broker建立连接之后,它就可以发布消息了。MQTT broker根据主题来过滤消息(参见Part 2),所以,每个消息都必须包含主题,broker依据主题来给订阅了此主题的客户端转发消息。通常每条消息都含有一个消息体(payload),消息体以字节格式封装实际传输数据。MQTT是数据不可知的,也就是说它完全依赖于使用场景来决定如何构建有效消息体(payload)。如果想要发送二进制数据、文本数据或者甚至是完整的XML或JSON数据,也完全没问题。MQTT的消息发布还有更多特性,下面我们将详细讨论:
Topic Name(主题名称)
它可以是一个简单的字符串,使用分层结构,并且用左斜杠作为分隔符。例如,“myhome/livingroom/temperature”或“Germany/Munich/Octoberfest/people”。有关主题的更多细节可以在MQTT基础的第5部分中找到。
QoS(服务质量)
即消息的服务质量级别(Quality of Service Level)。级别(0、1或2)决定了消息到达另一端(客户端或代理)时的质量保证。有关服务质量的更多细节可以在MQTT基础入门的第6部分中找到。
Retain-Flag(保持标志)
该标志确定代理是否持久保存某个特定主题的消息。订阅该主题的新客户端将在订阅后立即收到该主题的最后保留消息。在接下来的文章中将讨论有关消息保持的更多内容以及最佳实践。
Payload(有效载荷)这是消息的实际内容。MQTT是完全数据未知的,发送的有可能是图片、任何编码的文本、加密的数据,但实际上每个数据都是二进制的形式。
Packet Identifier(包标识符)包标识符是客户端和broker之间的唯一标识符,用于标识消息流中的消息。它只与大于0的服务质量有关。设置此MQTT内部标识符是客户端库文件,和/或是broker的责任。
DUP flag(重复标志)该重复标志表示,此消息是重复的,是因为另一端没有应答原始消息而重发的。这只是和大于0时的QoS有关,更多细节在第6部分,关于QoS级别。重发/副本机制的实现细节通常由MQTT客户端库或代理处理。
因此,当客户端向MQTT代理服务器发送一个publish时,代理服务器将阅读该publish,必要时(根据QoS级别)应答该publish,然后进行处理。处理包括确定哪个客户端订阅了该主题,然后将消息发送给订阅了该主题的那个客户端。
最初发布消息的客户端只关心向代理服务器传递publish消息。自此,代理服务器就负责将消息传递给所有的订阅者。某人是否对发布的消息感兴趣,以及到底有多少客户端收到了代理服务器的消息,对此,发布客户端不会得到任何反馈。
订阅(Subscribe)
如果没有人收到消息,或者换句话说,如果没有客户订阅任何主题,发布消息就没有意义了。客户端需要向MQTT代理服务器发送订阅消息以便收到相关消息。订阅消息非常简单,它只包含一个唯一的包标识符和一个订阅列表。
Packet Identifier(包标识符)
包标识符是客户端和broker之间的唯一标识符,用于标识消息流中的某个消息。它仅仅与大于零的服务质量有关。设置此MQTT内部标识符是客户端库文件,和/或代理服务器的责任。
订阅列表
订阅消息可以包含对某个客户端的任意数量的订阅。每个订阅都是由一对主题和QoS级别组成。订阅消息的主题还可以包含通配符,这使得可以订阅特定的主题模式。如果对一个客户端有重叠订阅,则代理服务器将使用该主题的最高QoS级别传递消息。
订阅应答(Suback)
每个订阅都将由代理服务器通过向客户端发送一个SUBACK消息进行确认。此消息包含与原始订阅消息相同的数据包标识符(以便标识消息)和返回码列表。
Packet Identifier(包标识符)
包标识符是用来识别某个消息的唯一标识。它和SUBSCRIBE消息中的相同。
Return Code(返回码)
代理服务器会为订阅消息中收到的每个主题/ QoS对发送一个返回码。因此,如果订阅的消息有5个,将有5个返回代码,以确认代理服务器授权的具有QoS级别的每个主题。如果订阅被代理服务器禁止(例如,如果客户端不允许订阅此主题,由于权限不足或该主题有问题),代理服务器将向指定主题响应失败返回码。
返回代码 | 返回代码响应 |
---|---|
0 | 成功 – 最大 QoS 0 |
1 | 成功 – 最大 QoS 1 |
2 | 成功 – 最大 QoS 2 |
128 | 失败 |
当某个客户端成功发送订阅(SUBSCRIBE)消息并收到了订阅响应(SUBACK)消息,它将接收到与订阅主题匹配的每个已发布消息。
退订(Unsubscribe)
和订阅(SUBSCRIBE)消息相对应的是退订(UNSUBSCRIBE)消息,它将从代理服务器上删除某个客户端已存在的订阅。退订消息和订阅消息很相似,同样包括一个包标识符和主题列表。
Packet Identifier(包标识符)
包标识符是用来标识消息的唯一标识符。退订消息的确认包含相同的标识符。
主题列表
主题列表包含客户端希望退订的任意数量的主题。只需要把主题作为字符串来发送(无需QoS),无论最初订阅时QoS级别是什么,这些主题都将被退订。
退订响应(Unsuback)
代理服务器将通过应答退订响应(UNSUBACK)消息确认退订请求。该消息只包含一个包标识符。
Packet Identifier(包标识符)
数据包标识符是用来标识消息的唯一标识符。它和退订消息中的标识符相同。
客户端从代理服务器接收到退订响应(UNSUBACK)消息后,就认为退订(UNSUBSCRIBE)消息中的订阅已被删除了。
网友评论