Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python MQTT循环函数的max_数据包的适当值_Python_Mqtt - Fatal编程技术网

Python MQTT循环函数的max_数据包的适当值

Python MQTT循环函数的max_数据包的适当值,python,mqtt,Python,Mqtt,我有这个应该无限期运行的代码,但是它没有。它每隔几个小时就从客户端停止一次(停止发布,循环继续运行,但代理没有收到任何消息),唯一可以做的就是再次运行它 有人建议我为循环函数增加max_数据包的数量,但它不起作用,客户端停止随机发布而不继续。应该怎么做?我尝试了1、3、5、50和1000的值,但没有用 代码: 除了发布/订阅的应用程序消息外,MQTT还具有内部keepalive,以避免TCP连接半开放的问题()。客户有责任确保发送keepalives。根据规范,代理将断开在keepalive时间

我有这个应该无限期运行的代码,但是它没有。它每隔几个小时就从客户端停止一次(停止发布,循环继续运行,但代理没有收到任何消息),唯一可以做的就是再次运行它

有人建议我为循环函数增加max_数据包的数量,但它不起作用,客户端停止随机发布而不继续。应该怎么做?我尝试了1、3、5、50和1000的值,但没有用

代码:


除了发布/订阅的应用程序消息外,MQTT还具有内部keepalive,以避免TCP连接半开放的问题()。客户有责任确保发送keepalives。根据规范,代理将断开在keepalive时间间隔的一倍半内(在没有其他消息的情况下)不发送keepalive的客户端的连接

除了发送消息外,
loop()*
函数还维护代理和客户机之间的这个保持有效的通信流

随机尝试:尝试使用
loop\u start()
一次,而不是在while循环中调用
loop()
。例如

client = mqtt.Client()
client.connect(address)
#runs a thread in background to call loop function internally. 
#In addition, this also reconnects to broker on a lost connection. 
client.loop_start()

while True:
    data = getdata()
    client.publish("$ahmed",data)
client.loop_stop()

除了发布/订阅的应用程序消息外,MQTT还具有内部keepalive,以避免TCP连接半开放的问题()。客户有责任确保发送keepalives。根据规范,代理将断开在keepalive时间间隔的一倍半内(在没有其他消息的情况下)不发送keepalive的客户端的连接

除了发送消息外,
loop()*
函数还维护代理和客户机之间的这个保持有效的通信流

随机尝试:尝试使用
loop\u start()
一次,而不是在while循环中调用
loop()
。例如

client = mqtt.Client()
client.connect(address)
#runs a thread in background to call loop function internally. 
#In addition, this also reconnects to broker on a lost connection. 
client.loop_start()

while True:
    data = getdata()
    client.publish("$ahmed",data)
client.loop_stop()

只要在每次循环完成时让客户端连接就可以了。我已经对它进行了测试,连接到代理不会对流量造成任何明显的额外延迟。因为我必须重新运行程序才能使它再次工作,所以我也可以在循环中重新连接客户端,这样我就不必自己做了。这是我能想到的最原始的想法,似乎没有任何问题

client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    client.connect(address, 1883, 60) # just let it reconnect every time it loops ;)! 
    data = getdata()
    client.publish("$ahmed/",data,0)
    client.loop(timeout=1.0, max_packets = 1) 
    time.sleep(0.2)

只要在每次循环完成时让客户端连接就可以了。我已经对它进行了测试,连接到代理不会对流量造成任何明显的额外延迟。因为我必须重新运行程序才能使它再次工作,所以我也可以在循环中重新连接客户端,这样我就不必自己做了。这是我能想到的最原始的想法,似乎没有任何问题

client = mqtt.Client()
client.connect(address, 1883, 60)

while True:
    client.connect(address, 1883, 60) # just let it reconnect every time it loops ;)! 
    data = getdata()
    client.publish("$ahmed/",data,0)
    client.loop(timeout=1.0, max_packets = 1) 
    time.sleep(0.2)

只是一个随机猜测。。。客户端断开了吗

在您的代码中,您不会像断开连接(client,userdata,rc)时那样处理
,当客户端断开与代理的连接时,会调用它

您也没有检查
loop()

成功时返回MQTT_ERR_SUCCESS。
错误时返回>0

你应该这样做

while True:
    rc = client.loop(timeout=1.0)
    if rc:
        # handle loop error here

只是一个随机猜测。。。客户端断开了吗

在您的代码中,您不会像断开连接(client,userdata,rc)时那样处理
,当客户端断开与代理的连接时,会调用它

您也没有检查
loop()

成功时返回MQTT_ERR_SUCCESS。
错误时返回>0

你应该这样做

while True:
    rc = client.loop(timeout=1.0)
    if rc:
        # handle loop error here


你根本没有提到订阅者,你怎么知道代理没有收到任何东西?@hardillb哦,我的错,但是我在代理上运行的代码确保每当收到消息时都会打印出来。max_packets参数不再使用,请不要设置它。一般来说,您应该使用loop_forever()或loop_start(),loop()本身允许更多的控制,但通常是不必要的。在你的情况下,只按照@Kiran的建议使用loop_start()。你根本没有提到订阅者,你怎么知道代理没有收到任何东西?@hardillb哦,我的错,但我在代理上运行的代码确保每当收到消息时,都会打印出来。不再使用max_packets参数,请不要设置它。一般来说,您应该使用loop_forever()或loop_start(),loop()本身允许更多的控制,但通常是不必要的。在您的情况下,只按照@Kiran的建议使用loop_start()。我已经在测试代码中包含了这一点。我会选择它作为正确的答案,如果它可行的话。我已经在我的测试代码中包含了这一点。如果成功的话,我会选择它作为正确答案。如果你要这样做,请使用
single
函数,它可以一次连接、发布、断开所有连接,请不要这样做。@r请你也解释一下,好吗?!完全没有必要每秒重新连接5次。正如@hardillb所说,您可以使用publish.single()来代替,但如果您以这种速度发布,更好的解决方案是拥有一个持续连接的客户端。如果您要这样做,请使用执行连接、发布的
single
函数,一次性断开所有连接请不要这样做。@r请您也解释一下,好吗?!完全没有必要每秒重新连接5次。正如@hardillb所说,您可以使用publish.single(),但如果您以这种速度发布,更好的解决方案是拥有一个不断连接的客户端。