一文读懂物联网的灵魂MQTT

名词释义:

MQTT——Message Queuing Telemetry Transport消息队列遥测传输

SUB——Subscribe订阅

PUB——Publish发布

QoS——Quality of Service服务质量

LWT——Last Will & Testament最后遗嘱

MQTT简介

MQTT是一种 基于TCP/IP的机器之间通讯 machine-to-machine (M2M)、物联网 Internet of Things (IoT)常用的一种轻量级消息传输协议。适用于网络带宽较低的场合。包含发布、订阅模式,通过一个代理服务器(broker),任何一个客户端(client)都可以订阅或者发布某个主题的消息,然后订阅了该主题的客户端则会收到该消息。

MQTT系统由与服务器(通常称为“代理”)通信的客户端组成。客户端可以是信息的发布者,也可以是订阅者。每个客户端都可以连接到代理服务器。

消息Topic按主题层次组织。发布者有新的数据项要发布时,它会将包含数据的控制消息发送到连接的代理服务器。然后代理服务器将信息分发给订阅该主题的任何客户端。发布服务器不需要对订阅服务器的数量或位置进行任何数据配置,订阅服务器也不必配置任何有关发布服务器的数据。

3.1 发布/订阅

发布/订阅,通常也被成为 pub-sub 模式是 MQTT 的核心,除了基于同一个消息代理的发布者和订阅者之外,还有一些其它节点围绕着该消息代理呈星型拓扑分布。

客户端可以发布或订阅特定的主题(topic,有些类似信息主题),根据使用它们的消息代理来决定谁会收到信息。MQTT 的主题有特定的语法,使用斜杠(/)作为分隔符,整体呈层次结构,类似 URL 中的路径格式。

3.2 通配符

MQTT 中有两个可用的通配符,分别是+和#,+表示匹配单一层级中的任意主题,#表示匹配任意数量的层次。

3.3 服务质量(QoS)

MQTT 的设计初衷是为了在不可靠的网络中运作良好,为不同的场景提供了三个级别的服务质量,允许客户端指定自己想要的可靠性级别。

3.3.1 QoS Level 0:至多一次

这是最简单的级别,无需客户端确认,其可靠性与基础网络层 TCP/IP 一致。

3.3.2 QoS Level 1:至少一次,有可能重复

确保至少向客户端发送一次信息,不过也可发送多次;在接收数据包时,需要客户端返回确认消息(ACK 包)。这种方式常用于传递确保交付的信息,但开发人员必须确保其系统可以处理重复的数据包。

3.3.3 QoS Level 2:只有一次,确保消息只到达一次

这是最不常见的服务质量级别,确保消息发送且仅发送一次。这种方法需要交换4个数据包,同时也会降低消息代理的性能。由于相对比较复杂,在 MQTT 实现中通常会忽略这个级别,请确保在选择数据库或消息代理前检查这个问题。

3.4 “临终遗嘱”信息

MQTT提供了检测方式,利用KeepAlive机制在客户端异常断开时发现问题。因此当客户端电量耗尽、崩溃或者网络断开时,消息代理会采取相应措施。

客户端会向任意点的消息代理发送“临终遗嘱”(LWT)信息,当消息代理检测到客户端离线(连接并未关闭),就会发送保存在特定主题上的 LWT 信息,让其它客户端知道该节点已经意外离线。

3.5保留消息 Retained Messages

MQTT中无论是发布还是订阅都不会有任何触发事件。

1个Topic只有唯一的retain消息,Broker会保存每个Topic的最后一条retain消息。

发布消息时把retain设置为true,即为保留信息。每个Client订阅Topic后会立即读取到retain消息。如果需要删除retain消息,可以发布一个空的retain消息,因为每个新的retain消息都会覆盖最后一个retain消息。