MQTT(Message Queue Telemetry Transport),遥测传输协议,低开销,低带宽占用。属于物联网的一个标准传输协议,属于应用层协议
适用于受限环境(带宽低、网络延迟高、网络通信不稳定),为工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议。能在处理器和内存资源有限的嵌入式设备中运行。
“至多一次”(QoS==0):只发送一次消息。消息的发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。【适用于丢失一次读记录无所谓,不久之后会有第二次发送,如普通APP的推送,就算在消息推送当时未联网,但是再次联网后就可以收到消息了】
“至少一次”(QoS==1):最少发送一次消息,确保消息到达,但是消息重复可能会发生。
“只有一次”(QoS==2):确保消息只到达一次,常用于计费系统中,确保用户收到且只会收到一次消息。
实现MQTT协议需要客户端和服务器端通讯完成。
通讯过程中,MQTT协议中有三种身份:
消息的发布和订阅都是客户端,消息的代理是服务器,客户端在作为发布者发布消息的同时也可以作为订阅者订阅消息。(与微博微信公众号的发文章和关注类似)
MQTT传输的消息分为两部分:
MQTT报文结构由三部分组成:
其中,固定报头是所有报文类型都包含的,可变报头和有效载荷是部分报文才有
共占2字节,三部分(类型,标志位,剩余长度)
Byte1 | 控制报文的类型(bits 7-4) | 用于指定控制报文类型的标志位(bits 3-0) |
Byte2 | 剩余长度 |
mqtt的控制报文的类型共16种,其中0和15为Reserved,作为保留:
除了下面四种,其他报文的标志位都标记为“保留”,是保留给以后使用的。
PUBLISH报文包含标志位:bit3-0分别为DUP(重复分发标志),QoS(服务质量等级,占2bit,0-2),RETAIN(保留标志)
PUBREL, SUBSCRIBE, UNSUBSCRIBE三种报文的 bit 1 位为 1。
(没看明白)
可变报头根据报文类型的不同而不同,常用来作为包的标识。心跳请求、心跳响应和断开连接三种报文没有可变报头。
不同报文中可变报头的内容也不相同:
各个存在可变报头的协议其详细不同如下:
CONNECT:
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
User Name Flag | Password Flag | Will Retain | Will QoS | Will Flag | Clean Session | Reserved | ||
byte 8 | X | X | X | X | X | X | 0 |
CONNACK:
连接确认标志(Connect Acknowledge Flags):第1个字节是 连接确认标志,位7-1是保留位且必须设置为0。 第0 (SP)位 是当前会话(Session Present)标志。
当前会话(Session Present):连接确认标志的第0位。与清理会话相关联(不是很明白对应的机制)
连接返回码(Connect Return code):可变报头的第2个字节。确认连接成功或者连接失败的相应原因,用返回值表示不同的情况
PUBLISH:
报文标识符占2字节。感觉像是客户端服务端在通信时证明该报文是当前会话的报文。
Bit | 7-0 |
byte 1 | 报文标识符MSB |
byte 2 | 报文标识符LSB |
包含报文标识符字段的控制报文有下面几个,都是发布、订阅、取消订阅及其消息确认的报文
PUBLISH(QoS > 0时), PUBACK,PUBREC,PUBREL,PUBCOMP
SUBSCRIBE, SUBACK,UNSUBSCRIBE,UNSUBACK。
有效载荷也是部分报文才拥有的,会根据报文类型的不同,及其可变报头中的标志而决定的,其中包含有效载荷的控制报文有以下几个:
CONNECT:如果可变报头中的标志包含这些字段,其顺序必须为:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码
PUBLISH:(可选)包含将被发布的应用消息,数据的内容和格式是应用特定的。有效载荷为0时也是合法的
SUBSCRIBE:包含一个主题过滤器列表(必须是utf-8)和QoS等级,表示客户端想要订阅的主题及其QoS等级;
SUBACK:包含一个返回码清单。每个返回码对应等待确认的SUBSCRIBE报文中的一个主题过滤器。返回码的顺序必须和SUBSCRIBE报文中主题过滤器的顺序相同。对要订阅的内容进行确认
UNSUBSCRIBE:包含客户端想要取消订阅的主题过滤器列表(主题过滤器必须是连续打包的、按照UTF-8编码字符串)
https://blog.csdn.net/qq_28877125/article/details/78325003
https://mcxiaoke.gitbooks.io/mqtt-cn/content/
https://www.cnblogs.com/sxkgeek/p/9140180.html
http://www.360doc.com/content/18/0116/05/163747_722273693.shtml