Я использую
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
Но я все еще не уверен.