Tous les produits
Search
Centre de documentation

IoT Platform:Exemple de script JavaScript

Dernière mise à jour :Aug 09, 2026

Cette rubrique présente un modèle et un exemple de script JavaScript pour l'analyse des données du langage de spécification des objets (TSL).

Modèle de script

Analysez les données TSL à l'aide d'un script JavaScript basé sur le modèle suivant :

Remarque

Ce modèle s'applique uniquement aux produits dont le paramètre

Data Format

est défini sur

Custom

.

/**
 * Convert Alink data to data that can be recognized by a device when IoT Platform sends data to the device.
 * jsonObj: the input parameter. The value is a JSON object that cannot be empty. 
 * rawData: the output parameter. The value is a byte array that cannot be empty. 
 *
 */
function protocolToRawData(jsonObj) {
    return rawdata;
}

/**
 * Convert custom data of a device to Alink data when the device submits data to IoT Platform. 
 * rawData: the input parameter. The value is a byte array that cannot be empty. 
 * jsonObj: the output parameter. The value is a JSON object that cannot be empty. 
 */
function rawDataToProtocol(rawData) {
    return jsonObj;
}
            

Consignes de rédaction du script

  • N'utilisez pas de variables globales afin d'éviter toute incohérence des résultats.

  • Le script traite les données via l'opération du complément à deux. La plage de compléments pour les valeurs comprises entre [-128,127] est [0,255]. Par exemple, le complément de -1 correspond à 255 en décimal.

  • La fonction rawDataToProtocol analyse les données soumises par les appareils. Le paramètre d'entrée de cette fonction est un tableau d'entiers. Effectuez une opération ET bit à bit avec 0xFF pour obtenir le complément.

  • La fonction protocolToRawData analyse les données envoyées par IoT Platform et renvoie le résultat sous forme de tableau. Chaque élément du tableau doit être un entier compris dans la plage [0,255].

Exemple de script

L'exemple de script ci-dessous repose sur les propriétés et le protocole définis dans la rubrique Soumettre un script d'analyse de message de modèle TSL :

Pour plus d'informations sur les types de données pris en charge par les modèles TSL, consultez la rubrique Types de données pris en charge. Lorsqu'un appareil soumet des données de propriété ou d'événement TSL, IoT Platform génère une réponse au format Alink JSON. Avant d'envoyer cette réponse à l'appareil, IoT Platform utilise le script pour convertir les données dans un format compréhensible par l'appareil. Pour en savoir plus sur le format Alink JSON, consultez la rubrique Propriétés, événements et services des appareils.

var COMMAND_REPORT = 0x00; // Submit properties. 
var COMMAND_SET = 0x01; // Configure properties. 
var COMMAND_REPORT_REPLY = 0x02; // The data submission result. 
var COMMAND_SET_REPLY = 0x03; // The property setting result. 
var COMMAD_UNKOWN = 0xff;    // Unknown commands. 
var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; // The topic that is used by devices to submit property data to IoT Platform. 
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; // The topic that is used by IoT Platform to send a property setting command to devices. 
var ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set'; // The topic that is used by devices to submit the property setting results to IoT Platform. 
var SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  // Define the following custom topic: /user/update. 
var SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' // Define the following custom topic: /user/update/error. 
/*
Sample data:
Submit property data
Input:
    0x000000000100320100000000
Output:
    {"method":"thing.event.property.post","id":"1","params":{"prop_float":0,"prop_int16":50,"prop_bool":1},"version":"1.0"}

Result of property setting
Input:
    0x0300223344c8
Output:
    {"code":"200","data":{},"id":"2241348","version":"1.0"}
*/
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();
    var fHead = uint8Array[0]; // command
    if (fHead == COMMAND_REPORT) {
        jsonMap['method'] = ALINK_PROP_REPORT_METHOD; // The topic that is used to submit properties. Data format: Alink JSON. 
        jsonMap['version'] = '1.0'; // The version of the protocol. This value is fixed. Data format: Alink JSON. 
        jsonMap['id'] = '' + dataView.getInt32(1); // The ID of the request. Data format: Alink JSON. 
        var params = {};
        params['prop_int16'] = dataView.getInt16(5); // The value of the prop_int16 property of the product. 
        params['prop_bool'] = uint8Array[7]; // The value of the prop_bool property of the product. 
        params['prop_float'] = dataView.getFloat32(8); // The value of the prop_float property of the product. 
        jsonMap['params'] = params; // The params field. Data format: Alink JSON. 
    } else if(fHead == COMMAND_SET_REPLY) {
        jsonMap['version'] = '1.0'; // The version of the protocol. This value is fixed. Data format: Alink JSON. 
        jsonMap['id'] = '' + dataView.getInt32(1); // The ID of the request. Data format: Alink JSON. 
        jsonMap['code'] = ''+ dataView.getUint8(5);
        jsonMap['data'] = {};
    }

    return jsonMap;
}
/*
Sample data:
Send downstream commands to configure device properties
Input:
    {"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}
Output:
    0x0100003039014d0142f6e76d

Result of data submission
Input:
    {"method":"thing.event.property.post","id":"12345","version":"1.0","code":200,"data":{}}
Output:
    0x0200003039c8
*/
function protocolToRawData(json) {
    var method = json['method'];
    var id = json['id'];
    var version = json['version'];
    var payloadArray = [];
    if (method == ALINK_PROP_SET_METHOD) // Configure properties. 
    {
        var params = json['params'];
        var prop_float = params['prop_float'];
        var prop_int16 = params['prop_int16'];
        var prop_bool = params['prop_bool'];
        // Concatenate raw data based on the custom protocol format. 
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); // The command field. 
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // The ID of the request. Data format: Alink JSON. 
        payloadArray = payloadArray.concat(buffer_int16(prop_int16)); // The value of the prop_int16 property. 
        payloadArray = payloadArray.concat(buffer_uint8(prop_bool)); // The value of the prop_bool property. 
        payloadArray = payloadArray.concat(buffer_float32(prop_float)); // The value of the prop_float property. 
    } else if (method == ALINK_PROP_REPORT_METHOD) { // The response. 
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_REPORT_REPLY)); // The command field. 
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // The ID of the request. Data format: Alink JSON. 
        payloadArray = payloadArray.concat(buffer_uint8(code));
    } else { // Unknown commands. These commands are not processed. 
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_UNKOWN)); // The command field. 
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // The ID of the request. Data format: Alink JSON. 
        payloadArray = payloadArray.concat(buffer_uint8(code));
    }
    return payloadArray;
}

/*
  Sample data
  Use the following custom topic to submit data:
     /user/update. 
  Input:
     topic:/{productKey}/{deviceName}/user/update
     bytes: 0x000000000100320100000000
  Output:
  {
     "prop_float": 0,
     "prop_int16": 50,
     "prop_bool": 1,
     "topic": "/{productKey}/{deviceName}/user/update"
   }
 */
function transformPayload(topic, 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 = {};

    if(topic.includes(SELF_DEFINE_TOPIC_ERROR_FLAG)) {
        jsonMap['topic'] = topic;
        jsonMap['errorCode'] = dataView.getInt8(0)
    } else if (topic.includes(SELF_DEFINE_TOPIC_UPDATE_FLAG)) {
        jsonMap['topic'] = topic;
        jsonMap['prop_int16'] = dataView.getInt16(5);
        jsonMap['prop_bool'] = uint8Array[7];
        jsonMap['prop_float'] = dataView.getFloat32(8);
    }

    return jsonMap;
}

// The following code describes helper functions: 
function buffer_uint8(value) {
    var uint8Array = new Uint8Array(1);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setUint8(0, value);
    return [].slice.call(uint8Array);
}
function buffer_int16(value) {
    var uint8Array = new Uint8Array(2);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt16(0, value);
    return [].slice.call(uint8Array);
}
function buffer_int32(value) {
    var uint8Array = new Uint8Array(4);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setInt32(0, value);
    return [].slice.call(uint8Array);
}
function buffer_float32(value) {
    var uint8Array = new Uint8Array(4);
    var dv = new DataView(uint8Array.buffer, 0);
    dv.setFloat32(0, value);
    return [].slice.call(uint8Array);
}