Просмотр исходного кода

update: onenetcoap库测试可用

Wendal Chen 2 лет назад
Родитель
Сommit
5e21b49f1b
2 измененных файлов с 124 добавлено и 6 удалено
  1. 109 0
      demo/onenet/coap/main.lua
  2. 15 6
      script/libs/onenetcoap.lua

+ 109 - 0
demo/onenet/coap/main.lua

@@ -0,0 +1,109 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "onenetdemo"
+VERSION = "1.0.0"
+
+--[[
+本demo演示的是 OneNet Studio, 注意区分
+https://open.iot.10086.cn/studio/summary
+https://open.iot.10086.cn/doc/v5/develop/detail/iot_platform
+
+本demo演示的是coap方式
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+
+local onenetcoap = require("onenetcoap")
+
+-- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
+if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
+    pm.power(pm.PWK_MODE, false)
+end
+
+
+sys.taskInit(function()
+    -----------------------------
+    -- 统一联网函数, 可自行删减
+    ----------------------------
+    if wlan and wlan.connect then
+        -- wifi 联网, ESP32系列均支持
+        local ssid = "luatos1234"
+        local password = "12341234"
+        log.info("wifi", ssid, password)
+        -- TODO 改成esptouch配网
+        -- LED = gpio.setup(12, 0, gpio.PULLUP)
+        wlan.init()
+        wlan.setMode(wlan.STATION)
+        wlan.connect(ssid, password, 1)
+        local result, data = sys.waitUntil("IP_READY", 30000)
+        log.info("wlan", "IP_READY", result, data)
+        device_id = wlan.getMac()
+    elseif rtos.bsp() == "AIR105" then
+        -- w5500 以太网, 当前仅Air105支持
+        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)
+        sys.wait(1000)
+        -- TODO 获取mac地址作为device_id
+    elseif mobile then
+        -- Air780E/Air600E系列
+        --mobile.simid(2)
+        -- LED = gpio.setup(27, 0, gpio.PULLUP)
+        device_id = mobile.imei()
+        log.info("ipv6", mobile.ipv6(true))
+        sys.waitUntil("IP_READY", 30000)
+    elseif http then
+        sys.waitUntil("IP_READY")
+    else
+        while 1 do
+            sys.wait(1000)
+            log.info("http", "当前固件未包含http库")
+        end
+    end
+    log.info("已联网")
+    sys.publish("net_ready")
+end)
+
+
+
+sys.taskInit(function()
+    sys.waitUntil("net_ready")
+    socket.sntp()
+    sys.waitUntil("NTP_UPDATE", 1000)
+    -- 设备信息, 要按实际情况填
+    local dev = {
+        product_id = "SJaLt5cVL2",
+        device_name = "luatospc",
+        device_key = "dUZVVWRIcjVsV2pSbTJsckd0TmgyRXNnMTJWMXhIMkk=",
+        debug = false
+    }
+    if onenetcoap.setup(dev) then
+        onenetcoap.start()
+    else
+        log.error("配置失败")
+    end
+end)
+
+sys.taskInit(function()
+    sys.waitUntil("net_ready")
+    while 1 do
+        -- 模拟定时上行数据
+        sys.wait(5000)
+        local post = {
+            id = "123",
+            params = {
+                WaterMeterState = {
+                    value = 0
+                }
+            }
+        }
+        -- 这里走的是物模型
+        onenetcoap.uplink("thing/property/post", post)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 15 - 6
script/libs/onenetcoap.lua

@@ -4,9 +4,10 @@
 @version 1.0
 @date    2023.11.17
 @author  wendal
+@demo    onenet/coap
 @tag LUAT_USE_NETWORK
 @usage
--- 开发中,未可用
+-- 使用方法请查阅demo
 ]]
 
 
@@ -37,16 +38,21 @@ function onenet.setup(conf)
     end
     if not conf.product_id then
         log.error(TAG, "配置信息缺product_id")
+        return
     end
     if not conf.device_name then
         log.error(TAG, "配置信息缺device_name")
+        return
     end
     if not conf.device_key then
         log.error(TAG, "配置信息缺device_key")
+        return
     end
     onenet.product_id = conf.product_id
     onenet.device_name = conf.device_name
-    onenet.login_token = iotauth.onenet(onenet.product_id, onenet.device_name, conf.device_key)
+    -- log.info(">>", onenet.product_id, onenet.device_name, conf.device_key)
+    _, _, onenet.login_token = iotauth.onenet(onenet.product_id, onenet.device_name, conf.device_key, "sha1")
+    -- log.info("onenet.login_token", onenet.login_token)
 
     onenet.host = conf.host or "183.230.102.122"
     onenet.port = conf.port or 5683
@@ -78,7 +84,7 @@ function onenet.netc_cb(sc, event)
             ercoap.print(data)
             local resp = ercoap.parse(data)
             if resp and resp.code == 201 then
-                log.info(TAg, "login success", resp.code, resp.payload:toHex())
+                log.info(TAG, "login success", resp.code, resp.payload:toHex())
                 -- 这里非常重要, 获取其他请求所需要的token值
                 onenet.post_token = resp.payload
                 onenet.state = 2
@@ -101,7 +107,8 @@ function onenet.netc_cb(sc, event)
     elseif event == socket.ON_LINE then
         log.info(TAG, "UDP已准备就绪,可以上行")
         -- 上行登陆包
-        local data = ercoap.onenet("login", onenet.produt_id, onenet.device_name, onenet.login_token)
+        -- log.info("登陆参数", onenet.product_id, onenet.device_name, onenet.login_token)
+        local data = ercoap.onenet("login", onenet.product_id, onenet.device_name, onenet.login_token)
         -- log.info("上行登陆包", data:toHex())
         socket.tx(sc, data)
     else
@@ -163,8 +170,10 @@ function onenet.uplink(tp, payload)
     if type(payload) == "table" then
         payload = json.encode(payload, "7f")
     end
-    local tmp = ercoap.onenet(tp, onenet.product_id, onenet.device_name, payload)
-    socket.tx(netc, tmp)
+    -- log.info("uplink", onenet.product_id, onenet.device_name, onenet.post_token:toHex(), payload)
+    local tmp = ercoap.onenet(tp, onenet.product_id, onenet.device_name, onenet.post_token, payload)
+    -- log.info("uplink", tp, tmp:toHex())
+    socket.tx(onenet.netc, tmp)
     return true
 end