mqttTask.lua 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. --- 模块功能:MQTT客户端处理框架
  2. -- @author openLuat
  3. -- @module mqtt.mqttTask
  4. -- @license MIT
  5. -- @copyright openLuat
  6. -- @release 2018.03.28
  7. module(...,package.seeall)
  8. require"misc"
  9. require"mqtt"
  10. require"mqttOutMsg"
  11. require"mqttInMsg"
  12. --网络业务逻辑看门狗task
  13. socketAppDogCo = sys.taskInit(function()
  14. while true do
  15. --连续5分钟没有喂狗,根据项目需求自行修改时长
  16. if sys.wait(300000) == nil then
  17. sys.restart("socketApp exception software dog timeout")
  18. end
  19. end
  20. end)
  21. --喂狗代码(根据产品业务逻辑,在适当的位置去调用):
  22. --如何去确认这个“适当的位置”呢?下面列举几种常见的场景:
  23. --1、如果模块和服务器之间有应用心跳的应答机制,则可以在模块每次收到服务器的心跳应答时去喂狗
  24. --2、如果没有心跳应答机制,可以在连接服务器成功后,起个定时器,每隔一段时间去喂一次狗;连接断开时,关闭这个喂狗定时器
  25. --3、如果模块定时会向服务器发送数据,可以在每次发送数据成功后,去喂狗
  26. --4、......
  27. --网络业务逻辑看门狗的设计目的:
  28. --sim卡识别异常、网络注册异常、PDP激活异常、socket异常、mqtt数据交互异常时
  29. --都可以通过网络业务逻辑看门狗控制软重启
  30. local ready = false
  31. --- MQTT连接是否处于激活状态
  32. -- @return 激活状态返回true,非激活状态返回false
  33. -- @usage mqttTask.isReady()
  34. function isReady()
  35. return ready
  36. end
  37. --启动MQTT客户端任务
  38. sys.taskInit(
  39. function()
  40. while true do
  41. if not socket.isReady() then
  42. --等待网络环境准备就绪,超时时间是5分钟
  43. sys.waitUntil("IP_READY_IND",300000)
  44. end
  45. if socket.isReady() then
  46. local imei = misc.getImei()
  47. --创建一个MQTT客户端
  48. local mqttClient = mqtt.client(imei,600,"user","password")
  49. --阻塞执行MQTT CONNECT动作,直至成功
  50. --如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
  51. --mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
  52. if mqttClient:connect("lbsmqtt.airm2m.com",1883,"tcp") then
  53. sys.timerLoopStart(function () coroutine.resume(socketAppDogCo ,"feed") end , 120000)
  54. ready = true
  55. --订阅主题",0
  56. if mqttClient:subscribe({["mqtt/full/2"]=0}) then
  57. --循环处理接收和发送的数据
  58. while true do
  59. if not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
  60. if not mqttOutMsg.proc(mqttClient) then log.error("mqttTask.mqttOutMsg proc error") break end
  61. end
  62. end
  63. ready = false
  64. end
  65. --断开MQTT连接
  66. mqttClient:disconnect()
  67. sys.wait(5000)
  68. else
  69. --进入飞行模式,20秒之后,退出飞行模式
  70. net.switchFly(true)
  71. sys.wait(20000)
  72. net.switchFly(false)
  73. end
  74. end
  75. end
  76. )