QoS 2 时,带有 AWS IoT Core 的 MQTT 不发送消息

MQTT with AWS IoT Core not sending messages when QoS 2

我正在尝试使用 MQTT 从一个客户端向另一个客户端发送消息,两者都是发布者订阅者。当 QoS = 1 时,消息被发送但有时会重复。但是,当我使用 QoS = 2 时,消息显然没有发送。每个客户端每轮发送 4 条消息,有效载荷是最大字节数组的一部分。

发布者代码:

def publish_model(model):
SliceLength, FinalSlice, ByteArray, ArrayLength,SlicesNumber = get_lengths(model)
mqttc.publish("home/AWS1", ByteArray[ArrayLength - FinalSlice:ArrayLength], qos=2)
sleep(0.2)
for i in range(SlicesNumber-1,0,-1):
        if i != 1:
            print(SliceLength*(i-1)-SliceLength*i)
            mqttc.publish("home/AWS1", ByteArray[SliceLength*(i-1):SliceLength*i], qos=2)
            mqttc.loop()

            print("model sent: home/AWS1")

        else:   ###The final chunk
            mqttc.publish("home/AWS2", ByteArray[SliceLength*(i-1):SliceLength*i], qos=2)  
            mqttc.loop()
            print("model sent: home/AWS2")

        sleep(0.2)

订阅者代码:

mqttc.subscribe("home/AWS1", 2)
mqttc.subscribe("home/AWS2", 2)

while 1 == 1:
    if connflag == True:
        p = 1  ##line that does nothing only waits

    else:
        print("waiting for connection...")

我想强调一下,两者都是订阅者和发布者

发布者在发送消息时只保留:MQTT sending

这里的问题是 AWS IoT Core 只允许 QoS 0 和 1。因此,如果 QoS=2,则不会发送消息。

AWS IoT 不支持 QoS 2。请求 QoS 级别 2 时,消息代理不会发送 PUBACK 或 SUBACK。

作为解决方法,您可以

  • 设置您自己的 MQTT 服务器,并将 MQTT 服务器配置为通过 QoS 1 发布到 IoT Core。这样您的物理设备仍可通过本地服务器通过 QoS 2 运行,但您将能够使用 IoT核心在其范围内

  • 发布序列号超过 QoS 1 的消息,并具有删除重复序列号的逻辑(使用 SQS + lambda 或类似的东西)。这样你就可以确保最多只有一条消息(没有重复的消息,QoS 2 提供的东西)