MQTT协议零基础快速入门
MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网(IoT)和机器对机器(M2M)通信场景。它具有简单、开放、易于实现等优点,特别适合在受限的环境中运行,例如资源有限、网络带宽有限或需要远程连接的设备。
MQTT协议基于TCP/IP或其他提供有序、无损、双向连接的网络协议运行,属于应用层协议,与HTTP协议位于同一层。
一、MQTT的特点
- 发布订阅模式:MQTT支持发布/订阅消息传输模式,可以实现服务解耦和一对多消息分发。
- 与有效负载内容无关的消息传输:MQTT协议对消息内容不做任何限制,可以传输任何类型的数据。
- 三种服务质量保证:MQTT根据定义的服务质量(QoS)级别来传递应用消息。包括以下三种级别:
- At most once(QoS 0):根据底层网络能力,消息可能丢失。
- At least once(QoS 1):确保消息到达,但可能出现重复。
- Exactly once(QoS 2):确保消息精确到达一次。
二、如何实现服务质量保证
MQTT根据定义的服务质量(QoS)级别来传递应用消息。以下是不同QoS级别的详细说明:
At most once(QoS 0)
在这种服务质量级别下,消息的传递是基于底层网络的能力进行的。接收方不发送响应,发送方也不重试。消息要么一次性到达接收方,要么根本就没有到达。
发送方:
必须发送一个带有QoS=0,DUP=0的PUBLISH包。
如果DUP=0,它表明这是客户端或服务器第一次尝试发送这个MQTTPUBLISH包。如果DUP标志=1,它表明这可能是之前尝试发送包的重新交付。
接收方:
当接收到PUBLISH包时,接收方接受消息的所有权(包括消息分发和是否保留存储等)。
At least once(QoS 1)
这种服务质量级别保证了消息至少一次到达接收端。一个QoS 1 PUBLISH包在其变量头部有一个包标识符,并被PUBACK包确认。
发送方:
- 每次有新的消息要发布时,必须分配一个未使用的包标识符。
- 发送一个包含此包标识符的PUBLISH包:QoS=1,DUP=0。
- 将PUBLISH包视为“未确认”包,直到它收到接收方的相应PUBACK包。
注意: 包标识符在发送端接收到PUBACK包后可以被重用。发送方在等待接收确认时,允许发送更多带有不同包标识符的PUBLISH包。
接收方:
- 必须响应一个包含来自发送方传入PUBLISH包的包标识符的PUBACK包,表示接受了应用消息的所有权。
- 在它发送了一个PUBACK包之后,接收方必须将任何传入的包含相同包标识符的PUBLISH包视为一个新的发布,而不考虑它的DUP标志的设置,也就是说包标识符是可以复用的。
- 在发送PUBACK之前,接收方不需要完成应用消息的传递。当其原始发送方接收到PUBACK包时,应用消息的所有权就转移到接收方。
Exactly once(QoS 2)
这是最高的服务质量,用于既不能丢失消息也不能重复消息的情况。这种服务质量会增加开销。
发送方:
- 当有一个新的消息要发布时,必须分配一个未使用的包标识符。
- 必须发送一个包含此包标识符的PUBLISH包:QoS=2,DUP=0。
- 必须将PUBLISH包视为“未确认”包,直到从接收方收到相应的PUBREC包。
- 当从接收端收到一个PUBREC数据包时,必须发送一个PUBREL数据包。这个PUBREL数据包必须包含与原始PUBLISH数据包相同的数据包标识符。
- 必须将PUBREL包视为“未确认”包,直到从接收方收到相应的PUBCOMP包。一旦发送了相应的PUBREL包,绝对不能重新发送相同包标识符的PUBLISH包。
注意:包标识符在发送端接收到PUBCOMP包后可以被重用。发送方在等待接收确认时,允许发送更多带有不同包标识符的PUBLISH包。
接收方:
- 必须响应一个包含来自传入的PUBLISH包的包标识符的PUBREC,同时接受了消息的所有权。
- 在接收到相应的PUBREL数据包之前,接收端必须通过发送一个PUBREC来确认任何后续的具有相同数据包标识符的PUBLISH数据包。在这种情况下,它绝对不能导致重复的消息被传递到任何后续其他的接收方。
- 必须通过发送包含与PUBREL相同包标识符的PUBCOMP包来响应PUBREL包。
- 在它发送了一个PUBCOMP之后,接收方必须将任何包含该包标识符的后续PUBLISH包视为一个新的发布,也就是说包标识符是可以复用的。
注意:在发送PUBREC或PUBCOMP之前,接收方不需要完成应用消息的传递。当其原始发送方接收到PUBREC包时,应用消息的所有权就转移到接收方。
该图显示了接收方可以用两种方法来处理QoS2。 它们的区别在于消息在流中的哪个位置可以被用于后续的传递,至于对应的实现相关的。只要一个实现只选择了其中一种方法, 就不会影响对QoS2流的保证。
三、总结
总的来说,MQTT协议是一种轻量级、开放、简单的发布/订阅消息传输协议,适用于受限环境和大规模的物联网(IoT)和机器对机器(M2M)通信。它提供了三种服务质量保证级别,以满足不同场景的需求。通过在发送方和接收方之间建立有序、无损、双向连接,MQTT实现了可靠的消息传递。在实现过程中,发送方和接收方的行为和职责明确,有利于实现服务解耦和一对多消息分发。同时,MQTT协议的设计也考虑了网络拥塞和丢包等问题,以确保消息的可靠传递。因此,MQTT协议是一种非常有前途的消息传递协议,将在未来的物联网和机器对机器通信中发挥越来越重要的作用。