目錄
Introduction
第一章 - MQTT介绍
第二章 – MQTT控制报文格式
第三章 – MQTT控制报文
3.1 CONNECT – 连接服务端
3.2 CONNACK – 确认连接请求
3.3 PUBLISH – 发布消息
3.4 PUBACK –发布确认
3.5 PUBREC – 发布收到(QoS 2,第一步)
3.6 PUBREL – 发布释放(QoS 2,第二步)
3.7 PUBCOMP – 发布完成(QoS 2,第三步)
3.8 SUBSCRIBE - 订阅主题
3.9 SUBACK – 订阅确认
3.10 UNSUBSCRIBE –取消订阅
3.11 UNSUBACK – 取消订阅确认
3.12 PINGREQ – 心跳请求
3.13 PINGRESP – 心跳响应
3.14 DISCONNECT –断开连接
第四章 – 操作行为
第五章 – 安全
第六章 – 使用WebSocket
第七章 – 一致性目标
附录B - 强制性规范声明
1.1
1.2
1.3
1.4
1.4.1
1.4.2
1.4.3
1.4.4
1.4.5
1.4.6
1.4.7
1.4.8
1.4.9
1.4.10
1.4.11
1.4.12
1.4.13
1.4.14
1.5
1.6
1.7
1.8
1.9
1
Introduction
MQTT协议中文版
by mcxiaoke
最新版本: v1.0.4 2017.04.05 (感谢 @hentaicreep 修复多处表格错位问题 PRs)
文档地址
MQTT协议中文版
PDF和ePub下载
中文翻译项目
概述
MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开
放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于
受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。
说明
MQTT英文原版协议提供了Word格式和HTML格式,我翻译的时候用的Word文档,之前
一直提供的是Word文档转换的HTML和PDF供浏览和下载,最近花时间整理了Markdown
版本,可以更方便的分章节在线浏览了,转换为Markdown后部分表格的格式不太对,会
逐步用图片代替。
目录
发现任何翻译问题或格式问题欢迎提PR帮忙完善。
说明
前言
目录
第一章 - MQTT介绍
第二章 – MQTT控制报文格式
第三章 – MQTT控制报文
3.1 CONNECT – 连接服务端
2
Introduction
3.2 CONNACK – 确认连接请求
3.3 PUBLISH – 发布消息
3.4 PUBACK –发布确认
3.5 PUBREC – 发布收到(QoS 2,第一步)
3.6 PUBREL – 发布释放(QoS 2,第二步)
3.7 PUBCOMP – 发布完成(QoS 2,第三步)
3.8 SUBSCRIBE - 订阅主题
3.9 SUBACK – 订阅确认
3.10 UNSUBSCRIBE –取消订阅
3.11 UNSUBACK – 取消订阅确认
3.12 PINGREQ – 心跳请求
3.13 PINGRESP – 心跳响应
3.14 DISCONNECT –断开连接
第四章 – 操作行为
第五章 – 安全
第六章 – 使用WebSocket
第七章 – 一致性目标
附录B - 强制性规范声明
旧版文档
已过期,建议使用GitBook版本 最新版本: v1.0.1 2015.10.22
文档
连接
中文版 HTML
中文版 PDF
英文版 HTML
英文版 PDF
许可协议
MQTT 3.1.1 中文版
MQTT 3.1.1 中文版
MQTT Version 3.1.1
MQTT Version 3.1.1
署名-非商业性使用-相同方式共享 4.0 国际
联系方式
3
Introduction
Blog: http://blog.mcxiaoke.com
Github: https://github.com/mcxiaoke
Email: github@mcxiaoke.com
开源项目
Rx文档中文翻译: https://github.com/mcxiaoke/RxDocs
MQTT协议中文版: https://github.com/mcxiaoke/mqtt
Awesome-Kotlin: https://github.com/mcxiaoke/awesome-kotlin
Kotlin-Koi: https://github.com/mcxiaoke/kotlin-koi
Next公共组件库: https://github.com/mcxiaoke/Android-Next
PackerNg极速打包: https://github.com/mcxiaoke/packer-ng-plugin
Gradle渠道打包: https://github.com/mcxiaoke/gradle-packer-plugin
EventBus实现xBus: https://github.com/mcxiaoke/xBus
蘑菇饭App: https://github.com/mcxiaoke/minicat
饭否客户端: https://github.com/mcxiaoke/fanfouapp-opensource
Volley镜像: https://github.com/mcxiaoke/android-volley
4
第一章 - MQTT介绍
第一章 概述 Introduction
1.1 MQTT协议的组织结构 Organization of MQTT
本规范分为七个章节:
第一章 – 介绍
第二章 – MQTT控制报文格式
第三章 – MQTT控制报文
第四章 – 操作行为
第五章 – 安全
第六章 – 使用WebSocket
第七章 – 一致性目标
附录B – 强制性规范声明
1.2 术语 Terminology
本规范中用到的关键字 必须 MUST,不能 MUST NOT,要求 REQUIRED,将会 SHALL,不
会 SHALL NOT,应该 SHOULD,不应该 SHOULD NOT,推荐 RECOMMENDED,可以
MAY,可选 OPTIONAL 都是按照 IETF RFC 2119 [RFC2119] 中的描述解释。
网络连接 Network Connection
MQTT使用的底层传输协议基础设施。
客户端使用它连接服务端。
它提供有序的、可靠的、双向字节流传输。
例子见4.2节。
应用消息 Application Message MQTT协议通过网络传输应用数据。应用消息通过MQTT传
输时,它们有关联的服务质量(QoS)和主题(Topic)。
客户端 Client
使用MQTT的程序或设备。客户端总是通过网络连接到服务端。它可以
发布应用消息给其它相关的客户端。
订阅以请求接受相关的应用消息。
取消订阅以移除接受应用消息的请求。
从服务端断开连接。
5
第一章 - MQTT介绍
服务端 Server
一个程序或设备,作为发送消息的客户端和请求订阅的客户端之间的中介。服务端
接受来自客户端的网络连接。
接受客户端发布的应用消息。
处理客户端的订阅和取消订阅请求。
转发应用消息给符合条件的已订阅客户端。
订阅 Subscription
订阅包含一个主题过滤器(Topic Filter)和一个最大的服务质量(QoS)等级。订阅与单个会
话(Session)关联。会话可以包含多于一个的订阅。会话的每个订阅都有一个不同的主题过
滤器。
主题名 Topic Name
附加在应用消息上的一个标签,服务端已知且与订阅匹配。服务端发送应用消息的一个副本
给每一个匹配的客户端订阅。
主题过滤器 Topic Filter
订阅中包含的一个表达式,用于表示相关的一个或多个主题。主题过滤器可以使用通配符。
会话 Session
客户端和服务端之间的状态交互。一些会话持续时长与网络连接一样,另一些可以在客户端
和服务端的多个连续网络连接间扩展。
控制报文 MQTT Control Packet
通过网络连接发送的信息数据包。MQTT规范定义了十四种不同类型的控制报文,其中一个
(PUBLISH报文)用于传输应用消息。
1.5 数据表示 Data representations
1.5.1 二进制位 Bits
字节中的位从0到7。第7位是最高有效位,第0位是最低有效位。
1.5.2 整数数值 Integer data values
整数数值是16位,使用大端序(big-endian,高位字节在低位字节前面)。这意味着一个16位
的字在网络上表示为最高有效字节(MSB),后面跟着最低有效字节(LSB)。
1.5.3 UTF-8编码字符串 UTF-8 encoded strings
后面会描述的控制报文中的文本字段编码为UTF-8格式的字符串。UTF-8 [RFC3629] 是一个
高效的Unicode字符编码格式,为了支持基于文本的通信,它对ASCII字符的编码做了优化。
6
第一章 - MQTT介绍
每一个字符串都有一个两字节的长度字段作为前缀,它给出这个字符串UTF-8编码的字节数,
它们在图例 1.1 UTF-8编码字符串的结构 中描述。因此可以传送的UTF-8编码的字符串大小有
一个限制,不能超过 65535字节。
除非另有说明,所有的UTF-8编码字符串的长度都必须在0到65535字节这个范围内。
图例 1.1 UTF-8编码字符串的结构 Structure of UTF-8 encoded strings
二进制位
byte 1
byte 2
byte 3 ….
7-0
字符串长度的最高有效字节(MSB)
字符串长度的最低有效字节(LSB)
如果长度大于0,这里是UTF-8编码的字符数据。
UTF-8编码字符串中的字符数据必须是按照Unicode规范 [Unicode] 定义的和在RFC3629
[RFC3629] 中重申的有效的UTF-8格式。特别需要指出的是,这些数据不能包含字符码在
U+D800和U+DFFF之间的数据。如果服务端或客户端收到了一个包含无效UTF-8字符的控制
报文,它必须关闭网络连接 [MQTT-1.5.3-1]。
UTF-8编码的字符串不能包含空字符U+0000。如果客户端或服务端收到了一个包含U+0000的
控制报文,它必须关闭网络连接 [MQTT-1.5.3-2]。
数据中不应该包含下面这些Unicode代码点的编码。如果一个接收者(服务端或客户端)收到
了包含下列任意字符的控制报文,它可以关闭网络连接:
U+0001和U+001F之间的控制字符
U+007F和U+009F之间的控制字符
Unicode规范定义的非字符代码点(例如U+0FFFF)
Unicode规范定义的保留字符(例如U+0FFFF)
UTF-8编码序列0XEF 0xBB 0xBF总是被解释为U+FEFF(零宽度非换行空白字符),无论它
出现在字符串的什么位置,报文接收者都不能跳过或者剥离它 [MQTT-1.5.3-3]。
非规范示例 Non normative example
例如,字符串 A 是一个拉丁字母A后面跟着一个代码点U+2A6D4(它表示一个中日韩统
一表意文字扩展B中的字符),这个字符串编码如下:
图例 1.2 UTF-8编码字符串非规范示例 UTF-8 encoded string non normative example
7
第一章 - MQTT介绍
Bit
byte 1
byte 2
byte 3
byte 4
byte 5
byte 6
byte 7
7
6
5
4
3
2
1
0
字符串长度 MSB (0x00)
0
字符串长度 LSB (0x05)
0
‘A’ (0x41)
0
(0xF0)
1
(0xAA)
1
(0x9B)
1
(0x94)
1
0
0
1
1
0
0
0
0
0
0
1
1
0
0
0
0
0
1
0
1
1
0
0
0
0
1
1
0
0
1
0
0
0
0
1
0
0
0
0
1
1
0
0
1
1
0
0
1
0
1.6 编辑约定 Editing conventions
本规范用黄色高亮的文本标识一致性声明,每个一致性声明都分配了一个这种格式的引用:
[MQTT-x.x.x-y]。
项目主页
MQTT协议中文版
8