luat编程MQTT的自动重连失败分析
作者:互联网
正确用法
查看代码
--- 模块功能:MQTT客户端处理框架
-- @author openLuat
-- @module mqtt.mqttTask
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.28
module(..., package.seeall)
require "misc"
require "mqtt"
require "mqttOutMsg"
require "mqttInMsg"
local ready = false
--- MQTT连接是否处于激活状态
-- @return 激活状态返回true,非激活状态返回false
-- @usage mqttTask.isReady()
function isReady()
return ready
end
--启动MQTT客户端任务
sys.taskInit(
function()
local retryConnectCnt = 0
while true do
if not socket.isReady() then
retryConnectCnt = 0
--等待网络环境准备就绪,超时时间是5分钟
sys.waitUntil("IP_READY_IND", 300000)
end
if socket.isReady() then
local imei = misc.getImei()
--创建一个MQTT客户端
local mqttClient = mqtt.client(imei, 600, "user", "password")
--阻塞执行MQTT CONNECT动作,直至成功
--如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
--mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
if mqttClient:connect("lbsmqtt.airm2m.com", 1884, "tcp") then
retryConnectCnt = 0
ready = true
--订阅主题
if mqttClient:subscribe({["/event0"] = 0, ["/中文event1"] = 1}) then
mqttOutMsg.init()
--循环处理接收和发送的数据
while true do
if not mqttInMsg.proc(mqttClient) then
log.error("mqttTask.mqttInMsg.proc error")
break
end
if not mqttOutMsg.proc(mqttClient) then
log.error("mqttTask.mqttOutMsg proc error")
break
end
end
mqttOutMsg.unInit()
end
ready = false
else
retryConnectCnt = retryConnectCnt + 1
end
--断开MQTT连接
mqttClient:disconnect()
if retryConnectCnt >= 5 then
link.shut()
retryConnectCnt = 0
end
sys.wait(5000)
else
--进入飞行模式,20秒之后,退出飞行模式
net.switchFly(true)
sys.wait(20000)
net.switchFly(false)
end
end
end
)
错误用法
查看代码
--- 模块功能:MQTT客户端处理框架
-- @author openLuat
-- @module mqtt.mqttTask
-- @license MIT
-- @copyright openLuat
-- @release 2018.03.28
module(..., package.seeall)
require "misc"
require "mqtt"
require "mqttOutMsg"
require "mqttInMsg"
local ready = false
--- MQTT连接是否处于激活状态
-- @return 激活状态返回true,非激活状态返回false
-- @usage mqttTask.isReady()
function isReady()
return ready
end
--启动MQTT客户端任务
sys.taskInit(
function()
local retryConnectCnt = 0
while true do
if not socket.isReady() then
retryConnectCnt = 0
--等待网络环境准备就绪,超时时间是5分钟
sys.waitUntil("IP_READY_IND", 300000)
end
if socket.isReady() then
local imei = misc.getImei()
--创建一个MQTT客户端
local mqttClient = mqtt.client(imei, 600, "user", "password")
--阻塞执行MQTT CONNECT动作,直至成功
--如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
--mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
if mqttClient:connect("lbsmqtt.airm2m.com", 1884, "tcp") then
retryConnectCnt = 0
ready = true
--订阅主题
if mqttClient:subscribe({["/event0"] = 0, ["/中文event1"] = 1}) then
mqttOutMsg.init()
--循环处理接收和发送的数据
while true do
if not mqttInMsg.proc(mqttClient) then
log.error("mqttTask.mqttInMsg.proc error")
break
end
if not mqttOutMsg.proc(mqttClient) then
log.error("mqttTask.mqttOutMsg proc error")
break
end
end
mqttOutMsg.unInit()
end
ready = false
else
retryConnectCnt = retryConnectCnt + 1
end
if retryConnectCnt >= 5 then
link.shut()
retryConnectCnt = 0
end
sys.wait(5000)
else
--断开MQTT连接
mqttClient:disconnect()
--进入飞行模式,20秒之后,退出飞行模式
net.switchFly(true)
sys.wait(20000)
net.switchFly(false)
end
end
end
)
错误原因: mqttClient:disconnect()
mqttClient会被提示一个未被初始化的全局变量,程序报错;因为mqttClient的初始化定义和本次调用并不在同一个作用域中。
标签:mqttClient,end,luat,--,MQTT,重连,true,retryConnectCnt 来源: https://www.cnblogs.com/realiot/p/16096060.html