Es posible que los dispositivos con recursos limitados no puedan construir datos en formato JSON del Thing Specification Language (TSL). Puede transmitir datos sin procesar a IoT Platform y utilizar la función de análisis de datos para convertir la información entre formatos personalizados del dispositivo y JSON, mediante scripts que usted envíe.
Contexto
La siguiente figura muestra el flujo de datos entre dispositivos y servidores.

Este ejemplo utiliza un dispositivo de recolección de datos ambientales.
Conectar un dispositivo a IoT Platform
Inicie sesión en la consola de IoT Platform IoT Platform console.
En la página Overview, localice la instancia que desea gestionar y haga clic en el ID o nombre de la instancia.
-
En el panel de navegación izquierdo, seleccione . En la página Products, haga clic en Create Product para crear un producto. En este ejemplo, se crea un producto llamado EnvSensor.
Establezca el parámetro Data Type en Custom. Utilice los valores predeterminados para los demás parámetros. Para obtener más información, consulte Create a product.
-
Una vez creado el producto, haga clic en Define TSL para agregar funciones TSL. Posteriormente, publique el modelo TSL.
En este ejemplo se proporciona un TSL model de muestra. Puede usar el modelo TSL para agregar varias funciones TSL al mismo tiempo. Para obtener más información, consulte Import a TSL model.
El modelo TSL debe incluir las siguientes seis propiedades personalizadas:
Temperature (identificador
temperature, float, valores válidos: -10 a 50)Humidity (identificador
humidity, int32, valores válidos: 0 a 100)Carbon dioxide (identificador
co2, int32, valores válidos: 0 a 10000)Formaldehyde (identificador
hcho, float, valores válidos: 0 a 10)PM25 (identificador
PM25, int32, valores válidos: 0 a 1000)Illuminance (identificador
lightLux, float, valores válidos: 0 a 10000)
-
En el panel de navegación izquierdo, seleccione Devices > Devices. En la página Devices, haga clic en Device List. En la pestaña Device List, haga clic en Add Device para crear un dispositivo para el producto EnvSensor. En este ejemplo, se crea un dispositivo llamado Esensor.
Después de crear el dispositivo, obtenga la información del certificado del dispositivo. Esta información incluye ProductKey, DeviceName y DeviceSecret.
-
Configure un dispositivo y realice una prueba.
Utilice un Link SDK para simular un dispositivo y enviar mensajes a IoT Platform. En este ejemplo se usa Link SDK for Node.js. Para obtener más información sobre cómo configurar un dispositivo, consulte Connect the device to IoT Platform and submit data.
Para obtener más información sobre cómo usar los Link SDK, consulte Device connection by using a Link SDK
Código de ejemplo:
const mqtt = require('aliyun-iot-mqtt'); // Specify information about the device certificate. var options = { productKey: "g18lk****", deviceName: "Esensor", deviceSecret: "c39fe9dc32f97bfd753******b", host: "iot******.mqtt.iothub.aliyuncs.com" }; // Establish a connection. const client = mqtt.getAliyunIotMqttClient(options); // Listen to commands from IoT Platform. client.subscribe(`/${options.productKey}/${options.deviceName}/user/get`) client.on('message', function(topic, message) { console.log("topic " + topic) console.log("message " + message) }) setInterval(function() { // Submit environmental data. 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);Después de conectar el dispositivo a IoT Platform, este pasa al estado Online. Puede consultar el estado en la página Devices de la instancia a la que está conectado el dispositivo.
Al ejecutar el SDK del dispositivo, el dispositivo Esensor aparece como Online en la lista de dispositivos de la página Devices en la consola de IoT Platform, y el interruptor Enabled se encuentra activado. Esto indica que el dispositivo se conectó correctamente a IoT Platform.
Haga clic en View en la columna Actions de Esensor. A continuación, haga clic en TSL Data. En este ejemplo, el tipo de datos del producto está configurado como Custom. Por lo tanto, los datos TSL enviados no se muestran en la pestaña Status.
Seleccione . En la pestaña Cloud run log, seleccione Device-to-cloud Messages para ver los mensajes enviados, los cuales se muestran en formato hexadecimal.
En este ejemplo, se muestran los siguientes datos:
0xaa1fc800003710ff0005d76b15001c013400ad04ffff0400ffff18003000ff2e.
Escribir un script de análisis de datos
Edite, envíe y depure scripts de análisis de datos en la consola de IoT Platform.
Inicie sesión en la consola de IoT Platform. Haga clic en el nombre de la instancia que desea gestionar. En el panel de navegación izquierdo de la página Instance Details, seleccione .
En la página Products, localice el producto y haga clic en View en la columna Actions.
En la página product details, haga clic en Message Analysis.
-
En la pestaña Message Analysis, escriba un script en el campo Edit Script.
Modifique el script según el protocolo de comunicación que utilice el dispositivo. La siguiente tabla describe la estructura del cuerpo del mensaje del dispositivo.
Byte
Descripción
Observaciones
12
Valor del byte bajo de la propiedad PM2.5
Devuelve el valor de la propiedad PM2.5. Valores válidos: 0 a 999. Unidad: ug/m3.
13
Valor del byte alto de la propiedad PM2.5
14
Valor del byte bajo de la propiedad temperature × 10
Devuelve el valor de la propiedad temperature. Valores válidos: -10 a 50. Unidad: °C.
15
Valor del byte alto de la propiedad temperature × 10
16
Valor del byte bajo de la propiedad humidity
Devuelve el valor de la propiedad humidity. Valores válidos: 0 a 99. Unidad: %.
17
Valor del byte alto de la propiedad humidity
18
Valor del byte bajo de la propiedad carbon dioxide
Devuelve el valor de la propiedad carbon dioxide. Valores válidos: 0 a 9999. Unidad: mg/m3.
19
Valor del byte alto de la propiedad carbon dioxide
22
Valor del byte bajo de la propiedad formaldehyde × 100
Devuelve el valor de la propiedad formaldehyde. Valores válidos: 0 a 9.99.
23
Valor del byte alto de la propiedad formaldehyde × 100
28
Valor del byte bajo de la propiedad illuminance
Devuelve el valor de la propiedad illuminance. Unidad: lux.
29
Valor del byte alto de la propiedad illuminance
Dado que el dispositivo en este ejemplo solo envía datos ambientales, únicamente necesita configurar la función rawDataToProtocol() para el análisis de datos ascendentes. La función protocolToRawData() no es necesaria. Los datos personalizados pueden convertirse en datos de propiedad, servicio o evento. Este ejemplo convierte datos personalizados en datos de propiedad.
var PROPERTY_REPORT_METHOD = 'thing.event.property.post'; // Submit upstream data. The following function converts data in a custom format into a TSL model in the JSON format. 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(); // Specify the request method. jsonMap['method'] = PROPERTY_REPORT_METHOD; // Specify the protocol version. Set the value to 1.0. jsonMap['version'] = '1.0'; // Specify the ID of the request. jsonMap['id'] = new Date().getTime(); var params = {}; // The values 12 and 13 are the values of the PM2.5 property. params['PM25'] = (dataView.getUint8(13)*256+dataView.getUint8(12)); // The values 14 and 15 are the values of the temperature property. params['temperature'] = (dataView.getUint8(15)*256+dataView.getUint8(14))/10; // The values 16 and 17 are the values of the humidity property. params['humidity'] = (dataView.getUint8(17)*256+dataView.getUint8(16)); // The values 18 and 19 are the values of the co2 property. params['co2'] = (dataView.getUint8(19)*256+dataView.getUint8(18)); // The values 22 and 23 are the values of the hcho property. params['hcho'] = (dataView.getUint8(23)*256+dataView.getUint8(22))/100; // The values 28 and 29 are the values of the lightLux property. params['lightLux'] = (dataView.getUint8(29)*256+dataView.getUint8(28)); jsonMap['params'] = params; return jsonMap; } // Send downstream commands. The following function converts a TSL model in the JSON format into data of a custom format. function protocolToRawData(json) { var payloadArray = [1];// The device can only submit data and cannot receive commands from IoT Platform. return payloadArray; } // Parse topic data in a custom format to Alink JSON data. function transformPayload(topic, rawData) { var jsonObj = {} return jsonObj; } -
Pruebe el análisis de datos.
Seleccione Upstreamed Device Data en la lista desplegable Simulation Type.
-
En la pestaña Input Simulation, introduzca los datos de prueba en el campo correspondiente.
Puede utilizar los datos hexadecimales enviados por el dispositivo como datos de prueba. Para ver los datos hexadecimales, vaya a la página Device Log. Ejemplo: 0xaa1fc800003710ff0005d76b15001c013400ad04ffff0400ffff18003000ff2e.
-
Haga clic en Run.
En la pestaña Parsing Results, el resultado del análisis se muestra en formato JSON. El campo
methodesthing.event.property.post, y el campoparamscontiene propiedades comohcho,pm25,lightLux,co2,temperatureyhumiditycon sus valores correspondientes.
Una vez que confirme que el script puede analizar correctamente los datos de prueba, haga clic en Submit para enviar el script a IoT Platform.
Depurar el dispositivo y enviar datos
Después de enviar el script, utilice el SDK del dispositivo para depurarlo.
Cuando el dispositivo envía datos a IoT Platform, la plataforma utiliza el script para analizarlos. Seleccione . En la pestaña Cloud run log, consulte los registros de análisis de datos.
En la pestaña Cloud run log de la consola de IoT Platform, puede consultar los registros completos del enlace para los datos enviados por el dispositivo Esensor. Las entradas de registro incluyen los siguientes tipos de negocio:
Mensajes de dispositivo a nube
Análisis de mensajes (RawDataToProtocol)
Análisis de mensajes (ProtocolToRaw)
Modelo TSL
Haga clic en View en la columna de contenido del mensaje del registro del modelo TSL para ver los datos JSON analizados. El campo params en ResultData contiene propiedades del sensor como PM25:21, co2:1197, temperature:28.4 y humidity:52. El campo Reason muestra success, lo que indica que tanto el envío de datos como el análisis del script se completaron correctamente.
Para ver los datos analizados, vaya a la página Device Details y seleccione .
La página muestra los datos analizados en tiempo real del dispositivo Esensor en formato de tarjeta, donde se presentan las siguientes seis propiedades:
Illuminance: 48 Lux
PM25: 21 μg/m³
Formaldehyde: 0.04 ppm
CarbonDioxide: 1197 mg/m³
humidity: 52%
temperature: 28.4℃
Ejemplo de datos TSL ascendentes
{
"schema": "https://iotx-tsl.oss-ap-southeast-1.aliyuncs.com/schema.json",
"profile": {
"version": "1.0",
"productKey": "g4****"
},
"properties": [
{
"identifier": "lightLux",
"name": "illuminance",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "luminous flux per unit area",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "micrograms per cubic meter",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "formaldehyde",
"accessMode": "rw",
"desc": "HCHOValue",
"required": false,
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "parts per million",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "carbon dioxide",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "milligrams per cubic meter",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "humidity",
"accessMode": "rw",
"required": false,
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "percentage",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "temperature",
"accessMode": "rw",
"desc": "motor working temperature",
"required": false,
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
],
"events": [
{
"identifier": "post",
"name": "post",
"type": "info",
"required": true,
"desc": "submit properties",
"method": "thing.event.property.post",
"outputData": [
{
"identifier": "lightLux",
"name": "illuminance",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "luminous flux per unit area",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "micrograms per cubic meter",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "formaldehyde",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "parts per million",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "carbon dioxide",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "milligrams per cubic meter",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "humidity",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "percentage",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "temperature",
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
]
}
],
"services": [
{
"identifier": "set",
"name": "set",
"required": true,
"callType": "async",
"desc": "set properties",
"method": "thing.service.property.set",
"inputData": [
{
"identifier": "lightLux",
"name": "illuminance",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "luminous flux per unit area",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "micrograms per cubic meter",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "formaldehyde",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "parts per million",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "carbon dioxide",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "milligrams per cubic meter",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "humidity",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "percentage",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "temperature",
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
],
"outputData": []
},
{
"identifier": "get",
"name": "get",
"required": true,
"callType": "async",
"desc": "obtain properties",
"method": "thing.service.property.get",
"inputData": [
"lightLux",
"PM25",
"hcho",
"co2",
"humidity",
"temperature"
],
"outputData": [
{
"identifier": "lightLux",
"name": "illuminance",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10000",
"unit": "Lux",
"unitName": "luminous flux per unit area",
"step": "0.1"
}
}
},
{
"identifier": "PM25",
"name": "PM25",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "1000",
"unit": "μg/m³",
"unitName": "micrograms per cubic meter",
"step": "1"
}
}
},
{
"identifier": "hcho",
"name": "formaldehyde",
"dataType": {
"type": "float",
"specs": {
"min": "0",
"max": "10",
"unit": "ppm",
"unitName": "parts per million",
"step": "0.1"
}
}
},
{
"identifier": "co2",
"name": "carbon dioxide",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "10000",
"unit": "mg/m³",
"unitName": "milligrams per cubic meter",
"step": "1"
}
}
},
{
"identifier": "humidity",
"name": "humidity",
"dataType": {
"type": "int",
"specs": {
"min": "0",
"max": "100",
"unit": "%",
"unitName": "percentage",
"step": "1"
}
}
},
{
"identifier": "temperature",
"name": "temperature",
"dataType": {
"type": "float",
"specs": {
"min": "-10",
"max": "50",
"unit": "℃",
"step": "0.1"
}
}
}
]
}
]
}