原文:MQTT – The Nerve System of IoT
翻译:安翔
审校:苏宓
当今世界有数十亿的智能设备,畅想一下,假如这些设备都相互连接并且能够像它的用户一样互相交流,同时形成一个全球化的网络,会是怎样的情形呢?这其实就是通常所说的物联网,或者叫 IoT。物联网已经彻底改变了 IT 世界以及我们的创新方式。在探索物联网的时候必须考虑它的性能和安全问题。
消息队列遥测传输协议(MQTT)
MQTT是TCP / IP协议之上的基于发布/订阅模式的机器到机器(M2M)通信的轻量级消息协议。该协议提供遥测技术,MQTT 开发人员正在努力连接不断壮大的互联网世界,预计将会产生更多样化的智能设备。 MQTT 协议的第一个版本由 IBM 的 Stanford-Clark 和 Arlen Nipper 撰写。
选择 MQTT 的理由
MQTT 已经用于 Facebook的 消息应用,它可以在不消耗太多电量的情况下和服务器保持长连接;它仅仅需要很低的网络带宽,同时代码的占用的空间也很小;它通过广泛分布和有时间间歇的网络传输数据。这些特点使得 MQTT 应用在小内存、弱处理能力的远程设备上具有很大的优势。
此外,MQTT 还有如下一些非常显著的特点:
- 开源、免费、易用
- 遵循一对多、发布/订阅模式
- 精简的消息头
- 提供多个不同质量、等级的服务
- 简单的消息指令
- 不强求传输数据的类型与格式,保持灵活性
- 消息可保留
- 干净的会话和持久的连接
- 遗愿标志
MQTT 和 HTTP 的对比:
. | MQTT | HTTP |
---|---|---|
设计 | 以数据为中心 | 以文档为中心 |
模式 | 发布/订阅 | 请求/响应 |
复杂度 | 简单的命令 | 复杂 |
消息大小 | 很小,2字节的紧凑二进制消息头 | 比较大,消息头是文本格式 |
服务等级 | 具有3个 QoS 级别 | 只有一个消息服务等级 |
消息发布方式 | 一对多 | 一对一 |
MQTT 拓扑结构的一个例子:

MQTT 消息类型
为了更好地理解消息级别,我们先了解一下 MQTT 的消息类型。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代理 |
服务质量等级
QoS 值决定了每个消息将如何传递,每个发送的消息都需要强制性设置 QoS 值。
级别0(最多一个消息传递)
当消息的 QoS 值设置为 0 时,不需要响应,并且不会定义重传机制。消息要么一次性成功到达 broker(MQTT 代理),要么就无法到达。如果客户端断开连接或服务器发生故障,则QoS 0消息将会丢失,MQTT 层不会尝试消息重传。从性能的角度来看,这是使用 MQTT 发送消息的最快方法。级别0中只使用 MQTT 命令 PUBLISH,其他命令均不会被使用。

级别1(至少一个消息传递)
MQTT 客户端或服务器将尝试至少传递一次消息,但可能存在重复的消息。当代理收到消息时,将发送确认指令 PUBACK。在没有收到 PUBACK 的情况下,发送方会再次使用 DUP(重复)发送消息。在接收到设置了 DUP 位的消息时,代理将向所有订阅者重新发布消息,并再次发送确认指令 PUBACK 给发送方。级别1的通信机制通过 MQTT 消息持久化来实现。发生 PUBLISH 时,消息将存储在持久化层(比如磁盘)中,并在接收到 PUBACK 时将其删除。QoS 1 的消息在消息头中具有消息 ID 。
级别2(正好一个消息传递)
在 QoS 1 的基础上通过额外的控制流确保消息正好传递一次,不会重复。消息在PUBLISH 流中发送,由客户端存储在持久层中。作为对 PUBLISH 的响应会发送 PUBREC 消息。同时,消息被锁定在服务器上。在接收到 PUBREC 时,将 PUBREL 发送到服务器。接收到 PUBREL 时,代理发送消息,返回 PUBCOMP 并丢弃存储状态。QoS 2 的消息在消息头中具有消息 ID。
MQTT 的安全性
MQTT 旨在为为物联网提供轻量级的通信,但是安全性是以增加处理器使用率和通信开销为代价的。这是为什么在协议中只有少数几个安全机制的原因。但是许多 MQTT的实现都使用了SSL / TLS等安全标准。
MQTT 中的安全性分为多个层级:
网络层:使用物理安全网络或 VPN 为通信提供安全连接。
传输层:使用 TLS / SSL 进行传输加密,确保通信加密、身份验证。
应用层:该协议具有客户端ID,用户名/密码凭证提供设备认证。另一种方式是在没有广泛传输加密的情况下进行有效负载加密。
MQTT 实践 - 家庭监控
家庭监控系统是基于 MQTT 的应用程序的典型示例。例如,室内加热器的当前温度可根据要求发送到设备。
像任何其他应用程序一样,当涉及到两个应用程序或者设备之间的通信时,就会有通信失败的可能,监视应用程序以确保应用程序的有效运行和良好的用户体验显得非常重要。
Catchpoint 目前可以使用 MQTT 协议监视 IoT 设备的性能和可用性。MQTT 测试可用于通过发布和订阅指定主题的消息的方式来使用MQTT的发布/订阅模式,并且可以测量通信时间。