物联网平台提供的脚本解析器,可加工处理复杂的消息数据后与云产品交互。脚本解析器的能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据、处理二进制数据和流转数据等。本文介绍如何编写解析脚本。
背景信息
物联网平台是基于Topic中的数据格式来处理和传递数据的,数据格式的具体内容,请参见数据格式。
物联网平台的脚本解析器类似JavaScript语言,编辑脚本的语法参考JavaScript语法即可。脚本解析器仅支持JavaScript语言的部分语法,详情见下文描述。
脚本编写说明
脚本编写方法如下:
- 通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
重要 解析处理的数据源必须转换为JSON格式数据,即数组或者嵌套的JSON数据。 - 定义字段,然后获取payload中属性值,并赋值给该字段。
- 定义字段标识符和数据类型的规则,请参见本文下方的“标识符”和“数据类型”。
- 脚本文件中支持使用JSONPath和函数
getOrNull()
获取其中的字段值。详细的使用说明,请参见LanguageManual UDF和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方法,脚本会出现空指针,中断执行。
- 使用函数方法,会返回值
- 使用云产品流转函数实现数据流转到数据目的。
云产品流转函数使用说明,请参见流转数据到数据目的函数。
您也可使用流程控制语句,设置数据流转的更多过滤条件,例如本文“脚本示例”中使用了
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()});
}
标识符
代码中常量、变量和其他自定义字段,需使用标识符定义。标识符支持大小写英文字母、数字和下划线(_),不能以数字开头。
以下关键词和保留字不能作为标识符使用。
- 关键词:
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}
)。