全部产品
Search
文档中心

IoT Platform:Contoh skrip JavaScript

更新时间:Jul 02, 2025

Topik ini menyediakan template dan contoh skrip JavaScript yang dapat digunakan untuk mengurai data Thing Specification Language (TSL).

Template skrip

Anda dapat menulis skrip JavaScript untuk mengurai data TSL berdasarkan template berikut:

Catatan Template ini hanya berlaku untuk produk dengan parameter Data Format diatur ke Custom.
/**
 * Konversikan data Alink menjadi data yang dapat dikenali oleh perangkat ketika IoT Platform mengirimkan data ke perangkat.
 * jsonObj: parameter input. Nilainya adalah objek JSON yang tidak boleh kosong.
 * rawData: parameter output. Nilainya adalah larik byte yang tidak boleh kosong.
 *
 */
function protocolToRawData(jsonObj) {
    return rawdata;
}

/**
 * Konversikan data kustom perangkat menjadi data Alink ketika perangkat mengirimkan data ke IoT Platform.
 * rawData: parameter input. Nilainya adalah larik byte yang tidak boleh kosong.
 * jsonObj: parameter output. Nilainya adalah objek JSON yang tidak boleh kosong.
 */
function rawDataToProtocol(rawData) {
    return jsonObj;
}
            

Catatan untuk penulisan skrip

  • Hindari penggunaan variabel global karena dapat menyebabkan hasil yang tidak konsisten.
  • Skrip memproses data menggunakan operasi komplemen dua. Rentang nilai dalam rentang [-128,127] memiliki komplemen [0,255]. Sebagai contoh, komplemen dari -1 adalah 255 dalam desimal.
  • Fungsi rawDataToProtocol mengurai data yang dikirim oleh perangkat. Parameter input fungsi tersebut adalah larik integer. Gunakan 0xFF untuk operasi AND bitwise guna mendapatkan komplemen.
  • Fungsi protocolToRawData mengurai data yang dikirim oleh IoT Platform dan mengembalikan hasilnya dalam bentuk larik. Setiap elemen dalam larik harus berupa integer dalam rentang [0,255].

Contoh skrip

Contoh skrip berikut ditulis berdasarkan properti dan protokol yang didefinisikan dalam topik Kirimkan Skrip untuk Mengurai Data TSL:

Untuk informasi lebih lanjut tentang tipe data yang didukung oleh model TSL, lihat Tipe Data yang Didukung. Saat perangkat mengirimkan data properti TSL atau data acara, IoT Platform menghasilkan respons dalam format Alink JSON. Sebelum mengirimkan respons ke perangkat, IoT Platform menggunakan skrip untuk mengonversi format data menjadi format yang dapat dikenali oleh perangkat. Untuk detail lebih lanjut tentang format Alink JSON, lihat Properti Perangkat, Acara, dan Layanan.

var COMMAND_REPORT = 0x00; // Kirimkan properti.
var COMMAND_SET = 0x01; // Konfigurasikan 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'  // Definisikan topik kustom berikut: /user/update.
var SELF_DEFINE_TOPIC_ERROR_FLAG = '/user/update/error' // Definisikan topik kustom berikut: /user/update/error.
/*
Contoh data:
Kirimkan 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 produk.
        params['prop_bool'] = uint8Array[7]; // Nilai properti prop_bool produk.
        params['prop_float'] = dataView.getFloat32(8); // Nilai properti prop_float 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;
}
/*
Contoh data:
Kirimkan 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) // Konfigurasikan properti.
    {
        var params = json['params'];
        var prop_float = params['prop_float'];
        var prop_int16 = params['prop_int16'];
        var prop_bool = params['prop_bool'];
        // Gabungkan 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) { // Respons.
        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;
}

/*
  Contoh data
  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);
}