脚本的解析能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据和处理二进制数据等。输出文件是使用固定的JSON数组格式,将设备上报数据或脚本解析后的数据,映射到数字孪生节点中。本文介绍如何编写脚本和输出文件。
背景信息
孪生体中支持添加数据源类型如下:
类型 | 说明 |
---|---|
Topic数据 |
|
API数据 | 物联网平台基于ImportDTData接口中请求参数Items.N.Params传入的JSON数据来处理和传递数据。 |
物联网平台提供脚本和输出文件,实现数据源映射到数字孪生体。脚本文件类似JavaScript语言,编辑脚本的语法参考JavaScript语法即可。
脚本和输出文件说明
脚本文件
脚本文件名称默认为
transformScript.txt
,脚本编写方法如下:
- 在脚本文件中,通过payload函数,获取通过设备Topic上报、ImportDTData接口中Items.N.Params上传或数据服务中数据解析后的数据,并按照JSON格式转换。
var payload = payload("json");
- 因脚本输出数据是JSON格式的键值对,所以可以定义Map类型数据,存储键值对数据。
var data = {};
- 获取payload中属性值,可以根据需要处理和计算数据后,将数据存入data。
- 返回解析后的数据data。
return data;
输出文件
输出文件名称默认为
destConfig.json
,脚本模板如下:
[
{
"key": "脚本输出中的key1;或mapping配置源Topic中payload的key1;或mapping配置源API中payload的key1;或mapping配置源数据解析中payload的key1",
"iotId": "孪生节点id1",
"identifier": "孪生节点物模型的标识符1",
"name":"孪生节点id1对应的孪生节点名称"
},
{
"key":"脚本输出中的key2;或mapping配置源Topic中payload的key2;或mapping配置源API中payload的key2;或mapping配置源数据解析中payload的key2",
"iotId": "孪生节点id2",
"identifier": "孪生节点物模型的标识符2",
"name":"孪生节点id2对应的孪生节点名称"
}
]
使用说明
- 通过设备Topic上报、API上传和数据解析后的JSON数据格式,为数组或者嵌套的JSON。脚本和输出文件中支持使用JSONPath获取其中的属性值。
例如下文示例中:
- 脚本文件中,使用
payload.items.Position.value.latitude
格式,获取到值39.9。 - 输出文件中,使用
items\\.Position\\.value\\.longitude
格式,获取到值116.38。
有关JSONPath的更多信息,请参见LanguageManual UDF。
- 脚本文件中,使用
- 脚本中定义常量、变量或其他自定义字段的标识符时,半角句号(.)可作为正常字符使用。
- 数据源所属设备名称可通过函数
deviceName()
获取。若数据源包含多个设备,可通过判断设备名称分别进行数据映射。若全部设备数据映射到一个孪生节点的物模型,上传多个设备的数据时,会进行数据覆盖,孪生节点物模型显示最后上传的数据。
- 若无需处理数据且数据源数据格式为JSON,可不使用脚本文件解析数据,直接编辑输出文件,进行数据映射。
脚本和输出示例
本文以通过设备Topic上报的属性数据为例,输入数据如下:
{
"iotId":"4z819VQHk6VSLmmBJfrf00107e****",
"productKey":"al12345****",
"deviceName":"deviceName1234",
"gmtCreate":1510799670074,
"deviceType":"Ammeter",
"items":{
"Power":{
"value":"on",
"time":1510799670074
},
"Position":{
"time":1510292697470,
"value":{
"latitude":39.9,
"longitude":116.38
}
}
},
"checkFailedData":{
}
}
解析和处理数据的示例如下:
//通过payload函数,获取设备上报的消息内容,并按照JSON格式转换。
var payload = payload("json");
//定义Map类型数据,存储键值对数据。
var data = {};
//获取位置的latitude值并且+1,将计算后的值存入data。
data["k1"] = payload.items.Position.value.latitude + 1;
//将Power的值进行转换,on转换成1,否则为0。
if (payload.items.Power.value == "on") {
data["k2"] = 1;
} else {
data["k2"] = 0;
}
//获取items的值。
data["items"] = payload.items;
//在data中添加一个常量stage1.stage2。
data["stage1.stage2"] = 1.3;
//返回解析后的数据data。
return data;
将脚本解析返回的data数据,作为输出文件的数据源,使用以下JSON格式,配置数据映射,示例如下:
[
{
//key值对应data数据中的字段。
"key": "k1",
//iotId值对应孪生节点ID。
"iotId": "xx***",
//孪生节点下的功能属性标识符,获取key对应字段的输出值,即节点“xx***”下属性id1值更新为k1的值。
"identifier": "id1",
"name":"node1"
},
{
"key": "k2",
"iotId": "yy***",
"identifier": "id2",
"name":"node2"
},{
"key": "items\\.Position\\.value\\.longitude",
"iotId": "yy***",
"identifier": "id3",
"name":"node3"
},{
"key": "stage1.stage2",
"iotId": "zz***",
"identifier": "id4",
"name":"node4"
}
]