多協議接入 產品介紹 快速入門 用戶指南 開發指南
EDP TCP透傳 MQTT Modbus HTTP
常見問題

開發流程

Step1 創建產品,選擇TCP透傳

首先你需要在平台完成帳號註冊,並創建一個TCP透傳的產品

Step2 創建設備,記錄設備ID等信息

通過頁面點擊添加設備,輸入設備名稱和鑒權信息(即設備編號),並記錄下該設備編號.

Step3 上載Lua腳本

通過頁面上載解析腳本到產品下,如下圖所示: pic

pic

腳本示例:

腳本實現了如下功能:

  • 設備連接後每5秒下發一次“hello”
  • 用戶上載數據後,平台回復“received”
  • 將用戶上載的數據轉換為HEX字串並作為數據點存儲至ds_test數據流

```lua

-- 使用說明: -- -- V1.3 -- -- 用戶需要自行完成以下2個函數的實現 -- -- 1、定時下發數據任務初始化函數:device_timer_init(dev)【可選】 --

-- 2、對設備上傳數據進行解析(包括心跳等):device_data_analyze(dev) --


-- 註冊C函數 -- -- u2f 將32位元整型記憶體數據轉換為浮點數(不同於值轉換) -- -- 類似C代碼 (float)(&u) -- -- function u2f(u) -- -- @param u number 整数值 -- -- @return 成功返回浮點數值,否則返回nil -- -- @example local u = 123 -- -- local f = u2f( 123 ) --


-- time 獲取時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- function time() -- -- @return 返回當前時間戳記 -- -- @example local t = time() --


-- year 獲取年(year-1900) -- -- function year(t) -- -- @param t number 時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- @return 返回年 -- -- @example local y = year( t ) --


-- month 獲取月(0-11) -- -- function month(t) -- -- @param t number 時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- @return 返回月 -- -- @example local m = month( t ) --


-- day 獲取日(1-31) -- -- function day(t) -- -- @param t number 時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- @return 返回月 -- -- @example local d = day( t ) --


-- hour 獲取時(0-23) -- -- function hour(t) -- -- @param t number 時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- @return 返回時 -- -- @example local h = hour( t ) --


-- minute 獲取分(0-59) -- -- function minute(t) -- -- @param t number 時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- @return 返回分 -- -- @example local m = minute( t ) --


-- second 獲取秒(0-59) -- -- function second(t) -- -- @param t number 時間戳記,距離(00:00:00 UTC, January 1, 1970)的秒數 -- -- @return 返回秒 --

-- @example local m = second( t ) --


-- 將bytes string轉換hex string -- -- @param s string bytes string -- -- @return 返回hex string,類似"0A0B0C0D..." --

-- @example local hex = to_hex("\2\2\0\150\0\37\206") --

function to_hex(s) local i local t

    t={s:byte(1,s:len())}
    for i=1,#t do
            t[i]=string.format('%02X',t[i])
    end

    return table.concat(t)

end


-- 將object序列化成字串 -- -- @param o boolean|number|string|table -- -- @return 返回序列化string --

-- @example local str = to_str({x=100}) --

function to_str(o) local i=1 local t={} local f

    f=function(x)
            local y=type(x)
            if y=="number" then
                    t[i]=x
                    i=i+1
            elseif y=="boolean" then
                    t[i]=tostring(x)
                    i=i+1
            elseif y=="string" then
                    t[i]="\""
                    t[i+1]=x
                    t[i+2]="\""
                    i=i+3
            elseif y=="table" then
                    t[i]="{"
                    i=i+1

                    local z=true
                    for k,v in pairs(x) do
                            if z then
                                    z=false
                                    t[i]="\""
                                    t[i+1]=k
                                    t[i+2]="\""
                                    t[i+3]=":"
                                    i=i+4
                                    f(v)
                            else
                                    t[i]=","
                                    t[i+1]="\""
                                    t[i+2]=k
                                    t[i+3]="\""
                                    t[i+4]=":"
                                    i=i+5
                                    f(v)
                            end
                    end

                    t[i]="}"
                    i=i+1
            else
                    t[i]="nil"
                    i=i+1
            end
    end
    f(o)

    return table.concat(t)

end


-- 添加值數據點到table中 -- -- @param t table -- -- i string 數據流或數據流範本名稱 -- -- a number 毫秒級時間戳記,距離(00:00:00 UTC, January 1, 1970)的毫秒; -- -- 如果值為0,表示使用當前時間 -- -- v boolean|number|string|table 布林值、數值、字串、json -- -- c string 用於標識數據點歸屬(設備AuthCode,可選) -- -- 如果值為“”或nil,表示數據點歸屬建立TCP連接的設備 -- -- @return 成功返回true,否則返回false --

-- @example local ok = add_val(t,"dsname",0,100) --

function add_val(t, i, a, v, c) if type(t)~="table" then return false elseif type(i)~="string" then return false elseif type(a)~="number" then return false else local o = type(v) if o~="boolean" and o~="number" and o~="string" and o~="table" then return false end

            local n = {i=i,v=to_hex(v)}

-- n.v = n.v .. "("..o..")" if a~=0 and a~=nil then n["a"]=a end if c~=nil then n["c"]=c end

            -- list push_back --
            if t.h==nil then
                    t.h={nil,n}
                    t.t=t.h
            else
                    t.t[1]={nil,n}
                    t.t=t.t[1]
            end
    end

    return true

end


-- 將table序列化成json字符串 -- -- @param t table 通過add_val、add_bin構建起來的table -- -- @return 返回序列化json字串 --

-- @example local json = to_json(t) --

function to_json(t) local i=1 local o={} local n

    o[i]="["
    i=i+1
    n=t.h
    while n~=nil do
            if n[2]~=nil then
                    o[i]=to_str(n[2])
                    i=i+1
            end

            n=n[1]
            if n~=nil then
                    o[i]=","
                    i=i+1
            end
    end
    o[i]="]"

    return table.concat(o)

end


-- begin-添加用戶自訂值或函數等 --

-- end-添加用戶自訂值或函數等 --


-- 設置定時下發設備的數據(可選) -- -- @param dev user_data裝置管理員 -- -- @return 無 -- -- @notice 此函數為回呼函數,不可在腳本內調用 -- -- @readme dev提供一下幾個函數: -- -- dev:add(interval,name,data)添加定時下發數據 -- -- @param interval number數據下發的時間間隔(秒) -- -- name string名稱(須保證唯一性) -- -- data string數據(二進位數據),使用lua轉義字串 -- -- @return 成功返回true,否則返回false -- -- @notice 定時數據下發的平均頻率不超過1,及1/interval_1+...+1/interval_n<=1 -- -- @example local ok = dev:add(10,"test","\1\1\0\150\0\37\253\29") -- -- dev:timeout(sec)設置下發數據的設備回應超時時間(秒) -- -- @param sec int 回應超時時間(秒) -- -- 如果值為0,表示不檢測設備回應超時 -- -- @return 無 -- -- @example dev:timeout(3) -- -- dev:response()設備回應成功 -- -- @param 無 -- -- @return 無 -- -- @example dev:response() -- -- dev:send(data)下發數據到設備 -- -- @param data string 數據(二進位數據),使用lua轉義字串 -- -- @return 無 -- -- @example dev:send("\2\2\0\150\0\37\206\89") -- function device_timer_init(dev) -- 添加用戶自訂代碼 -- -- 例 如 : -- dev:timeout(3) dev:add(10,"dev1","hello")--每10秒下發一包數據,內容為hello end

-----------------------------------------------------------------------------------------------------------

-- -- 解析設備上載數據 @param dev user_data 裝置管理員 @return size表示已解析設備上載數據的位元組數,json表示解析後的數據點集合,格式如下: -- -- [ -- -- { -- "i" : "dsname1", // 數據流或數據流範本名稱1 -- -- "a" : 1234567890, // 毫秒級時間戳記,距離(00:00:00 UTC, January 1, 1970)的毫秒 -- -- // 如果值為0,表示使用當前時間 -- -- "v" : 123 | "123" | {...} // 布林值、數值、字串、json -- -- "b" : "0A0B0C0D..." // 二進位數據(16進制字串),與v互斥,不同時存在 -- -- "d" : xxx | "xxx" | {...} // 用於描述b(可選);布林值、數值、字串、json -- -- "c" : "authcode1" // 用於標識數據點歸屬(設備AuthCode,可選) -- -- // 如果為“”或不存在,表示數據點歸屬建立TCP連接的設備 -- -- } -- -- ... -- -- { -- -- "i" : "dsnamen", // 數據流或數據流範本名稱1 -- -- "a" : 1234567890, // 毫秒級時間戳記,距離(00:00:00 UTC, January 1, 1970)的毫秒 -- -- // 如果值為0,表示使用當前時間 -- -- "v" : 123 | "123" | {...} // 布林值、數值、字串、json -- -- "b" : "0A0B0C0D..." // 二進位數據(16進制字串),與v互斥,不同時存 -- -- "d" : xxx | "xxx" | {...} // 用於描述b(可選);布林值、數值、字串、json -- -- "c" : "authcoden" // 用於標識數據點歸屬(設備AuthCode,可選) -- -- // 如果為“”或不存在,表示數據點歸屬建立TCP連接的設備 -- -- } -- -- ] -- -- @notice 此函數為回呼函數,不可在腳本內調用 -- -- @readme dev提供以下幾個函數: -- -- dev:add(interval,name,data)添加定時下發數據 -- -- @param interval number 數據下發的時間間隔(秒) -- -- name string 名稱(須保證唯一性) -- -- data string 數據(二進位數據),使用lua轉義字串 -- -- @return 成功返回true,否則返回false -- -- @notice 定時數據下發的平均頻率不超過1,及1/interval_1+...+1/interval_n<=1 -- -- @example local ok = dev:add(10,"test","\1\1\0\150\0\37\253\29") -- -- dev:timeout(sec)設置下發數據的設備回應超時時間(秒) -- -- @param sec int 回應超時時間(秒) -- -- 如果值為0,表示不檢測設備回應超時 -- -- @return 無 -- -- @example dev:timeout(3) -- -- dev:response()設備回應成功 -- -- @param 無 -- -- @return 無 -- -- @example dev:response() -- -- dev:send(data)下發數據到設備 -- -- @param data string 數據(二進位數據),使用lua轉義字串 -- -- @return 無 -- -- @example dev:send("\2\2\0\150\0\37\206\89") -- -- dev:size()獲取設備數據大小(位元組數) -- -- @param 無 -- -- @return 返回設備數據大小(位元組數) -- -- @example local sz = dev:size() -- -- dev:byte(pos)獲取pos對應位置的設備數據(位元組) -- -- @param pos number 指定的獲取位置,取值範圍[1,dev:size()+1) -- -- @return 成功返回設備數據(int),否則返回nil -- -- @example local data = dev:byte(1) -- -- dev:bytes(pos,count)獲取從pos開始,count個設備數據 -- -- @param pos number 指定的獲取起始位置,取值範圍[1,dev:size()+1) -- -- count number 指定的獲取數據總數,取值範圍[0,dev:size()+1-pos] -- -- @return 成功返回設備數據(string),否則返回nil --

-- @example local datas = dev:bytes(1,dev:size()) --

function device_data_analyze(dev) local t = {} local a = 0

    -- 添加用戶自訂代碼 --
    -- 例如: --
    local s = dev:size()    --獲取上行數據長度
    add_val(t,"ds_test",0,dev:bytes(1,s))

    dev:response()
    dev:send("received")  --發送應答

    -- return $1,$2 --
    -- 例如: --
    return s,to_json(t)    --保存該數據

end

其中:

device_data_analyze(dev) 為終端上行數據解析函數,每一包數據都會經過其處理;

device_timer_init(dev) 為計時器初始化函數,用於指定週期性的數據下發操作;

Step4 建立連接

設備上電,與OneNET接入服務(功能變數名稱為:dtu.heclouds.com)建立TCP連接,發送登入報文,格式如下:

*$PID#$AUTH_INFO#$PARSER_NAME*

示例:

*12346#sn823mdn#testlua*

其中,參數解釋如下:

  • PID:產品ID,創建產品時OneNET生成的產品唯一性數位識別碼
  • AUTH_INFO:設備鑒權信息,在設備註冊時,用戶創建設備時指定的唯一字元串標識
  • PARSER_NAME:用戶自訂解析腳本的名稱,用戶上載腳本時指定的唯一字串標識

若建立連接成功,可以看到設備在線標記:

pic

Step5 數據流展示,查看數據點

在OneNET上的設備管理下點擊數據展示,進入數據展示頁面,點擊下拉式功能表,查看近期上載的數據點;也可以選擇時間區間來查看歷史時間

个搜索结果,搜索内容 “

    0 个搜索结果,搜索内容 “