main.lua 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "mqttdemo"
  3. VERSION = "1.0.0"
  4. -- sys库是标配
  5. _G.sys = require("sys")
  6. --[[特别注意, 使用mqtt库需要下列语句]]
  7. _G.sysplus = require("sysplus")
  8. -- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
  9. if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
  10. pm.power(pm.PWK_MODE, false)
  11. end
  12. --根据自己的服务器修改以下参数
  13. local mqtt_host = "lbsmqtt.airm2m.com"
  14. local mqtt_port = 1884
  15. local mqtt_isssl = false
  16. local client_id = "mqttx_b55c41b7"
  17. local user_name = "user"
  18. local password = "password"
  19. local mqttc = nil
  20. sys.taskInit(function()
  21. -- 等待联网
  22. sys.waitUntil("IP_READY")
  23. -- 获取设备的imei号
  24. local device_id = mcu.unique_id():toHex()
  25. -- 下面的是mqtt的参数均可自行修改
  26. client_id = device_id
  27. pub_topic = "/luatos/pub/" .. device_id
  28. sub_topic = "/luatos/sub/" .. device_id
  29. -- 打印一下上报(pub)和下发(sub)的topic名称
  30. log.info("mqtt", "pub", pub_topic)
  31. log.info("mqtt", "sub", sub_topic)
  32. --[[
  33. @param1 适配器序号,不填会选择平台自带的
  34. @param2 服务器地址,域名或ip都可
  35. @param3 端口号
  36. @param4 是否为ssl加密连接
  37. @param5 是否为ipv6
  38. ]]
  39. mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file)
  40. --[[配置mqtt连接服务器的参数
  41. @param1 设备id
  42. @param2 账号[可选]
  43. @param3 密码[可选]
  44. @param4 清除session,默认true[可选]
  45. ]]
  46. mqttc:auth(client_id,user_name,password) -- client_id必填,其余选填
  47. --设置心跳
  48. -- mqttc:keepalive(240) -- 默认值240s
  49. --[[
  50. @param1 是否自动重连
  51. @param2 自动重连机制,单位ms
  52. ]]
  53. mqttc:autoreconn(true, 3000) -- 自动重连机制
  54. --[[mqtt事件回调函数,其中事件包括
  55. conack:连接成功事件。
  56. recv:接收服务器下发数据的事件
  57. sent:发送完成事件
  58. disconnect:断开连接事件
  59. ]]
  60. --[[回调函数参数:@param1 mqtt的句柄
  61. @param2 事件
  62. @param3
  63. ]]
  64. mqttc:on(function(mqtt_client, event, data, payload)
  65. -- 用户自定义代码
  66. log.info("mqtt", "event", event, mqtt_client, data, payload)
  67. if event == "conack" then
  68. -- mqtt连接上服务器后,发布一条消息。订阅一个mqtt主题
  69. sys.publish("mqtt_conack")
  70. mqtt_client:subscribe(sub_topic)--单主题订阅
  71. -- mqtt_client:subscribe({[topic1]=1,[topic2]=1,[topic3]=1})--多主题订阅
  72. elseif event == "recv" then
  73. log.info("mqtt", "downlink", "topic", data, "payload", payload)
  74. elseif event == "sent" then
  75. end
  76. end)
  77. -- mqttc自动处理重连, 除非自行关闭
  78. mqttc:connect()
  79. --等待连接成功
  80. sys.waitUntil("mqtt_conack")
  81. while true do
  82. -- 演示等待其他task发送过来的上报信息
  83. local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 300000)
  84. if ret then
  85. -- 当接收到的tpoic是字符串close时,就跳出等待其他task发过来的上报消息的循环
  86. if topic == "close" then break end
  87. mqttc:publish(topic, data, qos)
  88. end
  89. end
  90. --跳出等待上报消息的循环后,就关闭close
  91. mqttc:close()
  92. --删除创建的mqtt实例
  93. mqttc = nil
  94. end)
  95. -- 定时上报数据演示
  96. sys.taskInit(function()
  97. sys.wait(3000)
  98. local data = "123test,"
  99. local qos = 0 -- QOS0不带puback, QOS1是带puback的
  100. while true do
  101. sys.wait(3000)
  102. --如果mqttc实例存在,并且mqtt客户端就绪
  103. if mqttc and mqttc:ready() then
  104. --发布一个mqtt消息,这个消息的订阅,在mqtt服务器上
  105. local pkgid = mqttc:publish(pub_topic, data .. os.date(), qos)
  106. end
  107. end
  108. end)
  109. -- 用户代码已结束---------------------------------------------
  110. -- 结尾总是这一句
  111. sys.run()
  112. -- sys.run()之后后面不要加任何语句!!!!!