原文地址: http://public.dhe.ibm.com/software/dw/webservices/ws-mqtt/mqtt-v3r1.html
概念
MQTT 是一个轻量级的基于代理的发布/订阅消息协议, 它被设计成开放,小巧,轻量级并容易实现. 这些特性让它更适用于一些受限环境,例如(并不局限与这些环境):
- 网络昂贵环境,低宽带或者不可靠环境
- 运行在嵌入式设备中受限于处理器和内存资源的情况
协议特性
- 发布订阅消息模式提供了一对多消息分发,并将应用程序解耦
- 消息传输内容负荷不可知性
- 消息传递提供三种服务质量
- ”最多一次”, 这样的消息发送依赖于TCP/IP最大程度的投递, 消息丢失和重复总会发生的。 这种模式可以适用于,例如:环境传感器,它不在乎单个数据读取丢失,至少他可以很快的在下次发布读取到新的一个.
- “至少一次”, 消息保证送达,但会发生重复
- “恰好一次”, 消息确保送达一次. 这种模式适用于财务系统,重复或者消息的丢失都将导致错误的费用发生.
- 小的传输头部(固定长度的头部就仅占2个字节)和协议交互最小化减少了网络流量
- 使用Last will 和Testament特性,可以将感兴趣的部分内容通知给异常断开的客户端
内容目录
1. 介绍
这篇概要说明分为三个主要章结
- 所有包类型通用消息格式
- 每种包类型的详细内容
- 如何在客户端和服务进行消息报通信
1.1 变更
下面介绍MQTT V3和MQTTV3.1的变化
- 新版本中,用户名和密码可以被发送在一个”CONNECT” 包中
- 针对安全问题增加了新的返回编码在”CONNACK”包中
- 阐明客户端不会被通知无认证的PUSHLISH和SUBSCRIBE命令 和 正常MQTT流应该完成尽管这些命令尚未执行
- 增加字符串UTF-8的支持,而不是只局限于US-ASCII子集
协议版本号通过”CONNECT”包传输, 在这个版本没有改变并且 remain区还是”3” . 现有MQTT V3服务器实现应该能够接受来自客户机的连接,支持这一修改,只要正确地尊重“Remaining Length”字段, 因此就会忽略额外的安全信息。
2. 协议格式
每一个MQTT命令消息都包含一个固定的消息头部. 有些消息也具有一个变长的头部和一个payload负载. 消息头部每个部分先描述如下章节:
2.1 固定长度头部
每一个MQTT命令消息都包含一个固定的消息头部. 下面表格展示固定消息头部格式.
Byte 1
包含 MessageType, DUP flag, Qos level, RETAIN四个区域
Byte 2
(至少一个字节)包含”Remaining Length”字段. 字段描述将放到下面章节.有数据值都是高位优先顺序.
Message Type
* 位置: * byte1, bits 7-4
一个4bit的无符号值. 协议版本枚举如下.
标记符 | 枚举值 | 描述 |
---|---|---|
Reserved | 0 | 预留 |
CONNECT | 1 | 客户端请求连接server |
CONNACK | 2 | 连接确认 |
PUBLISH | 3 | 发布消息 |
PUBACK | 4 | 发布确认 |
PUBREC | 5 | 发布接受 |
PUBREL | 6 | Publish 发布 |
PUBCOMP | 7 | Publish完成 |
SUBSCRIBE | 8 | 客户端订阅请求 |
SUBACK | 9 | 订阅确认 |
UNSUBSCRIBE | 10 | 取消订阅 |
UNSUBACK | 11 | 取消订阅响应 |
PINGREQ | 12 | ping请求 |
PINGRESP | 13 | ping响应 |
DISCONNECT | 14 | 客户端断开连接 |
Reserved | 15 | 预留 |
Flags
byte 1区还有DUP, Qos, RETAIN. 使用bit的位置来介绍flags,如下表格
Bit position Name Description
—|—|—
3 | UDP | 重复投递
2-1|Qos | 服务质量
0 |RETAIN| 预留标示
DUP
Position : byte 1, bit 3
当client或者服务器试图再次发送一个“PUBLISH” ,“PUBREL” “SUBSCRIBE”,“UNSUBSCRIBE”的消息时候DUP就会设值. 这适用于Qos值大于0的消息,并且确认是需要的情况. 当DUP被设置后,可变头部就包含一个Message ID.
消息接受者应该把这个标志作为一个提示,用于判断是否可能是先前收到的消息。而不应该依赖检测重复
Qos
* Position:* byte 1, bits 2-1
这个标志代表 投递一个“PUBLISH”消息的一个级别.
QoS value | bit 2 | bit 1 | Description |
---|---|---|---|
0 | 0 | 0 | 最多一次 ; 投递一次就放弃 ; <=1 |
1 | 0 | 1 | 至少一次; 需要确认投递 >=1 |
2 | 1 | 0 | 恰好一次; 确认投递 ;=1 |
3 | 1 | 1 | 预留 |
RETAIN
Position: byte 1, bit 0
//TODO