物联网平台提供的脚本解析器,可加工处理复杂的消息数据后与其他应用/业务交互。脚本解析器的能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据、处理二进制数据和流转数据等。本文介绍如何编写解析脚本。

背景信息

物联网平台是基于Topic中的数据格式来处理和传递数据的,数据格式的具体内容,请参见数据格式。

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

脚本编写说明

脚本编写方法如下:

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

    var data = payload("json");

    重要: 解析处理的数据源必须转换为JSON格式数据,即数组或者嵌套的JSON数据。

  2. 定义字段,然后获取payload中属性值,并赋值给该字段。

    • 定义字段标识符和数据类型的规则,请参见本文下方的“标识符”和“数据类型”。
    • 脚本文件中支持使用JSONPath和函数getOrNull()获取其中的字段值。详细的使用说明,请参见getOrNull()
      例如本文“脚本示例”中,可使用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方法,脚本会出现空指针,中断执行。

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

  1. 使用流转数据到数据目的函数 实现数据流转到数据目的。
  • 函数使用说明请参见:流转数据到数据目的函数
  • 您也可使用流程控制语句,设置数据流转的更多过滤条件,例如本文“脚本示例”中使用了if语句。脚本支持的控制语句,请参见本文下方的“流程控制语句”。

脚本示例

本文以设备上报属性的数据为例,输入数据如下:

{
    "productId":"AAcm******",
    "deviceId":"339*********************2dd53e",
    "property": {
        "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, "property", "Humidity", "value");
var t = getOrNull(data, "property", "Temperature", "value");
// 设置温度值大于38时触发规则,转发当前设备的湿度值到另一个设备Topic
if (t > 38) {
     writeIotTopic(11, "/RcfIfc1w3a/b9f56719e432441d94d4320b1faab2c1/thing/property/down",h);
}

标识符

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

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

  • 关键词:forbreakcontinueifelsetruefalsevarnewnullreturn
  • 保留字:breakdoinstanceoftypeofcasecatchfinallyvoidswitchwhile
    debuggerfunctionthiswithdefaultthrowdeleteintryasfromclassenumextendssuperconstexportimportawaitimplementsletletprivatepublicinterfacepackageprotectedstaticyield

数据类型

代码中常量、变量和其他自定义字段支持数据类型有:Number、Boolean、String、Byte、Map、Array。

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

流程控制语句

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

操作符

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

  • 数学运算:*/%+-
    操作数据必须为数值型,否则会抛出异常。

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

注释

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

相关文档

 创建时间:2023-10-16 19:07
最后编辑:陈勇琦  更新时间:2024-10-18 16:29