Saat menulis kode untuk mengurai data kustom dari suatu produk, pastikan kode tersebut mencakup skrip untuk mengurai data topik kustom dan skrip untuk mengurai data Thing Specification Language (TSL). Topik ini menyediakan contoh kode PHP.
<?php
/*
Data contoh:
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 dari produk.
$params['prop_bool'] = $data[7]; // Nilai properti prop_bool dari 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;
}
/*
Data contoh:
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 ') // Mengonfigurasi properti.
{
$params = $json['params'];
$prop_int16 = $params['prop_int16'];
$prop_bool = $params['prop_bool'];
// Menggabungkan 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 ') { // Respon.
$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;
}
/*
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)
{
$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;
}