对于MQTT的一张基本理解图:

基本流程图:

MQTT是一种链接协议,它指定了如何组织数据字节并通过TCP/IP网络传输它们。但实际上,开发人员并不需要链接这个链接协议的具体细节。我们只需要知道,每条消息都有一个命令和数据有效负载。该命令定义消息类型(比如CONNECT消息或者SUB SCRIBE消息)。所有的MQTT库和工具都提供了直接处理这些消息的基本方法,并且能自动填充一些必要的字段(在数据包的对应字节填充),比如消息和客户端ID。
首先客户端发送一条CONNECT消息来链接代理。CONNECT消息要求建立从客户端到代理服务器的链接。
CONNECT命令的基本参数
- cleanSession:此标志指定是否是持久链接。持久会话会将所有的订阅和可能丢失的消息(具体取决于QoS)都存储在代理(服务器)中。
- username:链接代理服务器的用户名。(对,代理服务器不是谁想连,想连就能连)
- password:链接代理服务器的密码。(对,代理服务器不是谁想连,想连就能连)
- lasWillTopic:链接意外中断,代理服务器会像某个主题发送一条last will消息。
- lastWillQos:last will消息的QoS。
- lastWillMessage:last will消息本身。
- KeepAlive:这是客户端通过ping服务器来保持链接有效所需的时间间隔。
当客户端向代理服务器发送一条CONNECT命令之后,服务器会调用CONNACK命令,告知服务链接的状态。
CONNACK命令的基本参数
- sessionPresent:此参数表明链接是否已有一个持久会话。也就是说,连接了订阅的主题,而且会接受丢失的消息。
- returnCode:0表示成功。otherwise失败。
当客户端和服务器建立连接之后,客户端就可以向服务器订阅某些主题的。(发送一条或多条SUBSCRIBE消息)。
表明当服务器接受到其他终端推送的此主题数据时,服务器会默认发送给它。
SUBSCRIBE参数列表
- QoS:服务质量(quality of services)。一般有3个枚举值。
- 0:表示不可靠服务,消息仅推送一次,如果当前客户端在线,或者因为网络原因,没有收到就没有收到。
- 1:消息至少传递1次。一次不成功,传递第二次,第N次。可能会出现重复数据的情况。
- 2:消息恰好传递1次。双方通过4次握手,保证消息能准确的从服务器传递给客户端,而且只传一次。
QoS参数虽然在客户端指定,但规定的是服务器传递数据的模式。所以,QOS是用来约束服务器,而不是客户端本身。
一个主题可以有多个级别,级别之间用斜杠字符分隔。例如,”dw/demo”和”/ibm/bluemix/qmqt”都是有效主题。
当客户端成功的向服务器订阅某个主题之后,服务器会返回一条SUBACK的消息,其中包含一个或者多个returnCode参数。
SUBACK消息参数
- returnCode:值0-2,表示成功订阅,并返回这个订阅消息的QOS。值128:订阅失败。
既然客户端可以向服务器订阅某个主题,当然也可以取消订阅。
与SUBSCRIBE订阅命令相反的命令是UNSUBSCRIBE取消订阅命令。
此命令非常简单。只有一个topic(主题)参数。
上面讲的是订阅,订阅是需要有消息从服务器发送过来的。但是服务器本身基本不产生数据,那数据从何而来呢?
通过另外一个客户端执行PUBLISH命令,往代理服务器发送数据。并最终通过代理服务器将数据传递给订阅了此服务的客户端。
PUBLISH消息参数
- topicName:发布消息的相关主题。
- qos:消息传递的质量水平。(约束服务器)
- retainFlag:此标志表明服务器是否保留该消息作为针对此主题的最后一条已知消息。
- payload:消息中的实际数据。它可以是文本字符串或者二进制大对象数据(图片)
总结
- MQTT是一个轻量级,用于计算能力弱,网络环境差的终端设备之间的数据传输。
- MQQ是基于一个发布/订阅的基本模式。
- 每个终端都可以从服务器订阅某些主题,也可以往代理服务器发布某些主题。
- 当服务器接受到了某些终端发送过来的数据之后,会向订阅了这个服务的终端推送这些数据。