mqtt
1、简介
MQTT 可以简单看做一个网络协议,用于机器对机器的通信(与客户端到服务器的传输有点区别)。智能传感器、可穿戴设备和其他物联网(IoT)设备通常必须通过带宽有限的资源受限网络传输和接收数据。这些物联网设备使用 MQTT 进行数据传输,因为它易于实施,并且可以有效地传输物联网数据。MQTT 支持设备到云端和云端到设备之间的消息传递。
1.1、特点
轻量级:MQTT协议是一种轻量级的协议,它的开销非常小,可以在低带宽、不稳定的网络环境下运行。
灵活性:双向通信,MQTT协议支持多种消息传输模式,包括点对点、发布/订阅和请求/响应等模式,可以根据不同的应用场景选择合适的模式。
可靠性:MQTT协议支持QoS(服务质量)等级,可以确保消息的可靠传输,同时还支持消息持久化和重传机制,保证消息不会丢失。
易于集成:MQTT协议可以与各种不同的平台和设备集成,包括传感器、嵌入式设备、移动设备和云平台等,可以实现跨平台、跨设备的通信。
安全性:MQTT协议支持TLS/SSL加密和认证机制,可以保证消息的安全传输和身份验证,防止数据泄露和攻击。
1.2、mqtt为什么比ampq轻量
较低的带宽和资源消耗:MQTT使用更紧凑的消息头和较少的协议开销,这使得它在网络带宽有限或资源受限的环境下表现更好。它使用较小的消息包大小和更少的网络往返次数,减少了传输延迟和网络负载
适用于低功耗设备:由于MQTT的设计目标是针对低带宽、不稳定网络和低功耗设备(如传感器和物联网设备),它采用了一些优化策略,如保持TCP连接的持久性、支持消息压缩和QoS级别控制等。这些特性使得MQTT成为物联网领域的首选协议
2、三种服务质量
2.1、QoS 0:最多一次传递
在QoS 0级别下,发布者只需将消息发送给MQTT代理,代理会将消息发送给订阅者,但不会保证消息是否到达订阅者。这种级别的实现非常简单,因为不需要进行确认或重传,所以消息传递的延迟和带宽占用都很低
通常选择使用 QoS 0 传输一些高频且不那么重要的数据,比如传感器数据,周期性更新,即使遗漏几个周期的数据也可以接受
2.2、QoS 1:最少一次传递
在QoS 1级别下,发布者将消息发送给MQTT代理,代理会将消息发送给订阅者,并等待订阅者的确认。如果代理没有收到确认,它会重新发送消息,直到收到确认为止。这种级别的实现需要进行确认和重传,所以消息传递的延迟和带宽占用都比QoS 0高
QoS1在协议层面上无法避免消息重复的情况,因此在我们的报文内容里面通常加上报文的唯一id,在应用层通过id去对消息去重是最常规的处理方法
2.3、QoS 2:恰好一次传递
MQTT识别报文是通过一个Packet ID来识别是不是重复信息。Qos1收到两条相同Packet ID报文的消息是没办法知道这是重复的信息,还是两条不同的消息只是用的同一个ID的情况,因此Qos1是存在重复消息的问题。QoS2会用更加复杂的交互逻辑来确保消息不会重复
发送方发送完报文,需要等待收到接收方发送PUBREC报文(在这期间还可以超时重发这个报文),等到收到PUBREC报文后,发送方会继续发送PUBREL (Publish Release)报文,此时不能再重发报文了,并且Packet ID也不能使用。等待收到对端回复的 PUBCOMP 报文后,才表示此时Packet ID被释放完成,可以继续使用Packet ID去发送消息。因此对于接
收方以 PUBREL 报文为界限,凡是在 PUBREL 报文之前到达的 PUBLISH 报文,有相同的Packet ID都必然是重复的消息;而凡是在 PUBREL 报文之后到达的 PUBLISH 报文,有相同的Packet ID都必然是全新的消息。
在QoS 2级别下,发布者将消息发送给MQTT代理,代理会将消息发送给订阅者,并等待订阅者的确认。如果代理没有收到确认,它会重新发送消息,直到收到确认为止。订阅者收到消息后,会发送确认给代理,代理再将确认发送给发布者。如果代理没有收到确认,它会重新发送消息,直到收到确认为止。这种级别的实现需要进行确认、重传和去重,所以消息传递的延迟和带宽占用都比QoS 1更高。
总的来说,QoS级别越高,消息传递的可靠性越高,但延迟和带宽占用也越高。在选择QoS级别时,需要根据应用场景的需求来进行权衡。
3、消息可靠(持久化)
MQTT还有一个持久会话的功能,对应的是Clean Session(清理会话)选项。当Clean Session = 0,以及QoS为1或着2的时候,加入接收端离线了也会在下次在线时收到断连期间的消息。此时的消息会暂存在我们的MQTT服务器端