物联网平台提供的时序数据存储规则,可加工处理设备上报的自定义Topic数据进行存储。时序数据存储规则的能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据、处理二进制数据等。本文介绍如何编写时序数据存储规则的脚本。
背景信息
配置自定义Topic数据存储时,需添加对应的时序数据存储规则来编辑脚本,将加工处理后的数据存储到物联网平台的时序数据存储空间。详细内容,请参见配置自定义Topic数据存储。
物联网平台的时序数据存储规则脚本类似JavaScript语言,编辑脚本的语法参考JavaScript语法即可。脚本解析器仅支持JavaScript语言的部分语法,详情见下文描述。
脚本编写说明
脚本编写方法如下:
通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var data = payload("json");
重要待处理的数据源必须转换为JSON格式数据,即数组或者嵌套的JSON数据。
定义字段,然后筛选设备上报的字段数据,并赋值给定义的字段。
定义字段标识符和数据类型的规则,请参见本文下方的“标识符”和“数据类型”。
脚本文件中支持使用JSONPath和函数
getOrNull()
获取data中的字段值。详细的使用说明,请参见LanguageManual UDF和getOrNull()。
重要在脚本文件中获取设备数据中指定字段值时:
若指定字段的标识符以数字开头,不支持直接使用JSONPath方法,需使用getOrNull()方法。例如本文“脚本示例”中的2C0,不能使用
data.items.2Co.value
,而是使用getOrNull(data, "items", "2Co", "value")
获取值10
。若指定字段不存在,则:
使用函数方法,会返回值
null
,脚本可继续向下执行。使用JSONPath方法,脚本会出现空指针,中断执行。
使用转换函数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 } }
将转换后的标准格式数据赋值给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个字符。
以下关键词和保留字不能作为标识符使用。
- 关键词:
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
。
数据类型
代码中常量、变量和其他自定义字段支持数据类型有: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}
)。