物聯網平台提供的指令碼解析器,可加工處理複雜的訊息資料後與雲產品互動。指令碼解析器的能力包括擷取訊息內容、轉換資料格式、處理字串、組裝JSON格式資料、處理位元據和流轉資料等。本文介紹如何編寫解析指令碼。
背景資訊
物聯網平台是基於Topic中的資料格式來處理和傳遞資料的,資料格式的具體內容,請參見資料格式。
物聯網平台的指令碼解析器類似JavaScript語言,編輯指令碼的文法參考JavaScript文法即可。指令碼解析器僅支援JavaScript語言的部分文法,詳情見下文描述。
指令碼編寫說明
指令碼編寫方法如下:
- 通過payload函數,擷取裝置上報的訊息內容,並按照JSON格式轉換。
var data = payload("json");
重要 解析處理的資料來源必須轉換為JSON格式資料,即數組或者嵌套的JSON資料。 - 定義欄位,然後擷取payload中屬性值,並賦值給該欄位。
- 定義欄位標識符和資料類型的規則,請參見本文下方的“標識符”和“資料類型”。
- 指令檔中支援使用JSONPath和函數
getOrNull()
擷取其中的欄位值。詳細的使用說明,請參見LanguageManual UDF和getOrNull()。例如本文“指令碼樣本”中,可使用
getOrNull(data, "items", "Humidity", "value");
,擷取到值25
;使用data.items.Temperature.value
擷取到值38
;使用data.iotId
,擷取到值JCp9***
。
重要 在指令檔中擷取裝置資料中指定欄位值時:- 若指定欄位的標識符以數字開頭,不支援直接使用JSONPath方法,需使用getOrNull()方法。例如本文“指令碼樣本”中的2C0,不能使用
data.items.2Co.value
,而是使用getOrNull(data, "items", "2Co", "value")
擷取值10
。 - 若指定欄位不存在,則:
- 使用函數方法,會傳回值
null
,指令碼可繼續向下執行。 - 使用JSONPath方法,指令碼會出現null 指標,中斷執行。
- 使用函數方法,會傳回值
- 使用雲產品流轉函數實現資料流轉到資料目的。
雲產品流轉函數使用說明,請參見流轉資料到資料目的函數。
您也可使用流程式控制制語句,設定資料流轉的更多過濾條件,例如本文“指令碼樣本”中使用了
if
語句。指令碼支援的控制語句,請參見本文下方的“流程式控制制語句”。
指令碼樣本
本文以上報的屬性資料為例,輸入資料如下:
{
"deviceType": "CustomCategory",
"iotId": "JCp9***",
"requestId": "1626948228247",
"checkFailedData": {
},
"productKey": "a1o***",
"gmtCreate": 1626948134445,
"deviceName": "Device1",
"items": {
"Temperature": {
"value": 38,
"time": 1626948134319
},
"Humidity": {
"value": 25,
"time": 1626948134319
},
"2Co": {
"value": 10,
"time": 1626948134319
}
}
}
解析和處理資料的樣本如下:
//通過payload函數,擷取裝置上報的訊息內容,並按照JSON格式轉換。
var data = payload("json");
//篩選出上報的溫濕度值。
var h = getOrNull(data, "items", "Humidity", "value");
var t = data.items.Temperature.value;
var c = getOrNull(data, "items", "2Co", "value");
// 設定溫度值大於38時觸發規則,轉寄資料到雲資料庫RDS。
// RDS表結構為id[自增主鍵]、deviceName、temperature、humidity、2Co、time,在writeRds方法中,可以按column:value的形式,將值寫入對應的列。
if (t > 38) {
writeRds(1000, {"deviceName":deviceName(), "temperature":t, "humidity":h, "2Co":c, "time":timestamp()});
}
標識符
代碼中常量、變數和其他自訂欄位,需使用標識符定義。標識符支援大小寫英文字母、數字和底線(_),不能以數字開頭。
以下關鍵詞和保留字不能作為標識符使用。
- 關鍵詞:
for
、break
、continue
、if
、else
、true
、false
、var
、new
、null
和return
。 - 保留字:
breakdo
、instanceof
、typeof
、case
、catch
、finally
、void
、switch
、while
、debugger
、function
、this
、with
、default
、throw
、delete
、in
、try
、as
、from
、classenum
、extends
、super
、const
、export
、import
、await
、implementslet
、let
、private
、public
、interface
、package
、protected
、static
、yield
。
資料類型
代碼中常量、變數和其他自訂欄位支援資料類型有:Number、Boolean、String、Byte、Map、Array。
常量可取值為null,數值型常量的取實值型別包括十進位整型、十六進位整型和浮點型。
流程式控制制語句
物聯網平台支援使用for
迴圈和if...else
條件陳述式。其中for
迴圈,支援使用關鍵詞break
(跳出迴圈)和continue
(跳出本次迴圈)。
for
語句迴圈執行流轉函數,迴圈次數不能超過100。流轉函數詳細資料,請參見流轉資料到資料目的函數。操作符
- 邏輯運算:
&&
、||
。邏輯條件結果為非布爾型時,null(空值)表示false,否則為true。例如
null && "x"
返回false,null || "x"
返回true。 - 數學運算:
*
、/
、%
、+
、-
。操作資料必須為數值型,否則會拋出異常。
- 條件判斷:
>
、=>
、<
、<=
、==
(僅支援值比較)、!=
。
注釋
指令碼中支援多行注釋(/* ${comments}*/
)和單行注釋(// ${comments}
)。