在物聯網業務情境中,對於低配置且資源受限或者對網路流量有要求的裝置,不適合直接構造JSON資料與物聯網平台通訊,可將原資料透傳到物聯網平台。物聯網平台提供資料解析功能,可以根據您提交的指令碼,先將資料在裝置自訂格式和JSON格式之間轉換,再進行業務處理。
背景資訊
資料解析流程圖如下所示。
本文以環境資料擷取裝置為例,為您介紹資料解析具體操作步驟。
裝置端接入物聯網平台
登入物聯網平台控制台。
在執行個體概覽頁簽的全部環境下,找到對應的執行個體,單擊執行個體卡片。
在左側導覽列,選擇環境監測感應器。 ,單擊建立產品,建立一個產品:
資料格式選擇透傳/自訂,其他使用預設設定。參數詳細說明,請參見建立產品。
產品建立成功後,單擊前往定義物模型,添加物模型,然後發布上線。
在左側導覽列,選擇裝置,單擊添加裝置,在環境監測感應器產品下添加裝置:Esensor。
裝置建立成功後,擷取裝置認證資訊(ProductKey、DeviceName和DeviceSecret)。
開發裝置端,並測試回合。
本樣本使用物聯網平台提供的Node.js SDK開發裝置,並設定裝置端類比上報訊息,測試回合裝置端SDK。開發方法,請參見裝置接入和上報資料。
裝置端開發更多操作說明,請參見裝置接入Link SDK。
SDK開發範例程式碼如下:
const mqtt = require('aliyun-iot-mqtt'); // 1. 裝置身份資訊 var options = { productKey: "g18lk****", deviceName: "Esensor", deviceSecret: "c39fe9dc32f97bfd753******b", host: "iot******.mqtt.iothub.aliyuncs.com" }; // 1. 建立串連 const client = mqtt.getAliyunIotMqttClient(options); // 2. 監聽雲端指令 client.subscribe(`/${options.productKey}/${options.deviceName}/user/get`) client.on('message', function(topic, message) { console.log("topic " + topic) console.log("message " + message) }) setInterval(function() { // 3.上報環境資料 const payloadArray = new Buffer.from([0xaa,0x1f,0xc8,0x00,0x00,0x37,0x10,0xff,0x00,0x05,0xd7,0x6b,0x15,0x00,0x1c,0x01,0x34,0x00,0xad,0x04,0xff,0xff,0x04,0x00,0xff,0xff,0x18,0x00,0x30,0x00,0xff,0x2e]) client.publish(`/sys/${options.productKey}/${options.deviceName}/thing/model/up_raw`, payloadArray, { qos: 0 }); }, 5 * 1000);
裝置端成功接入物聯網平台後,在物聯網平台控制台對應執行個體下的裝置頁面,該裝置狀態顯示為線上。
單擊裝置Esensor操作欄的查看,單擊物模型資料。如下圖所示,因產品資料格式為透傳/自訂,類比上報的標準物模型資料不能在運行狀態頁簽顯示。
在
頁面的雲端作業記錄頁簽下,查看該裝置的裝置到雲訊息中對應的Hex格式訊息內容。本樣本中,Hex格式訊息內容為:
0xaa1fc800003710ff0005d76b15001c013400ad04ffff0400ffff18003000ff2e
。
編寫資料解析指令碼
在物聯網平台控制台,編輯、提交指令碼,並類比資料解析。
在物聯網平台控制台對應執行個體下的左側導覽列,選擇 。
在產品頁面,單擊產品對應的查看。
在產品詳情頁面,單擊訊息解析頁簽。
在訊息解析頁簽下的編輯指令碼輸入框中,輸入資料解析指令碼。
根據裝置資料協議內容編寫解析指令碼。本樣本中的裝置資料訊息體結構如下表所示。
Byte
說明
備忘
12
PM2.5值低位元組
返回:PM2.5值,取值範圍0~999ug/m3。
13
PM2.5值高位元組
14
溫度值*10低位元組
返回:溫度值,取值範圍-10°C~50°C。
15
溫度值*10高位元組
16
濕度值低位元組
返回:濕度值,取值範圍0~99%。
17
濕度值高位元組
18
二氧化碳含量低位元組
返回:二氧化碳含量,取值範圍0~9999mg/m3。
19
二氧化碳含量高位元組
22
甲醛含量*100低位元組
返回:甲醛含量,取值範圍0~9.99。
23
甲醛含量*100高位元組
28
照度值低位元組
返回:照度值,單位lux。
29
照度值高位元組
樣本中的環境採集裝置只有資料上報功能,因此只需要編寫上行資料解析函數rawDataToProtocol,無需實現protocolToRawData。可以將透傳後的資料轉寄到屬性、服務或事件。本樣本中將資料轉寄到屬性。
var PROPERTY_REPORT_METHOD = 'thing.event.property.post'; //上行資料,自訂格式轉物模型JSON格式。 function rawDataToProtocol(bytes) { var uint8Array = new Uint8Array(bytes.length); for (var i = 0; i < bytes.length; i++) { uint8Array[i] = bytes[i] & 0xff; } var dataView = new DataView(uint8Array.buffer, 0); var jsonMap = new Object(); //屬性上報method。 jsonMap['method'] = PROPERTY_REPORT_METHOD; //協議版本號碼,固定欄位,取值1.0。 jsonMap['version'] = '1.0'; //表示該次請求的ID。 jsonMap['id'] = new Date().getTime(); var params = {}; //12、13對應產品屬性中PM2.5。 params['PM25'] = (dataView.getUint8(13)*256+dataView.getUint8(12)); //14、15對應產品屬性中temperature。 params['temperature'] = (dataView.getUint8(15)*256+dataView.getUint8(14))/10; //16、17對應產品屬性中humidity。 params['humidity'] = (dataView.getUint8(17)*256+dataView.getUint8(16)); //18、19對應產品屬性中co2。 params['co2'] = (dataView.getUint8(19)*256+dataView.getUint8(18)); //22、23對應產品屬性中甲醛hcho。 params['hcho'] = (dataView.getUint8(23)*256+dataView.getUint8(22))/100; //28、29對應產品屬性中光照lightLux。 params['lightLux'] = (dataView.getUint8(29)*256+dataView.getUint8(28)); jsonMap['params'] = params; return jsonMap; } //下行指令,物模型JSON格式轉自訂格式。 function protocolToRawData(json) { var payloadArray = [1];//此裝置只有上報資料功能,無法接收雲端指令。 return payloadArray; } //將裝置自訂Topic資料轉換為JSON格式資料。 function transformPayload(topic, rawData) { var jsonObj = {} return jsonObj; }
測試資料解析。
選擇類比類型為裝置上報資料。
在類比輸入下的輸入框中,輸入一個類比資料。
類比資料可使用測試回合裝置端後,在Log Service頁面,查看到的裝置端上報資料的Hex格式內容。例如:
0xaa1fc800003710ff0005d76b15001c013400ad04ffff0400ffff18003000ff2e
。單擊執行 。
右側運行結果欄顯示解析結果如下圖所示。
確認指令碼能正確解析資料後,單擊提交,將指令碼提交到物聯網平台。
調試裝置上報資料
指令碼提交後,再次運行裝置端SDK指令碼進行調實驗證。
裝置端向物聯網平台上報資料後,物聯網平台會呼叫指令碼進行資料解析。您可在
頁面的雲端作業記錄頁簽下,查看裝置上報資料進行資料解析的日誌。解析後的資料將顯示在裝置對應裝置詳情頁面的
頁簽下。附:物模型TSL
{
"schema": "https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json",
"profile": {
"version": "1.0",
"productKey": "g4****"
},
"properties": [
{
"identifier": "lightLux",
"name": "光照強度",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "照度",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "微克每立方米",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "甲醛",
"accessMode": "rw",
"desc": "HCHOValue",
"required": false,
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "百萬分率",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "二氧化碳",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "毫克每立方米",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "濕度",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "溫度",
"accessMode": "rw",
"desc": "電機工作溫度",
"required": false,
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
],
"events": [
{
"identifier": "post",
"name": "post",
"type": "info",
"required": true,
"desc": "屬性上報",
"method": "thing.event.property.post",
"outputData": [
{
"identifier": "lightLux",
"name": "光照強度",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "照度",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "微克每立方米",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "甲醛",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "百萬分率",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "二氧化碳",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "毫克每立方米",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "濕度",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "溫度",
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
]
}
],
"services": [
{
"identifier": "set",
"name": "set",
"required": true,
"callType": "async",
"desc": "屬性設定",
"method": "thing.service.property.set",
"inputData": [
{
"identifier": "lightLux",
"name": "光照強度",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "照度",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "微克每立方米",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "甲醛",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "百萬分率",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "二氧化碳",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "毫克每立方米",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "濕度",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "溫度",
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
],
"outputData": []
},
{
"identifier": "get",
"name": "get",
"required": true,
"callType": "async",
"desc": "屬性擷取",
"method": "thing.service.property.get",
"inputData": [
"lightLux",
"PM25",
"hcho",
"co2",
"humidity",
"temperature"
],
"outputData": [
{
"identifier": "lightLux",
"name": "光照強度",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "照度",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "微克每立方米",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "甲醛",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "百萬分率",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "二氧化碳",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "毫克每立方米",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "濕度",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "百分比",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "溫度",
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
]
}
]
}