物聯網平臺提供的腳本解析器,可加工處理復雜的消息數據后與云產品交互。腳本解析器的能力包括獲取消息內容、轉換數據格式、處理字符串、組裝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方法,腳本會出現空指針,中斷執行。
- 使用函數方法,會返回值
- 使用云產品流轉函數實現數據流轉到數據目的。
云產品流轉函數使用說明,請參見流轉數據到數據目的函數。
您也可使用流程控制語句,設置數據流轉的更多過濾條件,例如本文“腳本示例”中使用了
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}
)。