Quellcode durchsuchen

update: 进一步完善script/turnkey/qcloud100

Wendal Chen vor 2 Jahren
Ursprung
Commit
294689393d
1 geänderte Dateien mit 90 neuen und 14 gelöschten Zeilen
  1. 90 14
      script/turnkey/qcloud100_switch/main.lua

+ 90 - 14
script/turnkey/qcloud100_switch/main.lua

@@ -12,46 +12,120 @@ VERSION = "1.0.0"
 local sys = require "sys"
 require("sysplus")
 
+--[[
+使用指南
+1. 登录腾讯云 https://cloud.tencent.com/ 扫码登录
+2. 访问物联网平台 https://console.cloud.tencent.com/iotexplorer
+3. 进入公共实例, 如果没有就开通
+4. 如果没有项目, 点"新建项目", 名字随意, 例如 luatos
+5. 这时,新项目就好出现在列表里, 点击进去
+6. 接下来, 点"新建产品", 产品名称随意(例如abc), 品类选自定义品类, 通信方式选4G或者Wifi,认证方式选择密钥认证,数据协议选物模型
+7. 左侧菜单, 选"设备管理", "添加设备", 产品选刚刚建好的, 输入一个英文的设备名称, 例如 abcdf, 确定后新设备出现在列表里
+8. 点击该设备的"查看", 就能看到详情的信息, 逐个填好
+9. 如果是wifi设备, 在当前文件搜索ssid,填好wifi名称和密码
+10. 接下来刷机, 不懂刷机就到 wiki.luatos.com 看视频
+
+补充说明, 物模型的设置:
+1. 左侧菜单, "产品开发", 然后点之前建好的项目
+2. 页面往下拉到底, 选择"新建自定义功能"
+3. 为了跑通这个本例子, 需要新建3个属性, 对着界面逐个添加
+   |功能类型|功能名称|标识符       |数据类型|取值范围    |
+   |属性    |LED灯   |power_switch|布尔型  |不用选     |
+   |属性    |电压    |vbat        |整型    | -1, 100000|
+   |属性    |温度    |temp        |整型    | -1, 100000|
+
+不要输入"|",那是分割符
+]]
+product_key = "K7NURKF5J3" -- 产品ID, 一串英文字母,填前面的双引号以内
+device_id = "abcdf" -- 设备名称, 一定要改成自己的数据
+device_secret = "ChhVXLtSPiTKFzGatB80Jw==" -- 设备密钥
+
+
+sub_topic = "$thing/down/property/" .. product_key .. "/".. device_id
+pub_topic = "$thing/up/property/" .. product_key .. "/".. device_id
+
+adc.open(adc.CH_VBAT)
+adc.open(adc.CH_CPU)
+
+function on_btn()
+    log.info("btn", "按键触发")
+    -- 按一次, 上报一次电压值
+    -- 格式参考 https://cloud.tencent.com/document/product/1081/34916
+    if mqttc and mqttc:ready() then
+        
+        local data = {
+            method = "report",
+            clientToken = "123",
+            params = {
+                vbat = adc.get(adc.CH_VBAT), -- 读取电压值
+                temp = adc.get(adc.CH_CPU)
+                -- 如果新建更多物模型的属性, 这里可以继续填,注意格式,尤其是逗号
+            }
+        }
+        local jdata = (json.encode(data))
+        log.info("准备上传数据", jdata)
+        -- 可以直接调用mqttc对象进行上报
+        -- mqttc:publish(pub_topic, (json.encode(data)), 1)
+        -- 也可以通过消息机制,传递到sys.waitUntil("mqtt_pub", 30000)语句进行间接上报
+        sys.publish("mqtt_pub", pub_topic, jdata, 1)
+    end
+end
+
 sys.taskInit(function()
     -- 统一联网函数
-    if rtos.bsp():startsWith("ESP32") then -- ESP32系列, C3/S3都可以
-        LED = gpio.setup(12, 0, gpio.PULLUP) -- 控制的灯对应的GPIO号
+    if wlan and wlan.connect then -- ESP32系列, C3/S3都可以
+        if rtos.bsp():startsWith("ESP32") then
+            LED = gpio.setup(12, 0, gpio.PULLUP) -- 控制的灯对应的GPIO号
+            gpio.debounce(9, 100, 1)
+            BTN = gpio.setup(9, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
+        else
+            -- air101/air103,内测用
+            LED = gpio.setup(pin.PB09, 0, gpio.PULLUP) -- 控制的灯对应的GPIO号
+            gpio.debounce(pin.PA0, 100, 1)
+            BTN = gpio.setup(pin.PA0, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
+        end
         wlan.init()
         --
         -- ESP32系列, 这里要填wifi的名称和密码. 只支持2.4G频段
         --
-        local ssid, password = "wifi的名字", "wifi的密码"
+        local ssid, password = "uiot", "12345678"
         wlan.setMode(wlan.STATION)
         wlan.connect(ssid, password, 1)
-        local result, data = sys.waitUntil("IP_READY")
-        log.info("wlan", "IP_READY", result, data)
     elseif rtos.bsp() == "AIR105" then -- Air105走网卡,W5500
         w5500.init(spi.HSPI_0, 24000000, pin.PC14, pin.PC01, pin.PC00)
         w5500.config() --默认是DHCP模式
         w5500.bind(socket.ETH0)
         LED = gpio.setup(62, 0, gpio.PULLUP)
+        gpio.debounce(pin.PA10, 100, 1)
+        BTN = gpio.setup(pin.PA10, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
         sys.wait(1000)
     elseif rtos.bsp() == "EC618" then -- Air780E,走4G一堆网络
         -- mobile.simid(2) -- 自动选卡, 如果不清楚在哪个卡槽,就取消注释
         LED = gpio.setup(27, 0, gpio.PULLUP)
-        sys.waitUntil("IP_READY") -- 等联网就行,要插卡的
-        log.info("mobile", "IP_READY", mobile.imei(), mobile.iccid())
+        gpio.debounce(0, 100, 1)
+        BTN = gpio.setup(0, on_btn, gpio.PULLUP, gpio.FALLING) -- BOOT按键当按钮用
     else
         while 1 do 
             sys.wait(1000)
             log.info("bsp", "未支持的模块", rtos.bsp())
         end
     end
+    log.info("等待联网")
+    local result, data = sys.waitUntil("IP_READY")
+    log.info("wlan", "IP_READY", result, data)
+    log.info("联网成功")
+    sys.publish("net_ready")
+end)
 
-    -- 往下就是连接到腾讯云了, 下面3个参数要改成自己的值, 到腾讯云上建项目建设备才有的
-    local product_key = "产品id" -- 一串英文字母,填前面的双引号以内
-    local device_id = "设备名称" -- 一定要改成自己的数据
-    local device_secret = "设备密钥" -- 设备密钥
-    local client_id, user_name, password = iotauth.qcloud(product_key, device_id, device_secret, "sha1", 1700561166)
+sys.taskInit(function()
+    sys.waitUntil("net_ready")
+    -- 往下就是连接到腾讯云了
+
+    local client_id, user_name, password = iotauth.qcloud(product_key, device_id, device_secret, "sha1")
     log.info("mqtt参数", client_id, user_name, password)
 
     -- MQTT参数准备好了,开始连接,并监听数据下发
-    local mqttc = mqtt.create(nil, product_key .. ".iotcloud.tencentdevices.com", 1883)
+    mqttc = mqtt.create(nil, product_key .. ".iotcloud.tencentdevices.com", 1883)
     mqttc:auth(client_id, user_name, password)
     mqttc:keepalive(240) -- 默认值240s
     mqttc:autoreconn(true, 3000) -- 自动重连机制
@@ -61,7 +135,7 @@ sys.taskInit(function()
                 -- 连上了,鉴权也ok
                 sys.publish("mqtt_conack")
                 log.info("mqtt", "mqtt已连接")
-                mqtt_client:subscribe("$thing/down/property/" .. product_key .. "/".. device_id)
+                mqtt_client:subscribe(sub_topic)
             elseif event == "recv" then
                 log.info("mqtt", "收到消息", data, payload)
                 local json = json.decode(payload)
@@ -93,6 +167,8 @@ sys.taskInit(function()
     mqttc = nil
 end)
 
+
+
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句
 sys.run()