MQTT NodeMCU Lua: Почему после PUBACK приходится ждать дремоты? - PullRequest
0 голосов
/ 12 января 2020

Я использую

NodeMCU 3.0.0.0 built on nodemcu-build.com provided by frightanic.com
    branch: master
    commit: 310faf7fcc9130a296f7f17021d48c6d717f5fb6
    release: 3.0-master_20190907
    release DTS: 201909070945
    SSL: true
    build type: float
    LFS: 0x0
    modules: adc,bme280,dht,enduser_setup,file,gpio,i2c,mqtt,net,node,rtcmem,rtctime,sjson,sntp,tmr,uart,wifi,tls
 build 2020-01-03 12:07 powered by Lua 5.1.4 on SDK 3.0.1-dev(fce080e)

со следующим кодом, как в документах, но с отправкой ESP в спящий режим после получения PUBACK и с QoS = 1

m = mqtt.Client("clientid", 120)
m:on("connect", function(client) print ("connected") end)
m:lwt("/lwt", "offline", 1, 0)
m:on("offline", function(client) print ("offline") end)
m:on("message", function(client, topic, data)
  print(topic .. ":" )
  if data ~= nil then
    print(data)
  end
end)
m:on("overflow", function(client, topic, data)
  print(topic .. " partial overflowed message: " .. data )
end)
m:connect("192.168.11.118", 1883, 0, function(client)
  print("connected")
  client:publish("/topic", "hello", 1, 0, function(client) afterPubackSleep() end)
end,
function(client, reason)
  print("failed reason: " .. reason)
end)

m:close();

function afterPubackSleep(message)
  if(config.deepsleep_enable == "on") then
    local sleep_delay_ms=10 -- doesn't work with 0, works not all the time with 10, seems to work all the time with 1000
    local sleepTimer=tmr.create()
    sleepTimer:register(sleep_delay_ms, tmr.ALARM_SINGLE, function()
      rtctime.dsleep(60000000)
    end)
    sleepTimer:start()
  end
end

Итак, согласно документам, функция afterPubackSleep () вызывается в PUBACK, поэтому брокер должен был получить Сообщение. Mosquitto регистрирует соединение, но другие клиенты, которые подписываются на topi c, не получают сообщение с

sleep_delay_ms=0

, но

sleep_delay_ms=10

работает большую часть времени, и

sleep_delay_ms=1000

, кажется, работает все время.

Я действительно не понимаю, что происходит. Что происходит? Почему я должен ждать после получения PUBACK?

Редактировать: я думаю ответ таков: все асинхронно, поэтому ESP уходит в глубокий сон, прежде чем все будет сделано. Это также всегда работает:

closed = false
client:publish("/"..config.root_topic.."/"..chipId, message, config.qos, 0,
  function(client)
    closed = m:close()
    waitForCloseClient(client)
  end
)

function waitForCloseClient(client)
  if(closed) then
    rtctime.dsleep(sleep_duration)
  else
    local closeTimer=tmr.create()
    wait_count = wait_count + 1
    print("Wait count: "..wait_count)
    closeTimer:register(sleep_delay_ms, tmr.ALARM_SINGLE, function()
      waitForCloseClient(client)
    end)
    closeTimer:start()
  end
end

Но я все еще не уверен.

...