查看: 2227|回复: 0

MQTT协议介绍之三:发送和接收消息

[复制链接]

该用户从未签到

发表于 2017-8-25 19:52:40 | 显示全部楼层 |阅读模式
分享到:
在机智云的整个架构里面,如上图,GAgent实现了从模块到云端的数据交互,其实GAgent里面就是用MQTT协议实现的,可见MQTT协议的重要性。今天详细介绍MQTT的发送和接收消息。

在这一章中,我们将集中讲解MQTT的发布、订阅和取消订阅的相关问题。本节讲的是关于发布/订阅基础的,这篇文章将重点讲解在MQTT协议中发布和订阅的具体细节。如果您没有阅读第二章,关于发布/订阅模式基本知识的,我们强烈建议您先阅读。

上一节我们研究了建立MQTT客户端和代理之间的连接,所以本周我们将讨论发送和接收消息。
发布
MQTT客户端连接到代理后,可以发布消息。代理发送的消息主题进行过滤。所以每个消息都必须包含一个主题,由代理将使用该主题将消息转发给感兴趣的客户端。每个消息通常具有包含以字节格式传输的实际数据的有效载荷。MQTT与数据无关,完全取决于有效负载的结构使用情况。如果要发送二进制数据,文本数据,甚至是完整的XML或JSON,则完全由发送人来决定。MQTT发布消息还有一些很多的属性,我们将在下面详细讨论:
  • Topic Name(主题名称)

一个简单的字符串,其分层结构以正斜杠为分隔符。举一个例子如:“myhome / livingroom / temperature”或“Germany / Munich / Octoberfest / people”。有关主题的更多详细信息,请参考后面的文章。
  • QoS(服务质量)

一个消息的服务质量水平,级别有0、1、2,是确定到达另一端(客户端或代理)的消息的保证。关于更多关于QoS的内容,我们将在后面做详细的介绍。
  • Retain-Flag(保持标志)

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

这是消息的实际内容。MQTT完全与数据无关的,可以对数据进行任何编码,加密数据和二进制的数据。
  • Packet Identifier(包标识符)

包标识符是客户端和代理之间的唯一标识符,用于标识消息流中的消息。这仅适用于QoS1和QoS2。设置这个MQTT内部标识符是客户端库或代理的事情。
  • DUP flag(重复标志)

重复标志表示该消息是重复的,并且被重新发送,因为另一端没有确认原始消息。这仅与QoS1和QoS2相关,更多细节在后面介绍,这与QoS级别有关。他的重新发送/重复机制通常由MQTT客户端库或代理程序作为实现细节处理。
最初发布消息的客户端只关心将发布的消息传递给代理。从那里,代理有责任将消息传递给相应的订阅者。发布客户端没有得到任何反馈,如果有人对此发布的消息感兴趣,也可以有多个客户端接收到该代理的消息,接收到该消息的也可以是发布客户端本身,因为发布和订阅不是冲突的。
订阅
如果没有人收到消息,发布消息是没有意义的,换句话说,如果没有客户端订阅任何主题,客户端需要向MQTT代理服务器发送订阅消息,以便收到相关消息。订阅消息很简单,它只包含唯一的数据包标识符和订阅列表。
  • Packet Identifier(包标识符)

包标识符是客户端和代理之间的唯一标识符,用于标识消息流中的消息。这仅适用于QoS1和QoS2。设置这个MQTT内部标识符是客户端库或代理的事情。
  • List of Subscriptions(订阅列表)

订阅消息可以包含客户端的任意数量的订阅。每个订阅由一对主题和QoS级别组成。订阅消息中的主题还可以包含通配符,这使得可以订阅某些主题模式。如果一个客户端有重叠订阅,该主题的最高QoS级别将获胜,并由代理用于传递该消息。
  • Suback(订阅应答)

每个订阅将由代理通过以订阅应答消息的形式向客户端发送确认来确认信息 。此消息包含与原始订阅消息相同的数据包标识符(以便标识消息)和返回码列表。
  • Packet Identifier(包标识符)

分组标识符是用于标识消息的唯一标识符。它与订阅消息中相同。
  • Return Code(返回码)

代理为订阅消息中接收到的每个主题/ QoS进行返回一个返回码。因此,如果订阅消息有5个订阅,将有5个返回码,以确认代理服务器授权的具有QoS级别的每个主题。如果订阅被代理禁止(例如,如果客户端不允许订阅此主题,由于权限不足或该主题有问题),代理将向指定主题响应失败返回代码。
在客户端成功发送订阅消息并收到订阅应答消息后,它将收到与订阅主题相匹配的发布消息。
取消订阅
订阅消息相对应的是取消订阅消息,它删除代理上的客户端的现有订阅。取消订阅消息类似于订阅消息,并且还具有包标识符和主题列表。
  • Packet Identifier(包标识符)

分组标识符是用于标识消息的唯一标识符。它与订阅消息中相同。
  • List of Topic(主题列表)

主题列表包含任意数量的主题,客户端执行取消订阅。只需要将主题作为字符串发送(不带QoS),该主题将取消订阅,而不管最初订阅的QoS级别如何。
  • 取消订阅应答

代理将确认取消订阅消息的请求。该消息仅包含包标识符。
  • Packet Identifier(包标识符)

分组标识符是用于标识消息的唯一标识符。它与订阅消息中相同。
从代理接收到取消订阅消息后,就认为该取消订阅消息中的订阅消息已经被删除。

这就是我们的MQTT 要点系列的第三部分的结尾。我们希望你喜欢在下一篇文章中,我们将深入了解MQTT主题的使用。我们将解释通配符的基本知识以及使用情况以及更多实际的例子。
学习总结
  • 在这里先声明下,我做的不仅仅是翻译文章,而是在深入理解MQTT协议,希望能和大家共同探讨,挖掘其精华。
  • 本章中涉及到发布、订阅和去取消订阅中的很多参数信息,我建议先看完,有个大体了解,一定要实践,在写代码应用的时候深入体会,用到那个就去详细理解消化。


回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条



手机版|小黑屋|与非网

GMT+8, 2024-11-23 03:24 , Processed in 0.111328 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.