luat编程MQTT的自动重连失败分析
2022/4/3 17:19:48
本文主要是介绍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的初始化定义和本次调用并不在同一个作用域中。
这篇关于luat编程MQTT的自动重连失败分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-21MQ-2烟雾传感器详解
- 2024-12-09Kafka消息丢失资料:新手入门指南
- 2024-12-07Kafka消息队列入门:轻松掌握Kafka消息队列
- 2024-12-07Kafka消息队列入门:轻松掌握消息队列基础知识
- 2024-12-07Kafka重复消费入门:轻松掌握Kafka消费的注意事项与实践
- 2024-12-07Kafka重复消费入门教程
- 2024-12-07RabbitMQ入门详解:新手必看的简单教程
- 2024-12-07RabbitMQ入门:新手必读教程
- 2024-12-06Kafka解耦学习入门教程
- 2024-12-06Kafka入门教程:快速上手指南