本文已参与「新人创作礼」活动,一起开启掘金创作之路。
一、什么是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... | 剩余包长度 |
+----------+-----------------------------------------------+
消息类型
| 类型名称 | 类型值 | 报文说明 |
|---|---|---|
| CONNECT | 1 | 发起连接 |
| CONNACK | 2 | 连接回执 |
| PUBLISH | 3 | 发布消息 |
| PUBACK | 4 | 发布回执 |
| PUBREC | 5 | QoS2消息回执 |
| PUBREL | 6 | QoS2消息释放 |
| PUBCOMP | 7 | QoS2消息完成 |
| SUBSCRIBE | 8 | 订阅主题 |
| SUBACK | 9 | 订阅回执 |
| UNSUBSCRIBE | 10 | 取消订阅 |
| UNSUBACK | 11 | 取消订阅回执 |
| PINGREQ | 12 | PING请求 |
| PINGRESP | 13 | PING响应 |
| DISCONNECT | 14 | 断开连接 |
四、QOS
MQTT中的QOS决定了消息的发送稳定性,他保证的不是端到端,而是端到服务,最终客户端收到的消息QOS,取决与发布消息时的QOS和订阅主题的QOS
QOS共有三个,分别时0、1、2
QOS 0
QOS 0 只保证消息发送一次,单不保证消息稳定到达
QOS 1
QOS 1 保证消息至少发送一次,但不保证只发送一次,如果在publish响应ACK的过程中超时或其他情况,则会触发重发
QOS 2
QOS 2 保证消息稳定发送,且保证只发送一次,因为QOS2在每一个环节都会等待REC并且再次等待REL释放消息,以此保证消息的稳定发送且超时之后的重发验证
MQTT会话
当连接MQTT服务时,会创建一个会话,可以使用clean sesison标志来标记会话类型
clean session为0时,即不清空会话,表示这是一个持久会话,即使断开连接,消息也会离线保存,待重连时会重新推送
clean session为1时,即清空会话,表示当前会话是一个临时会话
遗嘱消息
连接MQTT服务可以配置遗嘱消息,配置遗嘱消息的topic和payload,在连接断开时,服务会主动推送payload到指定的topic
消息保留
在发布消息时,如果retaind message为1,则可以将该消息缓存在mqtt服务中,待其他客户端订阅该消息主题时,可以接收到该缓存的消息。
以上是我对MQTT协议的简单理解,当然实际还有根据各个厂家的实现不同可能会有额外的扩充,例如EMQX就支持额外的主题通配符,但MQTT协议标准各厂家一致,小伙伴们在使用时按照标准的MQTT协议使用即可。
服务的安装可使用可以看我之前的两篇文章
Java中使用eclipse.paho实现mqtt消息的订阅和推送
有兴趣的小伙伴可以关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。