2016-10-21 4 views
1

Dears, Я пытаюсь использовать mqtt на esp8266 на основе nodemcu. Я в настоящее время с помощью настраиваемой сборки (https://nodemcu-build.com/index.php)Сохраняющий таймер на mqtt nodemcu (esp8266) не отвечает

модулей используются: адъютант, enduser_setup, файл, GPIO, HTTP, MQTT, сеть, узел, вл, широтно-импульсная модуляция, пмр, UART, Wi-Fi

версия: питание от Lua 5.1.4 на SDK 1.5.1 (e67da894)

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(), белый ich работает отлично, и я могу подписаться и опубликовать на темы.

Проблема в том, что таймер keepalive неверен. Позвольте мне объяснить это на примере. Я установил KEEP_ALIVE_TMR = 120 и после успешного подключения esp8266 к mqtt broker я отключил Wi-Fi на моем маршрутизаторе и начал отсчет секунд. По KEEP_ALIVE_TMR автономного события:

m:on("offline", function(conn) 
     print("["..tmr.time().."(s)] - Mqtt client gone offline") 

end) 

должен сгореть ровно 120 секунд с момента у меня есть отключить WiFi, но по неизвестной причине этого не произойдет. Обычно событие срабатывает примерно через 10-15 минут. Я изо всех сил стараюсь понять причину этой задержки без успеха. У вас есть идеи, почему эта странная вещь случается?

+0

Пробовал ответы ниже? – cagdas

ответ

0

Я также столкнулся с той же проблемой, когда был установлен флаг autoreconnect. Этот флаг нарушает запуск автономного события соединения между брокером.

Попробуйте без установки autoreconnect, которого по умолчанию 0:

m:connect(BROKER, PORT, 0, function(client) 
0

Если вы делаете ваши испытания, превратив MQTT брокера вкл/выкл, и она работает. Но не переключая свои Wi-Fi-соединения, это проблема библиотеки mqtt nodemcu.

Я считаю, что нет такого события mqtt offline/disconnect при отключении Wi-Fi. Здесь это временное решение, добавленное сторожевым устройством подключения.

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) 

Here it is the full code example

Смежные вопросы