main.lua 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "air302_aliyun_demo"
  3. VERSION = "1.0.0"
  4. -- 引入必要的库文件(lua编写), 内部库不需要require
  5. local sys = require "sys"
  6. local mqtt = require "mqtt"
  7. log.info("version", _VERSION, VERSION)
  8. --- UART 相关------------------------------
  9. -- 配置uart2, 115200 8 N 1
  10. uart.on(2, "receive", function(id, len)
  11. log.info("uart", "receive", uart.read(id, 1024))
  12. end)
  13. uart.setup(2, 115200)
  14. -- GPIO 和 PWM 相关 -------------------------------
  15. -- 网络灯 GPIO19/PWM5
  16. gpio.setup(19, 0) -- 初始化GPIO19, 并设置为低电平
  17. gpio.set(19, 1) -- 设置为高电平
  18. -- pwm.open(5, 1000, 50) -- 初始化PWM5, 频率1000hz, 占空比50%
  19. -- GPIO18/PWM4
  20. -- GPIO17/PWM3
  21. -- 低功耗sleep2模式下依然能输出电平的AON系列GPIO
  22. -- AON_GPIO2 --> GPIO22
  23. -- AON_GPIO3 --> GPIO23
  24. -- ADC相关---------------------------------------
  25. -- 通道 0-内部温度, 1-供电电压, 2-5 外部ADC管脚
  26. -- adc.open(5)
  27. -- adc.read(5)
  28. -- adc.close(5)
  29. -- 连接到阿里云物联网的Task
  30. sys.taskInit(function()
  31. sys.wait(2000)
  32. -- 阿里云物联网的设备信息
  33. -- https://help.aliyun.com/document_detail/73742.html?spm=a2c4g.11186623.6.593.11a22cf0rGX1bC
  34. -- deviceName 可以是imei, 也可以自定义, 填写正确才能连接上
  35. local productKey,deviceName,deviceSecret = "a1YFuY6OC1e","azNhIbNNTdsVwY2mhZno","5iRxTePbEMguOuZqltZrJBR0JjWJSdA7"
  36. local host, port, selfid = productKey .. ".iot-as-mqtt.cn-shanghai.aliyuncs.com", 1883, nbiot.imei()
  37. local mqttClientId = selfid .. "|securemode=3,signmethod=hmacsha1,timestamp=132323232|"
  38. local mqttUsername = deviceName .. "&" .. productKey
  39. local signstr = "clientId"..selfid.."deviceName"..deviceName.."productKey"..productKey.."timestamp".."132323232"
  40. local mqttPassword = crypto.hmac_sha1(signstr, deviceSecret)
  41. --log.info("aliiot", "mqttClientId", mqttClientId)
  42. --log.info("aliiot", "mqttUsername", mqttUsername)
  43. --log.info("aliiot", "signstr", signstr)
  44. --log.info("aliiot", "mqttPassword", mqttPassword)
  45. local topic_get = string.format("/%s/%s/user/get", productKey, deviceName)
  46. local topic_update = string.format("/%s/%s/user/update", productKey, deviceName)
  47. while true do
  48. -- 等待联网成功
  49. while not socket.isReady() do
  50. log.info("net", "wait for network ready")
  51. sys.waitUntil("NET_READY", 1000)
  52. end
  53. log.info("main", "net is ready!!")
  54. sys.wait(1000) -- 稍等一会
  55. -- 清理内存, 啊啊啊啊
  56. collectgarbage("collect")
  57. collectgarbage("collect")
  58. -- 开始连接到阿里云物联网
  59. local mqttc = mqtt.client(mqttClientId, 240, mqttUsername, mqttPassword)
  60. -- 等待底层tcp连接完成
  61. while not mqttc:connect(host, port) do sys.wait(15000) end
  62. -- 连接成功, 开始订阅
  63. log.info("mqttc", "mqtt seem ok", "try subscribe", topic_req)
  64. if mqttc:subscribe(topic_get) then
  65. -- 订阅完成, 发布业务数据
  66. log.info("mqttc", "mqtt subscribe ok", "try publish")
  67. if mqttc:publish(topic_update, "test publish " .. selfid, 1) then
  68. -- 发布也ok了, 等待数据下发或数据上传
  69. while true do
  70. log.info("mqttc", "wait for new msg")
  71. local r, data, param = mqttc:receive(120000, "pub_msg")
  72. log.info("mqttc", "mqttc:receive", r, data, param)
  73. if r then -- 有下发的数据
  74. log.info("mqttc", "get message from server", data.payload or "nil", data.topic)
  75. elseif data == "pub_msg" then -- 需要上报数据
  76. log.info("mqttc", "send message to server", data, param)
  77. mqttc:publish(topic_update, "response " .. param)
  78. elseif data == "timeout" then -- 无交互,发个定时report也行
  79. log.info("mqttc", "wait timeout, send custom report")
  80. mqttc:publish(topic_update, "test publish " .. os.date() .. nbiot.imei())
  81. else -- 其他情况不太可能,退出连接吧
  82. log.info("mqttc", "ok, something happen", "close connetion")
  83. break
  84. end
  85. end
  86. end
  87. end
  88. -- 关掉连接,清理资源
  89. mqttc:disconnect()
  90. -- 避免频繁重连, 必须加延时
  91. sys.wait(30000)
  92. end
  93. end)
  94. -- 用户代码已结束---------------------------------------------
  95. -- 结尾总是这一句
  96. sys.run()
  97. -- sys.run()之后后面不要加任何语句!!!!!