脚本的解析能力包括获取消息内容、转换数据格式、处理字符串、组装JSON格式数据和处理二进制数据等。输出文件是使用固定的JSON数组格式,将设备上报数据或脚本解析后的数据,映射到数字孪生节点中。本文介绍如何编写脚本和输出文件。

背景信息

孪生体中支持添加数据源类型如下:

类型 说明
Topic数据
  • 自定义Topic和物模型属性上报Topic:物联网平台是基于Topic中的数据格式来处理和传递数据的。设备Topic数据格式说明,请参见数据格式
  • 数据服务中数据解析的数据源:物联网平台是基于数据解析后的JSON数据格式来处理和传递数据的。
    数据格式示例为:
    {
        "payload":{
            "key1":"value1",
            "key2":"value2"
        },
        "ts":1623516625000
    }
    • payload:固定系统字段,其下字段(例如:key1key2)数据为数据解析任务中经过输入和功能节点解析后的输出字段数据。
    • ts:固定系统字段,是数据解析任务中数据的处理时间戳(UTC时间,单位为毫秒)。
API数据 物联网平台基于ImportDTData接口中请求参数Items.N.Params传入的JSON数据来处理和传递数据。

物联网平台提供脚本和输出文件,实现数据源映射到数字孪生体。脚本文件类似JavaScript语言,编辑脚本的语法参考JavaScript语法即可。

物联网平台脚本仅支持部分规则表达式和JavaScript语言的部分语法,具体说明,请参见规则表达式脚本语法

脚本和输出文件说明

脚本文件

脚本文件名称默认为 transformScript.txt,脚本编写方法如下:
  1. 在脚本文件中,通过payload函数,获取通过设备Topic上报、ImportDTData接口中Items.N.Params上传或数据服务中数据解析后的数据,并按照JSON格式转换。
    var payload = payload("json");
  2. 因脚本输出数据是JSON格式的键值对,所以可以定义Map类型数据,存储键值对数据。
    var data = {};
  3. 获取payload中属性值,可以根据需要处理和计算数据后,将数据存入data。
  4. 返回解析后的数据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"
  }  
]