逗人, 我试图在nodemcu上的esp8266构建上使用mqtt。我目前正在使用自定义版本(https://nodemcu-build.com/index.php)
使用的模块:adc,enduser_setup,file,gpio,http,mqtt,net,node,ow,pwm,tmr,uart,wifi
版本:由SDK 1.5.1(e67da894)上的Lua 5.1.4提供支持
function connect_to_mqtt_broker()
print("Connecting to broker...")
m:connect(BROKER, PORT, 0, 1, function(client)
print("connected")
print("["..tmr.time().."(s)] - Client connected to broker: "..BROKER)
m:subscribe(SUB_TOPIC,0, function(conn)
print("Subscribed to "..SUB_TOPIC.." topic")
led(0,204,0,150)
end)
m:publish(PUB_TOPIC,"Hello from: "..node.chipid()..RESTART_REASON,0,0, function(conn)
print("sent")
end)
end,
function(client, reason)
print("failed reason: "..reason)
end)
end
---MQTT client---
print("--------------> Create mqtt clinet")
--set up MQTT client
-- init mqtt client with keepalive timer 120sec
m = mqtt.Client("ESP"..node.chipid(), KEEP_ALIVE_TMR, USER, PASSWORD)
m:lwt(PUB_TOPIC, "offline", 0, 0)
m:on("offline", function(conn)
print("["..tmr.time().."(s)] - Mqtt client gone offline")
end)
m:on("message", function(conn, topic, data)
--receive_data(data, topic)
print("Data received: "..data)
led(200,50,50,30)
receive_data(data, topic)
led(0,204,0,150)
end)
因此,在初始化程序时,我正在调用 connect_to_mqtt_broker(),这是完美的工作,我可以订阅并发布到主题。
问题是keepalive计时器不正确。让我用一个例子解释一下。我设置了KEEP_ALIVE_TMR = 120s,并且在esp8266成功连接到mqtt代理后,我在路由器上禁用了wifi并开始计算秒数。根据KEEP_ALIVE_TMR离线事件:
m:on("offline", function(conn)
print("["..tmr.time().."(s)] - Mqtt client gone offline")
end)
从我禁用WiFi的那一刻起,应该正好发射120秒,但由于某种未知的原因,这种情况不会发生。通常事件会在10-15分钟后爆发。 我很难理解这种延迟的原因并没有成功。 你知道为什么会发生这种奇怪的事情吗?
答案 0 :(得分:0)
设置autoreconnect
标志时,我也遇到了同样的问题。此标志会中断代理之间连接的脱机事件的运行。
尝试不设置autoreconnect
,其默认值为0:
m:connect(BROKER, PORT, 0, function(client)
答案 1 :(得分:0)
如果您通过打开/关闭mqtt代理来进行测试,那么它可以正常运行。但不是通过切换你的wifi连接,那么它就是nodemcu的mqtt库问题。
我相信在wifi断开连接时没有这样的mqtt offline / disconnect事件。这是添加连接监视器的解决方法。
tmr.alarm(1, 3000, 1, function()
if wifi.sta.getip() == nil then
--mark as mqtt restart needed
restart = true
else
-- wifi reconnect detected then restart mqtt connections
if restart == true then
--reset flag, clean object, init for a new one
restart = false
m = nil
mqtt_init()
connect()
end
end
end)