物聯(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ě)方法如下:

  1. 通過(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ù)。
  2. 定義字段,然后獲取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 UDFgetOrNull()

      例如本文“腳本示例”中,可使用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í)行。

    您也可根據(jù)需要處理和計(jì)算數(shù)據(jù)。腳本中支持操作符和函數(shù),請(qǐng)參見(jiàn)操作符函數(shù)列表

  3. 使用云產(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)鍵詞:forbreakcontinueifelsetruefalsevarnewnullreturn
  • 保留字:breakdoinstanceoftypeofcasecatchfinallyvoidswitchwhiledebuggerfunctionthiswithdefaultthrowdeleteintryasfromclassenumextendssuperconstexportimportawaitimplementsletletprivatepublicinterfacepackageprotectedstaticyield

數(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)文檔