Topik ini menyediakan template skrip PHP dan contoh skrip PHP yang dapat digunakan untuk mengurai pesan Thing Specification Language (TSL).
Template skrip
Anda dapat menulis skrip PHP berdasarkan template berikut untuk mengurai pesan TSL:
<?php
/**
* Konversikan data Alink JSON menjadi data yang dapat dikenali oleh perangkat saat IoT Platform mengirimkan data downstream.
* $jsonObj: parameter input. Nilainya adalah objek JSON yang menunjukkan array asosiasi.
* $rawData: parameter output. Nilainya adalah array integer dalam rentang nilai [0,255]. Elemen array tidak boleh kosong.
*/
function protocolToRawData($jsonObj)
{
$rawData = array();
return $rawData;
}
/**
* Konversikan data kustom perangkat menjadi data Alink JSON saat perangkat mengirimkan data ke IoT Platform.
* $rawData: parameter input. Nilainya adalah array integer.
* $jsonObj: parameter output. Nilainya adalah objek JSON yang menunjukkan array asosiasi. Nilai setiap key harus berupa string. Namun, string tersebut tidak boleh terdiri dari hanya angka seperti 10. Nilai key tidak boleh kosong.
*/
function rawDataToProtocol($rawData)
{
$jsonObj = array();
return $jsonObj;
}
/**
* Konversikan data yang dikirim oleh perangkat ke topik kustom menjadi data JSON saat perangkat mengirimkan data ke IoT Platform.
* $topic: parameter input yang menentukan topik ke mana perangkat mengirimkan pesan. Nilainya adalah string.
* $rawData: parameter input. Nilainya adalah array integer.
* $jsonObj: parameter output. Nilainya adalah objek JSON yang menunjukkan array asosiasi. Nilai setiap key harus berupa string. Namun, string tersebut tidak boleh terdiri dari hanya angka seperti 10. Nilai key tidak boleh kosong.
*/
function transformPayload($topic, $rawData)
{
$jsonObj = array();
return $jsonObj;
}Catatan untuk penulisan skrip
- Hindari penggunaan variabel global atau statis karena hasilnya mungkin tidak konsisten.
- Skrip ini digunakan untuk memproses data menggunakan operasi komplemen dua. Rentang nilai dalam [-128,127] memiliki komplemen dalam rentang [0,255]. Sebagai contoh, komplemen dari -1 adalah 255 dalam desimal.
- Fungsi rawDataToProtocol mengurai pesan yang dikirim oleh perangkat. Parameter input fungsi ini adalah array integer. Gunakan
0xFFuntuk operasi AND bitwise guna mendapatkan komplemen. Hasil yang dikembalikan adalah array asosiasi. Setiap nilai key harus berisi karakter non-array. Misalnya, jika nilai key adalah 10, array PHP akan mengambil integer 10. - Fungsi protocolToRawData mengurai pesan downstream yang dikirim oleh IoT Platform dan mengembalikan array. Array tersebut harus berupa array PHP biasa, dengan setiap elemen berupa integer dalam rentang [0,255].
- Fungsi transformPayload mengurai data yang dikirim ke topik kustom. Parameter input fungsi ini adalah array integer. Gunakan
0xFFuntuk operasi AND bitwise guna mendapatkan komplemen. Hasil yang dikembalikan adalah array asosiasi. Setiap nilai key harus berisi karakter non-array. Misalnya, jika nilai key adalah 10, array PHP akan mengambil integer 10. - Lingkungan runtime PHP sangat ketat dalam penanganan pengecualian. Jika terjadi kesalahan, logika berikutnya tidak akan dijalankan. Untuk memastikan kekokohan kode, tangkap dan proses semua kesalahan.
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. Setelah 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 informasi lebih lanjut tentang format Alink JSON, lihat Properti Perangkat, Acara, dan Layanan.
<?php
/*
Contoh data:
Pengiriman data perangkat
Input:
0x0000000001003201
Output:
{"method":"thing.event.property.post","id":"1","params":{"prop_int16":50,"prop_bool":1},"version":"1.0"}
Hasil pengaturan properti
Input:
0x0300223344c8
Output:
{"code":"200","id":"2241348","version":"1.0"}
*/
function rawDataToProtocol($bytes)
{
$data = [];
$length = count($bytes);
for ($i = 0; $i < $length; $i++) {
$data[$i] = $bytes[$i] & 0xff;
}
$jsonMap = [];
$fHead = $data[0]; // Bidang perintah.
if ($fHead == 0x00) {
$jsonMap['method'] = 'thing.event.property.post '; // 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'] = '' . getInt32($data, 1); // ID permintaan. Format data: Alink JSON.
$params = [];
$params['prop_int16'] = getInt16($data, 5); // Nilai properti prop_int16 produk.
$params['prop_bool'] = $data[7]; // Nilai properti prop_bool produk.
$jsonMap['params'] = params; // Bidang params. Format data: Alink JSON.
} else if ($fHead == 0x03) {
$jsonMap['version'] = '1.0'; // Versi protokol. Nilai ini tetap. Format data: Alink JSON.
$jsonMap['id'] = '' . getInt32($data, 1); // ID permintaan. Format data: Alink JSON.
$jsonMap['code'] = getInt8($data, 5);
}
return $jsonMap;
}
/*
Contoh data:
Pengaturan properti
Input:
{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_int16":333, "prop_bool":1}}
Output:
0x013039014d01
Hasil pengiriman data perangkat:
Input:
{"method":"thing.event.property.post","id":"12345","version":"1.0","code":200,"data":{}}
Output:
0x023039c8
*/
function protocolToRawData($json)
{
$method = $json['method'];
$id = $json['id'];
$version = $json['version'];
$payloadArray = [];
if ($method == 'thing.service.property.set ') // Atur properti.
{
$params = $json['params'];
$prop_int16 = $params['prop_int16'];
$prop_bool = $params['prop_bool'];
// Gabungkan data mentah berdasarkan format protokol kustom.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0x01))); // Bidang perintah.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); // ID permintaan. Format data: Alink JSON.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($prop_int16))); // Nilai properti prop_int16.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($prop_bool))); // Nilai properti prop_bool.
} else if ($method == 'thing.event.property.post ') { // Respons.
$code = $json['code'];
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0x02))); // Bidang perintah.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); // ID permintaan. Format data: Alink JSON.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($code)));
} else { // Perintah tidak dikenal. Perintah tidak dijalankan.
$code = $json['code'];
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0xff))); // Bidang perintah.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); // ID permintaan. Format data: Alink JSON.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($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)
{
$data = array();
$length = count($bytes);
for ($i = 0; $i < $length; $i++) {
$data[$i] = $bytes[$i] & 0xff;
}
$jsonMap = array();
if (strpos($topic, '/user/update/error') !== false) {
$jsonMap['topic'] = $topic;
$jsonMap['errorCode'] = getInt8($data, 0);
} else if (strpos($topic, '/user/update') !== false) {
$jsonMap['topic'] = $topic;
$jsonMap['prop_int16'] = getInt16($data, 5);
$jsonMap['prop_bool'] = $data[7];
}
return $jsonMap;
}
function getInt32($bytes, $index)
{
$array = array($bytes[$index], $bytes[$index + 1], $bytes[$index + 2], $bytes[$index + 3]);
return hexdec(byteArrayToHexString($array));
}
function getInt16($bytes, $index)
{
$array = array($bytes[$index], $bytes[$index + 1]);
return hexdec(byteArrayToHexString($array));
}
function getInt8($bytes, $index)
{
$array = array($bytes[$index]);
return hexdec(byteArrayToHexString($array));
}
function byteArrayToHexString($data)
{
$hexStr = '';
for ($i = 0; $i < count($data); $i++) {
$hexValue = dechex($data[$i]);
$tempHexStr = strval($hexValue);
if (strlen($tempHexStr) === 1) {
$hexStr = $hexStr . '0' . $tempHexStr;
} else {
$hexStr = $hexStr . $tempHexStr;
}
}
return $hexStr;
}
function hexStringToByteArray($hex)
{
$result = array();
$index = 0;
for ($i = 0; $i < strlen($hex) - 1; $i += 2) {
$result[$index++] = hexdec($hex[$i] . $hex[$i + 1]);
}
return $result;
}
function concat($array, $data)
{
return array_merge($array, $data);
}
function toHex($data)
{
$var = dechex($data);
$length = strlen($var);
if ($length % 2 == 1) {
$var = '0' . $var;
}
return $var;
}