Step1 創建產品,選擇TCP透傳
首先你需要在平台完成帳號註冊,並創建一個TCP透傳的產品
Step2 創建設備,記錄設備ID等信息
通過頁面點擊添加設備,輸入設備名稱和鑒權信息(即設備編號),並記錄下該設備編號.
Step3 上載Lua腳本
通過頁面上載解析腳本到產品下,如下圖所示:
腳本示例:
腳本實現了如下功能:
- 設備連接後每5秒下發一次“hello”
- 用戶上載數據後,平台回復“received”
- 將用戶上載的數據轉換為HEX字串並作為數據點存儲至ds_test數據流
-- 使用說明: -- -- V1.3 -- -- 用戶需要自行完成以下2個函數的實現 -- -- 1、定時下發數據任務初始化函數:device_timer_init(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 返回秒 --
-- 將bytes string轉換hex string -- -- @param s string bytes string -- -- @return 返回hex string,類似"0A0B0C0D..." --
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 --
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 --
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字串 --
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-添加用戶自訂值或函數等 --
-- 設置定時下發設備的數據(可選) -- -- @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 --
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*
其中,參數解釋如下:
若建立連接成功,可以看到設備在線標記:
Step5 數據流展示,查看數據點
在OneNET上的設備管理下點擊數據展示,進入數據展示頁面,點擊下拉式功能表,查看近期上載的數據點;也可以選擇時間區間來查看歷史時間