物联网平台提供的脚本解析器,类似于JavaScript语言,与SQL表达式相比,可加工处理复杂消息数据和云产品交互。脚本语言的解析能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据、处理二进制数据和流转数据等。本文介绍如何编写解析脚本。
背景信息
物联网平台是基于Topic中的数据格式来处理和传递数据的,数据格式的具体内容,请参见数据格式。
脚本示例
本文以上报的属性数据为例,输入数据如下:
{
"deviceType": "CustomCategory",
"iotId": "JCp9***",
"requestId": "1626948228247",
"checkFailedData": {
},
"productKey": "a1o***",
"gmtCreate": 1626948134445,
"deviceName": "Device1",
"items": {
"Temperature": {
"value": 38,
"time": 1626948134319
},
"Humidity": {
"value": 25,
"time": 1626948134319
}
}
}
解析和处理数据的示例如下:
//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
//筛选出上报的温湿度值。
var h = getOrNull(data, "items", "Humidity", "value");
var t = data.items.Temperature.value;
// 设置温度值大于38时触发规则,转发数据到云数据库RDS。
// RDS表结构为id[自增主键]、deviceName、temperature、humidity、time,在writeRds方法中,可以按column:value的形式,将值写入对应的列。
if (t > 38) {
writeRds(1000, {"devcieName":deviceName(), "temperature":t, "time":timestamp(), "humidity":h});
}
解析处理的数据源必须转换为JSON格式数据,即数组或者嵌套的JSON数据。
脚本文件中支持使用JSONPath和函数getOrNull()
获取其中的字段值。详细的使用说明,请参见LanguageManual UDF和getOrNull()。
例如以上示例中,可使用getOrNull(data, "items", "Humidity", "value");
,获取到值25
;使用data.items.Temperature.value
获取到值38
;使用data.iotId
,获取到值JCp9***
。
- 使用函数方法,会返回值
null
,脚本可继续向下执行。 - 使用JSONPath方法,脚本会出现空指针,中断执行。
标识符
代码中常量、变量和其他自定义字段,需使用标识符定义。标识符支持大小写英文字母、数字和下划线(_),不能以数字开头。
以下关键词和保留字不能作为标识符使用。
- 关键词:
for
、break
、continue
、if
、else
、true
、false
、var
、new
、null
和return
。 - 保留字:
breakdo
、instanceof
、typeof
、case
、catch
、finally
、void
、switch
、while
、debugger
、function
、this
、with
、default
、throw
、delete
、in
、try
、as
、from
、classenum
、extends
、super
、const
、export
、import
、await
、implementslet
、let
、private
、public
、interface
、package
、protected
、static
、yield
。
数据类型
代码中常量、变量和其他自定义字段支持数据类型有: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}
)。