IoT Core MQTT消息在QoS0和QoS1之间发送的频率差异

0

【以下的问题经过翻译处理】 你好,我修改了aws-iot-device-sdk-python的basicPubSub示例程序,尝试以10Hz的速度向Iot Core发送mqtt消息。同时,我使用AWS MQTT测试客户端订阅和监视mqtt消息。

我没有更改AWSIoTMQTTClient连接配置,只通过函数myAWSIoTMQTTClient.publish(topic, messageJson, _qos)更改了QoS。对于QoS=0,发送循环时间约为0.1秒,MQTT测试客户端将消息更新速度约为10Hz。然而,对于QoS=1,发送循环时间变成了约为0.4〜0.7秒,MQTT测试客户端将消息更新速度约为2Hz。

我想知道如何提高QoS1的发送速率,以及它的最大频率是多少。非常感谢。

下面是我的主循环代码。

if args.mode == 'both' or args.mode == 'publish':
    message = {}
    message['message'] = args.message
    message['sequence'] = loopCount
    messageJson = json.dumps(message)
    myAWSIoTMQTTClient.publish(topic, messageJson, _qos)
    # if args.mode == 'publish':
    # print('Published topic %s: %s\n' % (topic, messageJson))
    loopCount += 1
toc = time.time()
t_interval = toc -tic
tic = toc
print('[%f]Published topic %s: %s\n' % (t_interval,topic, messageJson))
time.sleep(0.1)
profile picture
专家
已提问 6 个月前20 查看次数
1 回答
0

【以下的回答经过翻译处理】 你好。根据你目前的代码,你的QoS发送循环时间几乎完全由time.sleep(0.1)调用控制。

该示例使用**publish()**方法,对于QoS 1是阻塞调用。在调用返回之前,它将等待来自AWS IoT Core的PUBACK:https://github.com/aws/aws-iot-device-sdk-python/blob/0b195b82349e2d5b9715d4880da747bfbaaa1437/AWSIoTPythonSDK/core/protocol/mqtt_core.py#L267-L273

相比之下,你可能更喜欢**publishAsync()**方法,它不会阻塞,而是允许你同时进行多个QoS 1事务。请参见此示例:https://github.com/aws/aws-iot-device-sdk-python/blob/master/samples/basicPubSub/basicPubSubAsync.py

如果你尚未这样做,应该使用最近地区的AWS IoT Core端点来最小化往返时间。如果真的要最大化吞吐量,应该完全去掉time.sleep()

需要注意的是,IoT Core每个客户端连接每秒最多可发布100次,并且任何时候最多可以同时进行100个传入的QoS 1事务。 https://docs.aws.amazon.com/general/latest/gr/iot-core.html#message-broker-limits

最后,我建议你使用V2 SDK而不是V1 SDK:https://github.com/aws/aws-iot-device-sdk-python-v2。来自V1 README:

现在已经推出了新的AWS IoT Device SDK:https://github.com/awslabs/aws-iot-device-sdk-python-v2。这是一个完全重新设计的SDK,旨在提高可靠性、性能和安全性。我们期待你的反馈!

此SDK将不再接收功能更新,但将接收安全更新。

profile picture
专家
已回答 6 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则