【四】浅析MQTT协议

200 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。


一、什么是MQTT

以下是摘自MQTT网站对其的介绍:

MQTT is an OASIS standard messaging protocol for the Internet of Things (IoT). It is designed as an extremely lightweight publish/subscribe messaging transport that is ideal for connecting remote devices with a small code footprint and minimal network bandwidth. MQTT today is used in a wide variety of industries, such as automotive, manufacturing, telecommunications, oil and gas, etc.

MQTT是用于物联网(IoT)的OASIS标准消息传递协议。它被设计为一种极其轻量级的发布/订阅消息传输,非常适合连接代码占用小、网络带宽最小的远程设备。

简单来说,就是MQTT占用带宽流量非常小,非常符合物联网设备的网络通信条件,所以MQTT一直被誉为IOT的通信神器。

更多的MQTT信息可以访问MQTT主页:MQTT-The Standard Iot for Messaging

二、MQTT特点

1、与JAVA的业务MQ一样,MQTT同样使用了订阅/发布模式,可以有效解耦;

2、对负载内容屏蔽的消息传输;

3、使用TCP可靠连接;

4、有三种消息QOS提供选择:

5、小型传输,开销很小(固定长度的头部是 2 字节);

6、使用了遗言(Last will)等通信中断机制。

三、MQTT报文

MQTT协议采用了如下报文格式:

固定报文头(fixed header) + 可变报文头(variable header) + 载荷(payload)

固定报文头: 主要标记消息类型 可变报文头: 根据消息类型决定可变报文头内容 载荷:消息具体内容

固定报文头

+----------+-----+-----+-----+-----+-----+-----+-----+-----+
| Bit      |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
+----------+-----+-----+-----+-----+-----+-----+-----+-----+
| byte1    |        消息类型        |       消息Flags       |
+----------+-----------------------+-----------------------+
| byte2... |              剩余包长度                        |
+----------+-----------------------------------------------+

消息类型

类型名称类型值报文说明
CONNECT1发起连接
CONNACK2连接回执
PUBLISH3发布消息
PUBACK4发布回执
PUBREC5QoS2消息回执
PUBREL6QoS2消息释放
PUBCOMP7QoS2消息完成
SUBSCRIBE8订阅主题
SUBACK9订阅回执
UNSUBSCRIBE10取消订阅
UNSUBACK11取消订阅回执
PINGREQ12PING请求
PINGRESP13PING响应
DISCONNECT14断开连接

四、QOS

MQTT中的QOS决定了消息的发送稳定性,他保证的不是端到端,而是端到服务,最终客户端收到的消息QOS,取决与发布消息时的QOS和订阅主题的QOS

QOS共有三个,分别时0、1、2

QOS 0

QOS 0 只保证消息发送一次,单不保证消息稳定到达

image.png

QOS 1

QOS 1 保证消息至少发送一次,但不保证只发送一次,如果在publish响应ACK的过程中超时或其他情况,则会触发重发

image.png

QOS 2

QOS 2 保证消息稳定发送,且保证只发送一次,因为QOS2在每一个环节都会等待REC并且再次等待REL释放消息,以此保证消息的稳定发送且超时之后的重发验证

image.png

MQTT会话

当连接MQTT服务时,会创建一个会话,可以使用clean sesison标志来标记会话类型

clean session为0时,即不清空会话,表示这是一个持久会话,即使断开连接,消息也会离线保存,待重连时会重新推送

clean session为1时,即清空会话,表示当前会话是一个临时会话

遗嘱消息

连接MQTT服务可以配置遗嘱消息,配置遗嘱消息的topic和payload,在连接断开时,服务会主动推送payload到指定的topic

消息保留

在发布消息时,如果retaind message为1,则可以将该消息缓存在mqtt服务中,待其他客户端订阅该消息主题时,可以接收到该缓存的消息。


以上是我对MQTT协议的简单理解,当然实际还有根据各个厂家的实现不同可能会有额外的扩充,例如EMQX就支持额外的主题通配符,但MQTT协议标准各厂家一致,小伙伴们在使用时按照标准的MQTT协议使用即可。

服务的安装可使用可以看我之前的两篇文章

MQTT的服务搭建

Java中使用eclipse.paho实现mqtt消息的订阅和推送


有兴趣的小伙伴可以关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。