MQTT 如何保证Qos?

  • 轻量级的 machine-to-machine 通信协议。
  • publish/subscribe模式。
  • 基于TCP/IP。
  • 支持QoS。
  • 适合于低带宽、不可靠连接、嵌入式设备、CPU内存资源紧张。
  • 是一种比较不错的Android消息推送方案。
  • FacebookMessenger采用了MQTT。
  • MQTT有可能成为物联网的重要协议。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

2、对负载内容屏蔽的消息传输;

3、使用 TCP/IP 提供网络连接;

4、有三种消息发布服务质量:

    • “至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

    • “至少一次”,确保消息到达,但消息重复可能会发生。

    • “只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制

消息体

 

bit76543210
byte 1Message TypeDUP flagQoS levelRETAIN
byte 2Remaining Length

MessageType

MnemonicEnumerationDescription
Reserved0Reserved
CONNECT1Client request to connect to Server
CONNACK2Connect Acknowledgment
PUBLISH3Publish message
PUBACK4Publish Acknowledgment
PUBREC5Publish Received (assured delivery part 1)
PUBREL6Publish Release (assured delivery part 2)
PUBCOMP7Publish Complete (assured delivery part 3)
SUBSCRIBE8Client Subscribe request
SUBACK9Subscribe Acknowledgment
UNSUBSCRIBE10Client Unsubscribe request
UNSUBACK11Unsubscribe Acknowledgment
PINGREQ12PING Request
PINGRESP13PING Response
DISCONNECT14Client is Disconnecting
Reserved15Reserved

 

(1)QoS 0(At most once)“至多一次”
消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

(2)QoS 1(At least once)“至少一次”
确保消息到达,但消息重复可能会发生。

(3)QoS 2(Exactly once)“只有一次”
确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。

需要注意的是:

  • 这里指的是Client和Broker之间的关系,而不是Publisher和Subscriber之间的关系,在Pub/Sub模型中,Publisher和Subscriber是完全解耦的。
  • 发布者在每次发布消息时都需要设置QoS,订阅者在订阅主题时也可以设置QoS。
  • 发布者或者订阅者设置的QoS分别是和服务器端异步执行的。
  • 即使发布者设置发布消息为QoS2,订阅者也可以通过QoS0或QoS1来订阅该消息(这样就是QoS的降级downgrade)。
  • 订阅者一般来说最好使用QoS2。


以下是发布和订阅的时序图:







MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,用于在物联网设备之间进行消息传输。在MQTT中,订阅(subscribe)是一种客户端向MQTT代理服务器注册兴趣以接收特定主题消息的操作。QoS(Quality of Service)是MQTT中用于定义消息传输质量的参数。 在MQTT中,有三个不同的QoS级别可供选择: 1. QoS 0(“至多一次”):消息以最多一次的方式传输。在这个级别下,消息可能会丢失或重复。 2. QoS 1(“至少一次”):消息至少传输一次,但可能会重复。 3. QoS 2(“只有一次”):消息确保只传输一次,不会出现重复。 当订阅一个主题时,可以指定所需的QoS级别。该级别将确定代理服务器传递该主题的消息时所采取的传输保证机制。 例如,使用MQTT客户端库(如Paho MQTT)可以使用以下代码进行订阅操作: ```python import paho.mqtt.client as mqtt def on_message(client, userdata, msg): # 处理接收到的消息 print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() client.on_message = on_message client.connect("mqtt.example.com", 1883, 60) client.subscribe("my/topic", qos=1) # 指定QoS级别为1 client.loop_forever() ``` 在上述代码中,通过调用`subscribe`函数并指定`qos=1`,订阅了名为"my/topic"的主题,并将QoS级别设置为1。这意味着代理服务器将以至少一次的方式传输该主题的消息。 需要注意的是,发布(publish)消息的客户端也可以指定消息的QoS级别。发布和订阅的QoS级别可以独立设置,以满足不同的传输需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值