| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- --- 模块功能: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"
- --网络业务逻辑看门狗task
- socketAppDogCo = sys.taskInit(function()
- while true do
- --连续5分钟没有喂狗,根据项目需求自行修改时长
- if sys.wait(300000) == nil then
- sys.restart("socketApp exception software dog timeout")
- end
- end
- end)
- --喂狗代码(根据产品业务逻辑,在适当的位置去调用):
- --如何去确认这个“适当的位置”呢?下面列举几种常见的场景:
- --1、如果模块和服务器之间有应用心跳的应答机制,则可以在模块每次收到服务器的心跳应答时去喂狗
- --2、如果没有心跳应答机制,可以在连接服务器成功后,起个定时器,每隔一段时间去喂一次狗;连接断开时,关闭这个喂狗定时器
- --3、如果模块定时会向服务器发送数据,可以在每次发送数据成功后,去喂狗
- --4、......
- --网络业务逻辑看门狗的设计目的:
- --sim卡识别异常、网络注册异常、PDP激活异常、socket异常、mqtt数据交互异常时
- --都可以通过网络业务逻辑看门狗控制软重启
- local ready = false
- --- MQTT连接是否处于激活状态
- -- @return 激活状态返回true,非激活状态返回false
- -- @usage mqttTask.isReady()
- function isReady()
- return ready
- end
- --启动MQTT客户端任务
- sys.taskInit(
- function()
- while true do
- if not socket.isReady() then
- --等待网络环境准备就绪,超时时间是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",1883,"tcp") then
- sys.timerLoopStart(function () coroutine.resume(socketAppDogCo ,"feed") end , 120000)
- ready = true
- --订阅主题",0
- if mqttClient:subscribe({["mqtt/full/2"]=0}) then
- --循环处理接收和发送的数据
- 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
- end
- ready = false
- end
- --断开MQTT连接
- mqttClient:disconnect()
- sys.wait(5000)
- else
- --进入飞行模式,20秒之后,退出飞行模式
- net.switchFly(true)
- sys.wait(20000)
- net.switchFly(false)
- end
- end
- end
- )
|