腳本的解析能力包括獲取消息內(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ù)
  • 自定義Topic和物模型屬性上報(bào)Topic:物聯(lián)網(wǎng)平臺(tái)是基于Topic中的數(shù)據(jù)格式來(lái)處理和傳遞數(shù)據(jù)的。設(shè)備Topic數(shù)據(jù)格式說(shuō)明,請(qǐng)參見(jiàn)數(shù)據(jù)格式
  • 數(shù)據(jù)服務(wù)中數(shù)據(jù)解析的數(shù)據(jù)源:物聯(lián)網(wǎng)平臺(tái)是基于數(shù)據(jù)解析后的JSON數(shù)據(jù)格式來(lái)處理和傳遞數(shù)據(jù)的。
    數(shù)據(jù)格式示例為:
    {
        "payload":{
            "key1":"value1",
            "key2":"value2"
        },
        "ts":1623516625000
    }
    • payload:固定系統(tǒng)字段,其下字段(例如:key1、key2)數(shù)據(jù)為數(shù)據(jù)解析任務(wù)中經(jīng)過(guò)輸入和功能節(jié)點(diǎn)解析后的輸出字段數(shù)據(jù)。
    • ts:固定系統(tǒng)字段,是數(shù)據(jù)解析任務(wù)中數(shù)據(jù)的處理時(shí)間戳(UTC時(shí)間,單位為毫秒)。
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ō)明

腳本文件

腳本文件名稱(chēng)默認(rèn)為 transformScript.txt,腳本編寫(xiě)方法如下:
  1. 在腳本文件中,通過(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");
  2. 因腳本輸出數(shù)據(jù)是JSON格式的鍵值對(duì),所以可以定義Map類(lèi)型數(shù)據(jù),存儲(chǔ)鍵值對(duì)數(shù)據(jù)。
    var data = {};
  3. 獲取payload中屬性值,可以根據(jù)需要處理和計(jì)算數(shù)據(jù)后,將數(shù)據(jù)存入data。
  4. 返回解析后的數(shù)據(jù)data。
    return data;

輸出文件

輸出文件名稱(chēng)默認(rèn)為 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"
  }  
]