main.lua 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. --[[
  2. 这个代码对应公众号文档 https://mp.weixin.qq.com/s/ST_8Uej8R7qLUsikfh3Xtw
  3. 针对的硬件是 ESP32系列
  4. ]]
  5. PROJECT = "qcloud100"
  6. VERSION = "1.0.0"
  7. --测试支持硬件:ESP32C3/Air105/Air780E
  8. local sys = require "sys"
  9. require("sysplus")
  10. --[[
  11. 使用指南
  12. 1. 登录腾讯云 https://cloud.tencent.com/ 扫码登录
  13. 2. 访问物联网平台 https://console.cloud.tencent.com/iotexplorer
  14. 3. 进入公共实例, 如果没有就开通
  15. 4. 如果没有项目, 点"新建项目", 名字随意, 例如 luatos
  16. 5. 这时,新项目就好出现在列表里, 点击进去
  17. 6. 接下来, 点"新建产品", 产品名称随意(例如abc), 品类选自定义品类, 通信方式选4G或者Wifi,认证方式选择密钥认证,数据协议选物模型
  18. 7. 左侧菜单, 选"设备管理", "添加设备", 产品选刚刚建好的, 输入一个英文的设备名称, 例如 abcdf, 确定后新设备出现在列表里
  19. 8. 点击该设备的"查看", 就能看到详情的信息, 逐个填好
  20. 9. 如果是wifi设备, 在当前文件搜索ssid,填好wifi名称和密码
  21. 10. 接下来刷机, 不懂刷机就到 wiki.luatos.com 看视频
  22. 补充说明, 物模型的设置:
  23. 1. 左侧菜单, "产品开发", 然后点之前建好的项目
  24. 2. 页面往下拉到底, 选择"新建自定义功能"
  25. 3. 为了跑通这个本例子, 需要新建3个属性, 对着界面逐个添加
  26. |功能类型|功能名称|标识符 |数据类型|取值范围 |
  27. |属性 |LED灯 |power_switch|布尔型 |不用选 |
  28. |属性 |电压 |vbat |整型 | -1, 100000|
  29. |属性 |温度 |temp |整型 | -1, 100000|
  30. 不要输入"|",那是分割符
  31. ]]
  32. product_key = "K7NURKF5J3" -- 产品ID, 一串英文字母,填前面的双引号以内
  33. device_id = "abcdf" -- 设备名称, 一定要改成自己的数据
  34. device_secret = "ChhVXLtSPiTKFzGatB80Jw==" -- 设备密钥
  35. sub_topic = "$thing/down/property/" .. product_key .. "/".. device_id
  36. pub_topic = "$thing/up/property/" .. product_key .. "/".. device_id
  37. adc.open(adc.CH_VBAT)
  38. adc.open(adc.CH_CPU)
  39. function on_btn()
  40. log.info("btn", "按键触发")
  41. -- 按一次, 上报一次电压值
  42. -- 格式参考 https://cloud.tencent.com/document/product/1081/34916
  43. if mqttc and mqttc:ready() then
  44. local data = {
  45. method = "report",
  46. clientToken = "123",
  47. params = {
  48. vbat = adc.get(adc.CH_VBAT), -- 读取电压值
  49. temp = adc.get(adc.CH_CPU)
  50. -- 如果新建更多物模型的属性, 这里可以继续填,注意格式,尤其是逗号
  51. }
  52. }
  53. local jdata = (json.encode(data))
  54. log.info("准备上传数据", jdata)
  55. -- 可以直接调用mqttc对象进行上报
  56. -- mqttc:publish(pub_topic, (json.encode(data)), 1)
  57. -- 也可以通过消息机制,传递到sys.waitUntil("mqtt_pub", 30000)语句进行间接上报
  58. sys.publish("mqtt_pub", pub_topic, jdata, 1)
  59. end
  60. end
  61. sys.taskInit(function()
  62. -- 统一联网函数
  63. if wlan and wlan.connect then -- ESP32系列, C3/S3都可以
  64. if rtos.bsp():startsWith("ESP32") then
  65. LED = gpio.setup(12, 0, gpio.PULLUP) -- 控制的灯对应的GPIO号
  66. gpio.debounce(9, 100, 1)
  67. BTN = gpio.setup(9, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
  68. else
  69. -- air101/air103,内测用
  70. LED = gpio.setup(pin.PB09, 0, gpio.PULLUP) -- 控制的灯对应的GPIO号
  71. gpio.debounce(pin.PA0, 100, 1)
  72. BTN = gpio.setup(pin.PA0, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
  73. end
  74. wlan.init()
  75. --
  76. -- ESP32系列, 这里要填wifi的名称和密码. 只支持2.4G频段
  77. --
  78. local ssid, password = "luatos1234", "12341234"
  79. wlan.setMode(wlan.STATION)
  80. wlan.connect(ssid, password, 1)
  81. elseif rtos.bsp() == "AIR105" then -- Air105走网卡,W5500
  82. w5500.init(spi.HSPI_0, 24000000, pin.PC14, pin.PC01, pin.PC00)
  83. w5500.config() --默认是DHCP模式
  84. w5500.bind(socket.ETH0)
  85. -- LED = gpio.setup(62, 0, gpio.PULLUP)
  86. gpio.debounce(pin.PA10, 100, 1)
  87. BTN = gpio.setup(pin.PA10, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
  88. sys.wait(1000)
  89. elseif mobile then -- Air780E,走4G一堆网络
  90. -- mobile.simid(2) -- 自动选卡, 如果不清楚在哪个卡槽,就取消注释
  91. -- LED = gpio.setup(27, 0, gpio.PULLUP)
  92. gpio.debounce(0, 100, 1)
  93. BTN = gpio.setup(0, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
  94. else
  95. while 1 do
  96. sys.wait(1000)
  97. log.info("bsp", "未支持的模块", rtos.bsp())
  98. end
  99. end
  100. log.info("等待联网")
  101. local result, data = sys.waitUntil("IP_READY")
  102. log.info("wlan", "IP_READY", result, data)
  103. log.info("联网成功")
  104. sys.publish("net_ready")
  105. end)
  106. sys.taskInit(function()
  107. sys.waitUntil("net_ready")
  108. -- 往下就是连接到腾讯云了
  109. local client_id, user_name, password = iotauth.qcloud(product_key, device_id, device_secret, "sha1")
  110. log.info("mqtt参数", client_id, user_name, password)
  111. -- MQTT参数准备好了,开始连接,并监听数据下发
  112. mqttc = mqtt.create(nil, product_key .. ".iotcloud.tencentdevices.com", 1883)
  113. mqttc:auth(client_id, user_name, password)
  114. mqttc:keepalive(240) -- 默认值240s
  115. mqttc:autoreconn(true, 3000) -- 自动重连机制
  116. mqttc:on(
  117. function(mqtt_client, event, data, payload)
  118. if event == "conack"then
  119. -- 连上了,鉴权也ok
  120. sys.publish("mqtt_conack")
  121. log.info("mqtt", "mqtt已连接")
  122. mqtt_client:subscribe(sub_topic)
  123. elseif event == "recv" then
  124. log.info("mqtt", "收到消息", data, payload)
  125. local json = json.decode(payload)
  126. if json.method == "control" then
  127. if json.params.power_switch == 1 then
  128. LED(1)
  129. elseif json.params.power_switch == 0 then
  130. LED(0)
  131. end
  132. end
  133. elseif event == "sent"then
  134. log.info("mqtt", "sent", "pkgid", data)
  135. end
  136. end
  137. )
  138. mqttc:connect()
  139. --sys.wait(1000)
  140. sys.waitUntil("mqtt_conack")
  141. while true do
  142. local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000)
  143. if ret then
  144. if topic == "close" then
  145. break
  146. end
  147. mqttc:publish(topic, data, qos)
  148. end
  149. end
  150. mqttc:close()
  151. mqttc = nil
  152. end)
  153. -- 用户代码已结束---------------------------------------------
  154. -- 结尾总是这一句
  155. sys.run()
  156. -- sys.run()之后后面不要加任何语句!!!!!