Fournit un modèle de script PHP et un exemple de script pour l'analyse des messages du langage de spécification des objets (TSL).
Modèle de script
Utilisez le modèle suivant pour rédiger un script PHP qui analyse les messages TSL :
Ce modèle de script s'applique uniquement aux produits dont le paramètre
Data Type
est défini sur
Custom
.
<?php
/**
* Convert Alink JSON data to data that can be recognized by a device when IoT Platform sends downstream data.
* $jsonObj: the input parameter. The value is a JSON object that indicates an association array.
* $rawData: the output parameter. The value is an array of integers within a value range of [0,255]. Array elements cannot be empty.
*/
function protocolToRawData($jsonObj)
{
$rawData = array();
return $rawData;
}
/**
* Convert custom data of a device to Alink JSON data when the device submits data to IoT Platform.
* $rawData: the input parameter. The value is an array of integers.
* $jsonObj: the output parameter. The value is a JSON object that indicates an association array. The value of each key must be a string. However, the string cannot consist of only digits such as 10. Key values cannot be empty.
*/
function rawDataToProtocol($rawData)
{
$jsonObj = array();
return $jsonObj;
}
/**
* Convert the data that is sent by a device to a custom topic to JSON data when the device submits data to IoT Platform.
* $topic: the input parameter that specifies the topic to which the device sends messages. The value is a string.
* $rawData: the input parameter. The value is an array of integers.
* $jsonObj: the output parameter. The value is a JSON object that indicates an association array. The value of each key must be a string. However, the string cannot consist of only digits such as 10. Key values cannot be empty.
*/
function transformPayload($topic, $rawData)
{
$jsonObj = array();
return $jsonObj;
}
Remarques relatives à la rédaction de scripts
N'utilisez pas de variables globales ou statiques. Dans le cas contraire, les résultats risquent d'être incohérents.
Le script traite les données à l'aide 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 est 255 en décimal.
La fonction rawDataToProtocol analyse les messages soumis par les appareils. Le paramètre d'entrée de la fonction est un tableau d'entiers. Utilisez
0xFFpour l'opération ET binaire afin d'obtenir le complément. Le résultat renvoyé est un tableau associatif. Chaque valeur de clé doit contenir des caractères non numériques. Par exemple, si une valeur de clé est 10, le tableau PHP récupère l'entier 10.La fonction protocolToRawData analyse les messages descendants envoyés par IoT Platform, puis renvoie un tableau. Le tableau doit être un tableau PHP standard. Chaque élément du tableau doit être un entier compris dans la plage de valeurs [0,255].
La fonction transformPayload analyse les données envoyées vers des rubriques personnalisées. Le paramètre d'entrée de la fonction est un tableau d'entiers. Utilisez
0xFFpour l'opération ET binaire afin d'obtenir le complément. Le résultat renvoyé est un tableau associatif. Chaque valeur de clé doit contenir des caractères non numériques. Par exemple, si une valeur de clé est 10, le tableau PHP récupère l'entier 10.L'environnement d'exécution PHP impose une gestion stricte des exceptions. Si une erreur se produit, la logique suivante n'est pas exécutée. Pour garantir la robustesse du code, capturez et gérez les exceptions.
Exemple de script
L'exemple de script suivant est rédigé sur la base des propriétés et du 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. Après qu'un appareil a soumis des données de propriété TSL ou des données d'événement, IoT Platform génère une réponse dont les données sont au format JSON Alink. Avant d'envoyer la réponse à l'appareil, IoT Platform utilise le script pour convertir le format des données en un format reconnu par l'appareil. Pour plus d'informations sur le format JSON Alink, consultez la rubrique Propriétés, événements et services des appareils.
<?php
/*
Sample data:
Device data submission
Input:
0x0000000001003201
Output:
{"method":"thing.event.property.post","id":"1","params":{"prop_int16":50,"prop_bool":1},"version":"1.0"}
Result of property setting
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]; // The command field.
if ($fHead == 0x00) {
$jsonMap['method'] = 'thing.event.property.post '; // 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'] = '' . getInt32($data, 1); // The ID of the request. Data format: Alink JSON.
$params = [];
$params['prop_int16'] = getInt16($data, 5); // The value of the prop_int16 property of the product.
$params['prop_bool'] = $data[7]; // The value of the prop_bool property of the product.
$jsonMap['params'] = params; // The params field. Data format: Alink JSON.
} else if ($fHead == 0x03) {
$jsonMap['version'] = '1.0'; // The version of the protocol. This value is fixed. Data format: Alink JSON.
$jsonMap['id'] = '' . getInt32($data, 1); // The ID of the request. Data format: Alink JSON.
$jsonMap['code'] = getInt8($data, 5);
}
return $jsonMap;
}
/*
Sample data:
Property setting
Input:
{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_int16":333, "prop_bool":1}}
Output:
0x013039014d01
Result of device data submission:
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 ') // Configure properties.
{
$params = $json['params'];
$prop_int16 = $params['prop_int16'];
$prop_bool = $params['prop_bool'];
// Concatenate raw data based on the custom protocol format.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0x01))); // The command field.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); // The ID of the request. Data format: Alink JSON.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($prop_int16))); // The value of the prop_int16 property.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($prop_bool))); // The value of the prop_bool property.
} else if ($method == 'thing.event.property.post ') { // The response.
$code = $json['code'];
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0x02))); // The command field.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); // The ID of the request. Data format: Alink JSON.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($code)));
} else { // Unknown commands. The commands are not run.
$code = $json['code'];
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0xff))); // The command field.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); // The ID of the request. Data format: Alink JSON.
$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($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)
{
$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;
}