腳本的解析能力包括獲取消息內(nèi)容、轉(zhuǎn)換數(shù)據(jù)格式、處理字符串、組裝JSON格式數(shù)據(jù)和處理二進(jìn)制數(shù)據(jù)等。輸出文件是使用固定的JSON數(shù)組格式,將設(shè)備上報(bào)數(shù)據(jù)或腳本解析后的數(shù)據(jù),映射到數(shù)字孿生節(jié)點(diǎn)中。本文介紹如何編寫(xiě)腳本和輸出文件。
背景信息
孿生體中支持添加數(shù)據(jù)源類(lèi)型如下:
類(lèi)型 | 說(shuō)明 |
---|---|
Topic數(shù)據(jù) |
|
API數(shù)據(jù) | 物聯(lián)網(wǎng)平臺(tái)基于ImportDTData接口中請(qǐng)求參數(shù)Items.N.Params傳入的JSON數(shù)據(jù)來(lái)處理和傳遞數(shù)據(jù)。 |
物聯(lián)網(wǎng)平臺(tái)提供腳本和輸出文件,實(shí)現(xiàn)數(shù)據(jù)源映射到數(shù)字孿生體。腳本文件類(lèi)似JavaScript語(yǔ)言,編輯腳本的語(yǔ)法參考JavaScript語(yǔ)法即可。
物聯(lián)網(wǎng)平臺(tái)腳本僅支持部分規(guī)則表達(dá)式和JavaScript語(yǔ)言的部分語(yǔ)法,具體說(shuō)明,請(qǐng)參見(jiàn)規(guī)則表達(dá)式和腳本語(yǔ)法。
腳本和輸出文件說(shuō)明
腳本文件
transformScript.txt
,腳本編寫(xiě)方法如下:
- 在腳本文件中,通過(guò)payload函數(shù),獲取通過(guò)設(shè)備Topic上報(bào)、ImportDTData接口中Items.N.Params上傳或數(shù)據(jù)服務(wù)中數(shù)據(jù)解析后的數(shù)據(jù),并按照J(rèn)SON格式轉(zhuǎn)換。
var payload = payload("json");
- 因腳本輸出數(shù)據(jù)是JSON格式的鍵值對(duì),所以可以定義Map類(lèi)型數(shù)據(jù),存儲(chǔ)鍵值對(duì)數(shù)據(jù)。
var data = {};
- 獲取payload中屬性值,可以根據(jù)需要處理和計(jì)算數(shù)據(jù)后,將數(shù)據(jù)存入data。
- 返回解析后的數(shù)據(jù)data。
return data;
輸出文件
destConfig.json
,腳本模板如下:
[
{
"key": "腳本輸出中的key1;或mapping配置源Topic中payload的key1;或mapping配置源API中payload的key1;或mapping配置源數(shù)據(jù)解析中payload的key1",
"iotId": "孿生節(jié)點(diǎn)id1",
"identifier": "孿生節(jié)點(diǎn)物模型的標(biāo)識(shí)符1",
"name":"孿生節(jié)點(diǎn)id1對(duì)應(yīng)的孿生節(jié)點(diǎn)名稱(chēng)"
},
{
"key":"腳本輸出中的key2;或mapping配置源Topic中payload的key2;或mapping配置源API中payload的key2;或mapping配置源數(shù)據(jù)解析中payload的key2",
"iotId": "孿生節(jié)點(diǎn)id2",
"identifier": "孿生節(jié)點(diǎn)物模型的標(biāo)識(shí)符2",
"name":"孿生節(jié)點(diǎn)id2對(duì)應(yīng)的孿生節(jié)點(diǎn)名稱(chēng)"
}
]
使用說(shuō)明
- 通過(guò)設(shè)備Topic上報(bào)、API上傳和數(shù)據(jù)解析后的JSON數(shù)據(jù)格式,為數(shù)組或者嵌套的JSON。腳本和輸出文件中支持使用JSONPath獲取其中的屬性值。
例如下文示例中:
- 腳本文件中,使用
payload.items.Position.value.latitude
格式,獲取到值39.9。 - 輸出文件中,使用
items\\.Position\\.value\\.longitude
格式,獲取到值116.38。
有關(guān)JSONPath的更多信息,請(qǐng)參見(jiàn)LanguageManual UDF。
- 腳本文件中,使用
- 腳本中定義常量、變量或其他自定義字段的標(biāo)識(shí)符時(shí),半角句號(hào)(.)可作為正常字符使用。
- 數(shù)據(jù)源所屬設(shè)備名稱(chēng)可通過(guò)函數(shù)
deviceName()
獲取。若數(shù)據(jù)源包含多個(gè)設(shè)備,可通過(guò)判斷設(shè)備名稱(chēng)分別進(jìn)行數(shù)據(jù)映射。若全部設(shè)備數(shù)據(jù)映射到一個(gè)孿生節(jié)點(diǎn)的物模型,上傳多個(gè)設(shè)備的數(shù)據(jù)時(shí),會(huì)進(jìn)行數(shù)據(jù)覆蓋,孿生節(jié)點(diǎn)物模型顯示最后上傳的數(shù)據(jù)。
- 若無(wú)需處理數(shù)據(jù)且數(shù)據(jù)源數(shù)據(jù)格式為JSON,可不使用腳本文件解析數(shù)據(jù),直接編輯輸出文件,進(jìn)行數(shù)據(jù)映射。
腳本和輸出示例
本文以通過(guò)設(shè)備Topic上報(bào)的屬性數(shù)據(jù)為例,輸入數(shù)據(jù)如下:
{
"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":{
}
}
解析和處理數(shù)據(jù)的示例如下:
//通過(guò)payload函數(shù),獲取設(shè)備上報(bào)的消息內(nèi)容,并按照J(rèn)SON格式轉(zhuǎn)換。
var payload = payload("json");
//定義Map類(lèi)型數(shù)據(jù),存儲(chǔ)鍵值對(duì)數(shù)據(jù)。
var data = {};
//獲取位置的latitude值并且+1,將計(jì)算后的值存入data。
data["k1"] = payload.items.Position.value.latitude + 1;
//將Power的值進(jìn)行轉(zhuǎn)換,on轉(zhuǎn)換成1,否則為0。
if (payload.items.Power.value == "on") {
data["k2"] = 1;
} else {
data["k2"] = 0;
}
//獲取items的值。
data["items"] = payload.items;
//在data中添加一個(gè)常量stage1.stage2。
data["stage1.stage2"] = 1.3;
//返回解析后的數(shù)據(jù)data。
return data;
將腳本解析返回的data數(shù)據(jù),作為輸出文件的數(shù)據(jù)源,使用以下JSON格式,配置數(shù)據(jù)映射,示例如下:
[
{
//key值對(duì)應(yīng)data數(shù)據(jù)中的字段。
"key": "k1",
//iotId值對(duì)應(yīng)孿生節(jié)點(diǎn)ID。
"iotId": "xx***",
//孿生節(jié)點(diǎn)下的功能屬性標(biāo)識(shí)符,獲取key對(duì)應(yīng)字段的輸出值,即節(jié)點(diǎn)“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"
}
]