物聯網平臺提供的腳本解析器,可加工處理復雜的消息數據后與云產品交互。腳本解析器的能力包括獲取消息內容、轉換數據格式、處理字符串、組裝JSON格式數據、處理二進制數據和流轉數據等。本文介紹如何編寫解析腳本。

背景信息

物聯網平臺是基于Topic中的數據格式來處理和傳遞數據的,數據格式的具體內容,請參見數據格式

物聯網平臺的腳本解析器類似JavaScript語言,編輯腳本的語法參考JavaScript語法即可。腳本解析器僅支持JavaScript語言的部分語法,詳情見下文描述。

腳本編寫說明

腳本編寫方法如下:

  1. 通過payload函數,獲取設備上報的消息內容,并按照JSON格式轉換。
    var data = payload("json");
    重要 解析處理的數據源必須轉換為JSON格式數據,即數組或者嵌套的JSON數據。
  2. 定義字段,然后獲取payload中屬性值,并賦值給該字段。
    • 定義字段標識符和數據類型的規則,請參見本文下方的“標識符”和“數據類型”。
    • 腳本文件中支持使用JSONPath和函數getOrNull()獲取其中的字段值。詳細的使用說明,請參見LanguageManual UDFgetOrNull()

      例如本文“腳本示例”中,可使用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方法,腳本會出現空指針,中斷執行。

    您也可根據需要處理和計算數據。腳本中支持操作符和函數,請參見操作符函數列表

  3. 使用云產品流轉函數實現數據流轉到數據目的。

    云產品流轉函數使用說明,請參見流轉數據到數據目的函數

    您也可使用流程控制語句,設置數據流轉的更多過濾條件,例如本文“腳本示例”中使用了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()});  
}

標識符

代碼中常量、變量和其他自定義字段,需使用標識符定義。標識符支持大小寫英文字母、數字和下劃線(_),不能以數字開頭。

以下關鍵詞和保留字不能作為標識符使用。

  • 關鍵詞:forbreakcontinueifelsetruefalsevarnewnullreturn
  • 保留字:breakdoinstanceoftypeofcasecatchfinallyvoidswitchwhiledebuggerfunctionthiswithdefaultthrowdeleteintryasfromclassenumextendssuperconstexportimportawaitimplementsletletprivatepublicinterfacepackageprotectedstaticyield

數據類型

代碼中常量、變量和其他自定義字段支持數據類型有: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} )。

相關文檔