全部產品
Search
文件中心

IoT Platform:雲端解析裝置透傳資料

更新時間:Jun 30, 2024

在物聯網業務情境中,對於低配置且資源受限或者對網路流量有要求的裝置,不適合直接構造JSON資料與物聯網平台通訊,可將原資料透傳到物聯網平台。物聯網平台提供資料解析功能,可以根據您提交的指令碼,先將資料在裝置自訂格式和JSON格式之間轉換,再進行業務處理。

背景資訊

資料解析流程圖如下所示。

iot

本文以環境資料擷取裝置為例,為您介紹資料解析具體操作步驟。

裝置端接入物聯網平台

  1. 登入物聯網平台控制台

  2. 執行個體概覽頁簽的全部環境下,找到對應的執行個體,單擊執行個體卡片。

  3. 在左側導覽列,選擇裝置管理 > 產品,單擊建立產品,建立一個產品:環境監測感應器

    資料格式選擇透傳/自訂,其他使用預設設定。參數詳細說明,請參見建立產品

  4. 產品建立成功後,單擊前往定義物模型,添加物模型,然後發布上線。

    本文提供了樣本的物模型TSL內容,您可大量匯入,請參見大量新增物模型物模型屬性

  5. 在左側導覽列,選擇裝置,單擊添加裝置,在環境監測感應器產品下添加裝置:Esensor

    裝置建立成功後,擷取裝置認證資訊(ProductKey、DeviceName和DeviceSecret)。

  6. 開發裝置端,並測試回合。

    本樣本使用物聯網平台提供的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操作欄的查看,單擊物模型資料。如下圖所示,因產品資料格式為透傳/自訂,類比上報的標準物模型資料不能在運行狀態頁簽顯示。

    運行狀態

    監控營運 > Log Service頁面的雲端作業記錄頁簽下,查看該裝置的裝置到雲訊息中對應的Hex格式訊息內容。

    本樣本中,Hex格式訊息內容為:0xaa1fc800003710ff0005d76b15001c013400ad04ffff0400ffff18003000ff2e

編寫資料解析指令碼

在物聯網平台控制台,編輯、提交指令碼,並類比資料解析。

  1. 在物聯網平台控制台對應執行個體下的左側導覽列,選擇裝置管理 > 產品

  2. 產品頁面,單擊產品對應的查看

  3. 產品詳情頁面,單擊訊息解析頁簽。

  4. 訊息解析頁簽下的編輯指令碼輸入框中,輸入資料解析指令碼。

    根據裝置資料協議內容編寫解析指令碼。本樣本中的裝置資料訊息體結構如下表所示。

    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;
    }
  5. 測試資料解析。

    1. 選擇類比類型為裝置上報資料

    2. 類比輸入下的輸入框中,輸入一個類比資料。

      類比資料可使用測試回合裝置端後,在Log Service頁面,查看到的裝置端上報資料的Hex格式內容。例如:0xaa1fc800003710ff0005d76b15001c013400ad04ffff0400ffff18003000ff2e

    3. 單擊執行

      右側運行結果欄顯示解析結果如下圖所示。

      裝置上報資料

  6. 確認指令碼能正確解析資料後,單擊提交,將指令碼提交到物聯網平台。

調試裝置上報資料

指令碼提交後,再次運行裝置端SDK指令碼進行調實驗證。

裝置端向物聯網平台上報資料後,物聯網平台會呼叫指令碼進行資料解析。您可在監控營運 > Log Service頁面的雲端作業記錄頁簽下,查看裝置上報資料進行資料解析的日誌。Log Service

解析後的資料將顯示在裝置對應裝置詳情頁面的物模型資料 > 運行狀態頁簽下。

運行狀態

附:物模型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"
            }
          }
        }
      ]
    }
  ]
}