main.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. --[[
  2. demo说明:
  3. 1. 演示wifi联网操作
  4. 2. 演示长连接操作
  5. 3. 演示简易的网络状态灯
  6. ]]
  7. -- LuaTools需要PROJECT和VERSION这两个信息
  8. PROJECT = "mqttdemo"
  9. VERSION = "1.0.0"
  10. -- 引入必要的库文件(lua编写), 内部库不需要require
  11. _G.sys = require("sys")
  12. _G.mqtt = require("mqtt")
  13. _G.mine = require("my_demo")
  14. log.info("main", "simple mqtt demo")
  15. -- //////////////////////////////////////////////////////////////////////////////////////
  16. -- wifi 相关的代码
  17. if wlan ~= nil then
  18. log.info("mac", wlan.get_mac())
  19. local ssid = mine.wifi_ssid
  20. local password = mine.wifi_passwd
  21. -- 方式1 直接连接, 简单快捷
  22. wlan.connect(ssid, password) -- 直接连
  23. -- 方式2 先扫描,再连接. 例如根据rssi(信号强度)的不同, 择优选择ssid
  24. -- sys.taskInit(function()
  25. -- wlan.scan()
  26. -- sys.waitUntil("WLAN_SCAN_DONE", 30000)
  27. -- local re = wlan.scan_get_info()
  28. -- log.info("wlan", "scan done", #re)
  29. -- for i in ipairs(re) do
  30. -- log.info("wlan", "info", re[i].ssid, re[i].rssi)
  31. -- end
  32. -- log.info("wlan", "try connect to wifi")
  33. -- wlan.connect(ssid, password)
  34. -- sys.waitUntil("WLAN_READY", 15000)
  35. -- log.info("wifi", "self ip", socket.ip())
  36. -- end)
  37. -- 方法3 airkiss配网, 可参考 app/playit/main.lua
  38. end
  39. -- airkiss.auto(27) -- 预留的功能,未完成
  40. -- //////////////////////////////////////////////////////////////////////////////////////
  41. --- 从这里开始, 代码与具体网络无关
  42. -- 联网后自动同步时间
  43. sys.subscribe("NET_READY", function ()
  44. log.info("net", "!!! network ready event !!! send ntp")
  45. sys.taskInit(function()
  46. sys.wait(2000)
  47. socket.ntpSync()
  48. end)
  49. end)
  50. gpio.setup(21, 0)
  51. _G.use_netled = 1 -- 启用1, 关闭0
  52. sys.taskInit(function()
  53. while 1 do
  54. --log.info("wlan", "ready?", wlan.ready())
  55. if socket.isReady() then
  56. --log.info("netled", "net ready, slow")
  57. gpio.set(21, 1 * use_netled)
  58. sys.wait(1900)
  59. gpio.set(21, 0)
  60. sys.wait(100)
  61. else
  62. --log.info("netled", "net not ready, fast")
  63. gpio.set(21, 1 * use_netled)
  64. sys.wait(100)
  65. gpio.set(21, 0)
  66. sys.wait(100)
  67. end
  68. end
  69. end)
  70. sys.taskInit(function()
  71. local host, port, selfid = "lbsmqtt.airm2m.com", 1884, wlan.getMac():lower()
  72. -- 等待联网成功
  73. while true do
  74. while not socket.isReady() do
  75. log.info("net", "wait for network ready")
  76. sys.waitUntil("NET_READY", 1000)
  77. end
  78. log.info("main", "mqtt loop")
  79. collectgarbage("collect")
  80. collectgarbage("collect")
  81. local mqttc = mqtt.client(wlan.getMac(), nil, nil, false)
  82. while not mqttc:connect(host, port) do sys.wait(2000) end
  83. local topic_req = string.format("/device/%s/req", selfid)
  84. local topic_report = string.format("/device/%s/report", selfid)
  85. local topic_resp = string.format("/device/%s/resp", selfid)
  86. log.info("mqttc", "mqtt seem ok", "try subscribe", topic_req)
  87. if mqttc:subscribe(topic_req) then
  88. log.info("mqttc", "mqtt subscribe ok", "try publish")
  89. if mqttc:publish(topic_report, "test publish " .. os.time(), 1) then
  90. while true do
  91. log.info("mqttc", "wait for new msg")
  92. local r, data, param = mqttc:receive(120000, "pub_msg")
  93. log.info("mqttc", "mqttc:receive", r, data, param)
  94. if r then
  95. log.info("mqttc", "get message from server", data.payload or "nil", data.topic)
  96. elseif data == "pub_msg" then
  97. log.info("mqttc", "send message to server", data, param)
  98. mqttc:publish(topic_resp, "response " .. param)
  99. elseif data == "timeout" then
  100. log.info("mqttc", "wait timeout, send custom report")
  101. mqttc:publish(topic_report, "test publish " .. os.time() .. wlan.getMac())
  102. else
  103. log.info("mqttc", "ok, something happen", "close connetion")
  104. break
  105. end
  106. end
  107. end
  108. end
  109. mqttc:disconnect()
  110. sys.wait(5000)
  111. end
  112. end)
  113. -- 用户代码已结束---------------------------------------------
  114. -- 结尾总是这一句
  115. sys.run()
  116. -- sys.run()之后后面不要加任何语句!!!!!