全部產品
Search
文件中心

IoT Platform:指令碼文法

更新時間:Jun 30, 2024

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

    您也可根據需要處理和計算資料。指令碼中支援操作符和函數,請參見操作符函數列表

  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} )。

相關文檔