【参考文章】:基于Mqtt的IM开发
【参考文章】:阿里___MQTT中协议QoS的实现
【参考文章】:MQTT入门篇
1. 简介
MQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,因此易于实现。这些特点使得它对很多场景来说都是很好的选择,包括受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT),这些场景要求很小的代码封装或者网络带宽非常昂贵。
因为MQTT是协议,想要使用它就必须找实现这个协议的库文件或者服务组件,这是实现MQTT协议的服务组件。
搭建完成MQTT的服务端环境,再通过封装的MQTT客户端API,就可以使用了。
2. 特点
- 轻量级的 machine-to-machine 通信协议。
- publish/subscribe模式。
- 基于TCP/IP。
- 支持QoS。
3. 应用场景
- 适合于低带宽、不可靠连接、嵌入式设备、CPU内存资源紧张。
- 是一种比较不错的Android消息推送方案。
- FacebookMessenger采用了MQTT。
- MQTT有可能成为物联网的重要协议
4. 主题
MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用即可。
主题还可以通过通配符进行过滤。
/:用来表示层次,比如a/b,a/b/c。
#:表示匹配>=0个层次,比如a/#就匹配a/,a/b,a/b/c。单独的一个#表示匹配所有。不允许 a#和a/#/c。
+:表示匹配一个层次,例如a/+匹配a/b,a/c,不匹配a/b/c。单独的一个+是允许的,a+不允许,a/+/b不允许
5. 服务质量(Quality of Service,QoS)
5.1 QoS=0
最多一次,质量级别最低,不需要应答确认。
尽操作环境所能提供的最大努力分发消息,但是遇到意外并不会重试。消息可能会丢失。
例如,这个等级可用于环境传感器数据,单次的数据丢失没关系,因为不久之后会再次发送。
5.2 QoS=1
至少一次,有可能重复。
消息接收者如果没有知会或者知会本身丢失,消息发送者会再次发送以保证消息接收者至少会收到一次,当然可能造成重复消息。
收到控制报文后需要应答确认,比如创建连接、发消息、收消息、心跳。
5.3 QoS=2
只有一次,确保消息只到达一次(用于比较严格的计费系统)。
收到控制报文后需要应答确认,最高的服务质量,需要额外的开销,因为这种质量下,收到控制报文需要双向确认应答。
6. 消息类型
MQTT拥有14种不同的消息类型:
- CONNECT:客户端连接到MQTT代理
- CONNACK:连接确认
- PUBLISH:新发布消息
- PUBACK:新发布消息确认,是QoS 1给PUBLISH消息的回复
- PUBREC:QoS 2消息流的第一部分,表示消息发布已记录
- PUBREL:QoS 2消息流的第二部分,表示消息发布已释放
- PUBCOMP:QoS 2消息流的第三部分,表示消息发布完成
- SUBSCRIBE:客户端订阅某个主题
- SUBACK:对于SUBSCRIBE消息的确认
- UNSUBSCRIBE:客户端终止订阅的消息
- UNSUBACK:对于UNSUBSCRIBE消息的确认
- PINGREQ:心跳
- PINGRESP:确认心跳
- DISCONNECT:客户端终止连接前优雅地通知MQTT代理