但是,我的代码应该无限期地运行,但是它没有。它继续从客户端每隔几个小时停止运行一次(停止发布,循环继续运行,但是代理没有接收到任何消息),唯一能做的事情就是重新运行它。
我被建议这里增加循环函数的max_packets数量,但是它不起作用,客户端没有继续就停止了随机发布。应该做些什么?我尝试了1,3,5,50和1000的数值,但是没有用。
代码:
client = mqtt.Client()
client.connect(address, 1883, 60)
while True:
data = getdata()
client.publish("$ahmed/",data,0)
client.loop(timeout=1.0, max_packets = 1) # what should be the parameters here so it doesn't stop publishing?
time.sleep(0.2)发布于 2016-03-20 03:53:08
除了已发布/订阅的应用程序消息外,MQTT还具有内部保持活力,以避免半开放TCP (1)问题。客户端有责任确保保存文件被发送。根据规范,代理将断开客户端的连接,客户端不会在保持活动时间间隔的一个半时间内(在没有其他消息的情况下)发送保活。
除了发送消息外,loop()*函数还维护代理和客户端之间的这种保持活力的通信流。
随机尝试:尝试使用loop_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()发布于 2016-03-21 08:13:07
只是随机猜测..。客户断了吗?
在您的代码中,您没有处理任何回调,比如当客户机断开与代理的连接时调用的on_disconnect(client, userdata, rc)。
def on_disconnect_handler(client, userdata, rc):
if rc != 0:
print("Unexpected disconnection.")
client.on_disconnect = on_disconnect_handler您也没有检查loop() 返回值
在成功时返回MQTT_ERR_SUCCESS。
_Returns >0 on error._你应该做这样的事
while True:
rc = client.loop(timeout=1.0)
if rc:
# handle loop error here发布于 2016-03-20 10:27:49
每次循环结束时,只要让客户端连接即可。我已经对它进行了测试,并且连接到代理不会在流中产生任何额外的延迟。因为我必须重新运行这个程序才能使它再次工作,所以我最好在循环中重新连接客户机,所以我不需要自己去做。这是我能想到的最起码的想法,似乎没有任何问题。
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)https://stackoverflow.com/questions/36108694
复制相似问题