全部产品
Search
文档中心

:Kode JavaScript contoh yang digunakan untuk mengurai data kustom

更新时间:Nov 09, 2025

Saat menulis kode untuk mengurai data kustom dari suatu produk, pastikan kode mencakup skrip untuk mengurai data topik kustom dan skrip untuk mengurai data Thing Specification Language (TSL). Topik ini menyediakan contoh kode JavaScript yang lengkap.

var COMMAND_REPORT = 0x00; // Mengirimkan properti. 
var COMMAND_SET = 0x01; // Mengonfigurasi properti. 
var COMMAND_REPORT_REPLY = 0x02; // Hasil pengiriman data. 
var COMMAND_SET_REPLY = 0x03; // Hasil pengaturan properti. 
var COMMAD_UNKOWN = 0xff;    // Perintah tidak dikenal. 
var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; // Topik yang digunakan oleh perangkat untuk mengirimkan data properti ke IoT Platform. 
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; // Topik yang digunakan oleh IoT Platform untuk mengirimkan perintah pengaturan properti ke perangkat. 
var ALINK_PROP_SET_REPLY_METHOD = 'thing.service.property.set'; // Topik yang digunakan oleh perangkat untuk mengirimkan hasil pengaturan properti ke IoT Platform. 
var SELF_DEFINE_TOPIC_UPDATE_FLAG = '/user/update'  // Tentukan topik kustom berikut: /user/update. 
var SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' // Tentukan topik kustom berikut: /user/update/error. 
/*
Data contoh:
Mengirimkan data properti
Input:
    0x000000000100320100000000
Output:
    {"method":"thing.event.property.post","id":"1","params":{"prop_float":0,"prop_int16":50,"prop_bool":1},"version":"1.0"}

Hasil pengaturan properti
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; // Topik yang digunakan untuk mengirimkan properti. Format data: Alink JSON. 
        jsonMap['version'] = '1.0'; // Versi protokol. Nilai ini tetap. Format data: Alink JSON. 
        jsonMap['id'] = '' + dataView.getInt32(1); // ID permintaan. Format data: Alink JSON. 
        var params = {};
        params['prop_int16'] = dataView.getInt16(5); // Nilai properti prop_int16 dari produk. 
        params['prop_bool'] = uint8Array[7]; // Nilai properti prop_bool dari produk. 
        params['prop_float'] = dataView.getFloat32(8); // Nilai properti prop_float dari produk. 
        jsonMap['params'] = params; // Bidang params. Format data: Alink JSON. 
    } else if(fHead == COMMAND_SET_REPLY) {
        jsonMap['version'] = '1.0'; // Versi protokol. Nilai ini tetap. Format data: Alink JSON. 
        jsonMap['id'] = '' + dataView.getInt32(1); // ID permintaan. Format data: Alink JSON. 
        jsonMap['code'] = ''+ dataView.getUint8(5);
        jsonMap['data'] = {};
    }

    return jsonMap;
}
/*
Data contoh:
Mengirimkan perintah downstream untuk mengonfigurasi properti perangkat
Input:
    {"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}
Output:
    0x0100003039014d0142f6e76d

Hasil pengiriman data
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) // Mengonfigurasi properti. 
    {
        var params = json['params'];
        var prop_float = params['prop_float'];
        var prop_int16 = params['prop_int16'];
        var prop_bool = params['prop_bool'];
        // Menggabungkan data mentah berdasarkan format protokol kustom. 
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); // Bidang perintah. 
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ID permintaan. Format data: Alink JSON. 
        payloadArray = payloadArray.concat(buffer_int16(prop_int16)); // Nilai properti prop_int16. 
        payloadArray = payloadArray.concat(buffer_uint8(prop_bool)); // Nilai properti prop_bool. 
        payloadArray = payloadArray.concat(buffer_float32(prop_float)); // Nilai properti prop_float. 
    } else if (method == ALINK_PROP_REPORT_METHOD) { // Tanggapan. 
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_REPORT_REPLY)); // Bidang perintah. 
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ID permintaan. Format data: Alink JSON. 
        payloadArray = payloadArray.concat(buffer_uint8(code));
    } else { // Perintah tidak dikenal. Perintah ini tidak diproses. 
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_UNKOWN)); // Bidang perintah. 
        payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // ID permintaan. Format data: Alink JSON. 
        payloadArray = payloadArray.concat(buffer_uint8(code));
    }
    return payloadArray;
}

/*
  Data contoh
  Gunakan topik kustom berikut untuk mengirimkan 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;
}

// Kode berikut menjelaskan fungsi pembantu: 
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);
}