我有这个代码应该无限期运行,但事实并非如此。它从客户端开始每隔几个小时停止一次(停止发布,循环继续运行,但代理没有收到任何内容),唯一可以做的就是重新运行它。
我被告知{{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)),"'")))
答案 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)