main.lua 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "IOTCLOUD_TLINK"
  3. VERSION = "1.0.0"
  4. -- sys库是标配
  5. _G.sys = require("sys")
  6. --[[特别注意, 使用mqtt库需要下列语句]]
  7. _G.sysplus = require("sysplus")
  8. local iotcloud = require("iotcloud")
  9. -- TLINK平台设备序列号
  10. local serialNumber = "XXXXXXXXXXXXXX"
  11. -- TLINK平台登录账号
  12. local username = "XXXXXXXXXXXXXX"
  13. -- TLINK平台登录密码
  14. local password = "XXXXXXXXXXXXXX"
  15. -- TLINK平台添加的传感器ID
  16. local sensorsId = "XXXXXXXXXXXXXX"
  17. -- TLINK平台添加的传感器对应的TOPIC,iotcloud库会自动为设备订阅通配主题,用户只需判断报文是否来自该传感器的TOPIC即可
  18. local tlinkSubTopic = serialNumber .. "/" .. sensorsId
  19. -- 是否使用自动重连
  20. local autoReconnect = false
  21. local connectConfig = {
  22. keepalive = 60 -- mqtt心跳设置为60秒
  23. }
  24. -- 手动重连定时器ID
  25. local reconnectTimerId
  26. if autoReconnect then
  27. connectConfig.autoreconn = 3000 -- 云平台断开3秒后自动重连
  28. end
  29. -- TLINK平台switch类型传感器回传报文
  30. local function switchSensorPub(cloudc, switch)
  31. local tmp = {
  32. sensorDatas = {{
  33. sensorsId = sensorsId,
  34. switcher = switch
  35. }}
  36. }
  37. local payload = json.encode(tmp)
  38. log.info("回传的报文", payload)
  39. cloudc:publish(serialNumber, payload)
  40. end
  41. -- 将gpio27设置为输出模式,低电平,gpio27在开发板上控制的是蓝灯
  42. local ledCtrl = gpio.setup(27, 0)
  43. -- 订阅来自iotcloud库发布的消息主题
  44. sys.subscribe("iotcloud", function(cloudc, event, data, payload)
  45. -- 注意,此处不是协程内,复杂操作发消息给协程内进行处理
  46. if event == iotcloud.CONNECT then -- 云平台连上了
  47. if not autoReconnect then
  48. if reconnectTimerId and sys.timerIsActive(reconnectTimerId) then
  49. sys.timerStop(reconnectTimerId)
  50. end
  51. end
  52. log.info("TLINK 云平台连接成功")
  53. -- cloudc:subscribe("test") -- 可以自由订阅主题,详情可参考TLINK开发文档
  54. elseif event == iotcloud.RECEIVE then
  55. log.info("TLINK 发布消息", "topic", data, "payload", payload)
  56. -- 判断主题是否来自sensorsId的报文
  57. if data == tlinkSubTopic then
  58. -- json解析
  59. local userPayload, result, err = json.decode(payload)
  60. -- 防止异常的措施,防止json解析失败代码运行异常
  61. if result == 1 and userPayload and type(userPayload) == "table" then
  62. if userPayload.sensorDatas and userPayload.sensorDatas[1] then
  63. local switch = userPayload.sensorDatas[1].switcher
  64. -- 如果开关状态等于1,则打开蓝灯,否则关闭蓝灯
  65. if switch == 1 then
  66. ledCtrl(1)
  67. else
  68. ledCtrl(0)
  69. end
  70. -- 回传报文
  71. switchSensorPub(cloudc, switch)
  72. end
  73. end
  74. end
  75. elseif event == iotcloud.OTA then
  76. -- 用户处理代码
  77. -- TLINK 不会有这条消息上报,可忽略
  78. elseif event == iotcloud.DISCONNECT then -- 云平台断开了
  79. -- 用户处理代码
  80. log.info("云平台连接断开")
  81. if not autoReconnect then
  82. if reconnectTimerId and sys.timerIsActive(reconnectTimerId) then
  83. sys.timerStop(reconnectTimerId)
  84. end
  85. reconnectTimerId = sys.timerStart(function()
  86. cloudc:connect()
  87. end, 3000)
  88. end
  89. end
  90. end)
  91. sys.taskInit(function()
  92. -- 等待联网
  93. local result
  94. while true do
  95. log.info("等待联网")
  96. result = sys.waitUntil("IP_READY", 30000)
  97. if result then
  98. break
  99. end
  100. end
  101. log.info("联网成功")
  102. -- 创建TLINK云平台实例,在iotcloud TLINK平台中,device_name对应mqtt三元组的clientId,product_id对应mqtt三元组的username,product_secret对应mqtt三元组的password
  103. iotcloudc = iotcloud.new(iotcloud.TLINK, {
  104. device_name = serialNumber,
  105. produt_id = username,
  106. product_secret = password
  107. }, connectConfig)
  108. -- 创建成功,则连接,创建失败,就结束程序
  109. if iotcloudc then
  110. iotcloudc:connect()
  111. else
  112. log.error("iotcloud", "创建失败, 请检查参数")
  113. end
  114. end)
  115. -- 用户代码已结束---------------------------------------------
  116. -- 结尾总是这一句
  117. sys.run()
  118. -- sys.run()之后后面不要加任何语句!!!!!