物聯(lián)網(wǎng)平臺(tái)提供的腳本解析器,可加工處理復(fù)雜的消息數(shù)據(jù)后與云產(chǎn)品交互。腳本解析器的能力包括獲取消息內(nèi)容、轉(zhuǎn)換數(shù)據(jù)格式、處理字符串、組裝JSON格式數(shù)據(jù)、處理二進(jìn)制數(shù)據(jù)和流轉(zhuǎn)數(shù)據(jù)等。本文介紹如何編寫(xiě)解析腳本。
背景信息
物聯(lián)網(wǎng)平臺(tái)是基于Topic中的數(shù)據(jù)格式來(lái)處理和傳遞數(shù)據(jù)的,數(shù)據(jù)格式的具體內(nèi)容,請(qǐng)參見(jiàn)數(shù)據(jù)格式。
物聯(lián)網(wǎng)平臺(tái)的腳本解析器類(lèi)似JavaScript語(yǔ)言,編輯腳本的語(yǔ)法參考JavaScript語(yǔ)法即可。腳本解析器僅支持JavaScript語(yǔ)言的部分語(yǔ)法,詳情見(jiàn)下文描述。
腳本編寫(xiě)說(shuō)明
腳本編寫(xiě)方法如下:
- 通過(guò)payload函數(shù),獲取設(shè)備上報(bào)的消息內(nèi)容,并按照J(rèn)SON格式轉(zhuǎn)換。
var data = payload("json");
重要 解析處理的數(shù)據(jù)源必須轉(zhuǎn)換為JSON格式數(shù)據(jù),即數(shù)組或者嵌套的JSON數(shù)據(jù)。 - 定義字段,然后獲取payload中屬性值,并賦值給該字段。
- 定義字段標(biāo)識(shí)符和數(shù)據(jù)類(lèi)型的規(guī)則,請(qǐng)參見(jiàn)本文下方的“標(biāo)識(shí)符”和“數(shù)據(jù)類(lèi)型”。
- 腳本文件中支持使用JSONPath和函數(shù)
getOrNull()
獲取其中的字段值。詳細(xì)的使用說(shuō)明,請(qǐng)參見(jiàn)LanguageManual UDF和getOrNull()。例如本文“腳本示例”中,可使用
getOrNull(data, "items", "Humidity", "value");
,獲取到值25
;使用data.items.Temperature.value
獲取到值38
;使用data.iotId
,獲取到值JCp9***
。
重要 在腳本文件中獲取設(shè)備數(shù)據(jù)中指定字段值時(shí):- 若指定字段的標(biāo)識(shí)符以數(shù)字開(kāi)頭,不支持直接使用JSONPath方法,需使用getOrNull()方法。例如本文“腳本示例”中的2C0,不能使用
data.items.2Co.value
,而是使用getOrNull(data, "items", "2Co", "value")
獲取值10
。 - 若指定字段不存在,則:
- 使用函數(shù)方法,會(huì)返回值
null
,腳本可繼續(xù)向下執(zhí)行。 - 使用JSONPath方法,腳本會(huì)出現(xiàn)空指針,中斷執(zhí)行。
- 使用函數(shù)方法,會(huì)返回值
您也可根據(jù)需要處理和計(jì)算數(shù)據(jù)。腳本中支持操作符和函數(shù),請(qǐng)參見(jiàn)操作符和函數(shù)列表。
- 使用云產(chǎn)品流轉(zhuǎn)函數(shù)實(shí)現(xiàn)數(shù)據(jù)流轉(zhuǎn)到數(shù)據(jù)目的。
云產(chǎn)品流轉(zhuǎn)函數(shù)使用說(shuō)明,請(qǐng)參見(jiàn)流轉(zhuǎn)數(shù)據(jù)到數(shù)據(jù)目的函數(shù)。
您也可使用流程控制語(yǔ)句,設(shè)置數(shù)據(jù)流轉(zhuǎn)的更多過(guò)濾條件,例如本文“腳本示例”中使用了
if
語(yǔ)句。腳本支持的控制語(yǔ)句,請(qǐng)參見(jiàn)本文下方的“流程控制語(yǔ)句”。
腳本示例
本文以上報(bào)的屬性數(shù)據(jù)為例,輸入數(shù)據(jù)如下:
{
"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
}
}
}
解析和處理數(shù)據(jù)的示例如下:
//通過(guò)payload函數(shù),獲取設(shè)備上報(bào)的消息內(nèi)容,并按照J(rèn)SON格式轉(zhuǎn)換。
var data = payload("json");
//篩選出上報(bào)的溫濕度值。
var h = getOrNull(data, "items", "Humidity", "value");
var t = data.items.Temperature.value;
var c = getOrNull(data, "items", "2Co", "value");
// 設(shè)置溫度值大于38時(shí)觸發(fā)規(guī)則,轉(zhuǎn)發(fā)數(shù)據(jù)到云數(shù)據(jù)庫(kù)RDS。
// RDS表結(jié)構(gòu)為id[自增主鍵]、deviceName、temperature、humidity、2Co、time,在writeRds方法中,可以按column:value的形式,將值寫(xiě)入對(duì)應(yīng)的列。
if (t > 38) {
writeRds(1000, {"deviceName":deviceName(), "temperature":t, "humidity":h, "2Co":c, "time":timestamp()});
}
標(biāo)識(shí)符
代碼中常量、變量和其他自定義字段,需使用標(biāo)識(shí)符定義。標(biāo)識(shí)符支持大小寫(xiě)英文字母、數(shù)字和下劃線(xiàn)(_),不能以數(shù)字開(kāi)頭。
以下關(guān)鍵詞和保留字不能作為標(biāo)識(shí)符使用。
- 關(guān)鍵詞:
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
。
數(shù)據(jù)類(lèi)型
代碼中常量、變量和其他自定義字段支持?jǐn)?shù)據(jù)類(lèi)型有:Number、Boolean、String、Byte、Map、Array。
常量可取值為null,數(shù)值型常量的取值類(lèi)型包括十進(jìn)制整型、十六進(jìn)制整型和浮點(diǎn)型。
流程控制語(yǔ)句
物聯(lián)網(wǎng)平臺(tái)支持使用for
循環(huán)和if...else
條件語(yǔ)句。其中for
循環(huán),支持使用關(guān)鍵詞break
(跳出循環(huán))和continue
(跳出本次循環(huán))。
for
語(yǔ)句循環(huán)執(zhí)行流轉(zhuǎn)函數(shù),循環(huán)次數(shù)不能超過(guò)100。流轉(zhuǎn)函數(shù)詳細(xì)信息,請(qǐng)參見(jiàn)流轉(zhuǎn)數(shù)據(jù)到數(shù)據(jù)目的函數(shù)。操作符
- 邏輯運(yùn)算:
&&
、||
。邏輯條件結(jié)果為非布爾型時(shí),null(空值)表示false,否則為true。例如
null && "x"
返回false,null || "x"
返回true。 - 數(shù)學(xué)運(yùn)算:
*
、/
、%
、+
、-
。操作數(shù)據(jù)必須為數(shù)值型,否則會(huì)拋出異常。
- 條件判斷:
>
、=>
、<
、<=
、==
(僅支持值比較)、!=
。
注釋
腳本中支持多行注釋?zhuān)?code class="ph codeph" data-tag="codeph" id="codeph-gp1-5gi-bi2">/* ${comments}*/)和單行注釋?zhuān)?code class="ph codeph" data-tag="codeph" id="codeph-ypi-mn9-bue">// ${comments} )。
相關(guān)文檔
- 腳本中支持使用的函數(shù)說(shuō)明,請(qǐng)參見(jiàn)函數(shù)列表。
- 配置解析腳本進(jìn)行數(shù)據(jù)流轉(zhuǎn)的示例,請(qǐng)參見(jiàn)數(shù)據(jù)流轉(zhuǎn)使用示例目錄下的具體文檔。