脚本语法

物联网平台提供的时序数据存储规则,可加工处理设备上报的自定义Topic数据进行存储。时序数据存储规则的能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据、处理二进制数据等。本文介绍如何编写时序数据存储规则的脚本。

背景信息

配置自定义Topic数据存储时,需添加对应的时序数据存储规则来编辑脚本,将加工处理后的数据存储到物联网平台的时序数据存储空间。详细内容,请参见配置自定义Topic数据存储

物联网平台的时序数据存储规则脚本类似JavaScript语言,编辑脚本的语法参考JavaScript语法即可。脚本解析器仅支持JavaScript语言的部分语法,详情见下文描述。

脚本编写说明

脚本编写方法如下:

  1. 通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。

    var data = payload("json");
    重要

    待处理的数据源必须转换为JSON格式数据,即数组或者嵌套的JSON数据。

  2. 定义字段,然后筛选设备上报的字段数据,并赋值给定义的字段。

    • 定义字段标识符和数据类型的规则,请参见本文下方的“标识符”和“数据类型”。

    • 脚本文件中支持使用JSONPath和函数getOrNull()获取data中的字段值。详细的使用说明,请参见LanguageManual UDFgetOrNull()

    重要

    在脚本文件中获取设备数据中指定字段值时:

    • 若指定字段的标识符以数字开头,不支持直接使用JSONPath方法,需使用getOrNull()方法。例如本文“脚本示例”中的2C0,不能使用data.items.2Co.value,而是使用getOrNull(data, "items", "2Co", "value")获取值10

    • 若指定字段不存在,则:

      • 使用函数方法,会返回值null,脚本可继续向下执行。

      • 使用JSONPath方法,脚本会出现空指针,中断执行。

    您也可根据需要处理和计算数据。脚本中支持操作符和函数,请参见操作符函数列表

  3. 使用转换函数convert2HotStorageData(fields, time)将上一步获取的字段数据进行标准格式转换。

    重要

    fields中最多包含500个key

    转换后的标准格式为:

    {
        "key1": {
            "value": value1,
            "time": timestamp()
        },
        "key2": {
            "value": value2,
            "time": timestamp()
        }
    }

    您也可将获取的字段数据,按照标准格式组合,自定义每个字段的time值。例如:

    {
        "key1": {
            "value": value1,
            "time": 1626948134319
        },
        "key2": {
            "value": value2,
            "time": 1626948134000
        }
    }
  4. 将转换后的标准格式数据赋值给params,使用数据存储函数writeHotStorage(params)进行存储。

    重要

    同一时序数据存储规则下,同一字段key对应value的数据类型必须保持不变。若发生改变(例如:int32类型改为text类型),则新数据的写入会失败,且无法再查询历史存储数据。

    您也可使用流程控制语句,设置数据存储的更多过滤条件。脚本支持的控制语句,请参见本文下方的“流程控制语句”。

脚本示例

设备上报数据示例:

{
    "deviceType": "CustomCategory",
    "iotId": "JCp9***",
    "requestId": "1626948228247",
    "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");
    
    var fields = {
        "h": h,
        "t": t,
        "c": c
    }
    
    var params = convert2HotStorageData(fields, timestamp());
    writeHotStorage(params);
  • 存储数据使用自定义时间:

    //通过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");
    
    var params = {
        "h": {
             "value": h,
             "time": 1626948134319
        },
        "t": {
             "value": t,
             "time": 1627048134319
         },
        "c": {
            "value": c,
            "time": 1628048134319
         }
    }
    writeHotStorage(params);

标识符

代码中常量、变量和其他自定义字段,需使用标识符定义。标识符支持大小写英文字母、数字和下划线(_),不能以数字开头,长度限制为30个字符。

以下关键词和保留字不能作为标识符使用。

  • 关键词:forbreakcontinueifelsetruefalsevarnewnullreturn
  • 保留字:breakdoinstanceoftypeofcasecatchfinallyvoidswitchwhiledebuggerfunctionthiswithdefaultthrowdeleteintryasfromclassenumextendssuperconstexportimportawaitimplementsletletprivatepublicinterfacepackageprotectedstaticyield

数据类型

代码中常量、变量和其他自定义字段支持数据类型有:int32(32为整型)、float(单精度浮点型)、double(双精度浮点型)、text(字符串)和struct(JSON对象)。

常量可取值为null,数值型常量的取值类型包括十进制整型、十六进制整型和浮点型。

流程控制语句

物联网平台支持使用for循环和if...else条件语句。其中for循环,支持使用关键词break(跳出循环)和continue(跳出本次循环)。

重要

若使用for语句循环执行流转函数,循环次数不能超过100。

操作符

  • 逻辑运算:&&||

    逻辑条件结果为非布尔型时,null(空值)表示false,否则为true。例如null && "x" 返回false,null || "x"返回true。

  • 数学运算:*/%+-

    操作数据必须为数值型,否则会抛出异常。

  • 条件判断:>=><<===(仅支持值比较)、!=

注释

脚本中支持多行注释(/* ${comments}*/)和单行注释(// ${comments} )。