一、认识MQTT
1.MQTT(消息队列遥测传输) 是ISO 标准(ISO/IEC PRF 20922)下基于 发布/订阅 范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。
简而言之,MQTT其实就是一个用于TCP通信的消息协议而已。既然消息协议,“消息” 自然是表示MQTT其实本质就是消息,消息在某种理解上,可以理解报文,报文包,数据等等;既然是协议,自然表示它有着自己的规则,什么叫规则?就是规定这个消息该以怎样的固定格式(详见二 协议内容)去传输。
2.MQTT既然发布,自然是会有它实际应用的,MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议
3.MQTT协议主要特性:
①使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
②对负载内容屏蔽的消息传输;
③使用 TCP/IP 提供网络连接;
④有三种消息发布服务质量:小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
⑤使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制
这些特性都是什么意思呢?不用管,先接着往下看,最后再来看它的特性…
二、MQTT协议通信过程概述
首先,MQTT是利用TCP通信协议的,那么它必然是 有序、可靠、面向连接、双向传输的
其次,MQTT是通过交换预定义的MQTT控制报文来通信(控制报文详见三 协议控制报文)
协议流程如下:
对MQTT协议进行概述:
第一步:
1.网络建立连接后,如果服务器在合理的时间内没有收到CONNECT报文,那么服务端必须断开原有的客户端连接
2.在收到CONNECT报文后,服务端进行验证,如果CONNECT报文不符合规范,则服务端不会发送CONNACK报文,且直接关闭网络连接
3.服务端验证CONNECT报文规范,其中就有验证身份和授权的用户名和密码 ,如果有一项不符合规范,则直接关闭网络连接
4.服务端如果验证成功,则会创建会话(会话可以看做通信内容,详见三 清理会话标志)
5.会话创建成功,服务端发送CONNACK报文作为CONNECT报文的确认响应
6.开始消息的分发和保持连接状态的监测
第二步:发布和订阅
如果是发布
1.客服端使用 PUBLISH报文 发送应用消息给服务端,目的是分发给其他订阅了相同主题的客户端,也就是服务端其实是个中转的地方
2.服务端使用 PUBLISH报文 发送应用消息给每一个订阅匹配的客户端(*这里与其说使用,说转发会更好,服务端存储客户端A发布的应用消息,如果客户端B订阅该主题,那么服务端就会发送PUBLISH报文给客户端B)
3.收到一个PUBLISH报文时,接受者(可能是客户端,也可能是服务端)的动作取决于Qos等级,根据等级发送不同的回应报文(详见三 PUBLISH报文)
如果是订阅
1.服务端收到客户端发送的一个SUBSCRIBE报文时,会发送SUBACK报文响应
2.允许服务端在发送SUBACK之前就开始发送与订阅匹配的PUBLISH报文,如果服务端收到的SUBSCRIBE报文的主题过滤器与一个现存的主题过滤器相同,那么服务器就会使用新的订阅去替换现存的订阅
3.如果服务端接收到的主题过滤器不同于任何现存订阅的过滤器,服务端就会创建一个新的订阅并发送所有匹配的保留消息
4.服务端发送给客户端的SUBACK报文对每一对主题过滤器和Qos等级都必须包含一个返回码,这个返回码必须表示那个订阅被授权的最大Qos等级或者订阅失败
三、MQTT协议控制报文
在介绍MQTT控制报文前,了解两个东西,一是控制报文的结构,一是控制报文有哪些类型
MQTT控制报文结构 = 固定报头 + 可变报头 + 有效载荷
注意,所有的控制报文都有固定报头,但不一定有可变报头和有效载荷
接下来就详细介绍各个控制报文的结构:
之前提到过,
控制报文 = 固定报头 + 可变报头 + 有效载荷
固定报头共2个字节,一个字节占8位。第一个字节前4位是用于指定控制报文类型的标志位,后4位是控制报文类型;第二个字节是剩余长度。
剩余长度表示当前报文剩余部分的字节数,包括可变报头和有效负载。