MQTT循环函数的max_packets的适当值

时间:2016-03-19 23:53:27

标签: python mqtt

我有这个代码应该无限期运行,但事实并非如此。它从客户端开始每隔几个小时停止一次(停止发布,循环继续运行,但代理没有收到任何内容),唯一可以做的就是重新运行它。

我被告知{{3}}增加了循环函数的max_packets数量,但它不起作用,客户端会在没有继续的情况下随机停止发布。应该做什么?我尝试了1,3,5,50和1000的值,但没有用。

代码:

d2 <- sapply(colnames(d1), FUN=function(X) recode(d1[,X],  paste0("'Somewhat interested' ='Somewhat ",substr(X, 5, nchar(X)) ,"'; 'Not interested' = 'No ", substr(X, 5, nchar(X)),"'")))

3 个答案:

答案 0 :(得分:2)

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

除了发送消息之外,loop()*函数还在代理和客户端之间维护这种保持活动的流量。

随机尝试:尝试使用loop_start()一次,而不是在while循环中调用loop()。 E.g。

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()

答案 1 :(得分:1)

随机猜测......客户端是否已断开连接?

在您的代码中,当客户端与代理断开连接时,您不会像on_disconnect(client, userdata, rc)那样处理<{1}}

def on_disconnect_handler(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection.")

client.on_disconnect = on_disconnect_handler

您也没有查看loop() any callback
成功时返回MQTT_ERR_SUCCESS         错误时返回&gt;。

您应该执行类似

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

答案 2 :(得分:-1)

每次循环通过时,只需让客户端连接即可。我测试了它并连接到代理并没有任何明显的额外延迟。由于我必须重新运行程序才能重新开始工作,我不妨在循环中重新连接客户端,所以我不必自己动手。这是我能提出的最简单的想法,似乎没有任何问题。

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)