物聯網平台提供的指令碼解析器,可加工處理複雜的訊息資料後與雲產品互動。指令碼解析器的能力包括擷取訊息內容、轉換資料格式、處理字串、組裝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} )。