php透传接口,透传/自定义产品完整示例脚本(PHP)

透传/自定义产品的数据解析脚本需包含自定义Topic数据解析脚本和物模型数据解析脚本。本文提供完整的PHP语言示例脚本。

/*

示例数据:

设备上报数据:

传入参数:

0x0000000001003201

输出结果:

{"method":"thing.event.property.post","id":"1","params":{"prop_int16":50,"prop_bool":1},"version":"1.0"}

属性设置的返回结果:

传入参数:

0x0300223344c8

输出结果:

{"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]; //command字段。

if ($fHead == 0x00) {

$jsonMap['method'] = 'thing.event.property.post'; //ALink JSON格式,属性上报topic。

$jsonMap['version'] = '1.0'; //ALink JSON格式,协议版本号固定字段。

$jsonMap['id'] = '' . getInt32($data, 1); //ALink JSON格式,标示该次请求id值。

$params = [];

$params['prop_int16'] = getInt16($data, 5); //对应产品属性中prop_int16。

$params['prop_bool'] = $data[7]; //对应产品属性中prop_bool。

$jsonMap['params'] = $params; //ALink JSON格式,params标准字段。

} else if ($fHead == 0x03) {

$jsonMap['version'] = '1.0'; //ALink JSON格式,协议版本号固定字段。

$jsonMap['id'] = '' . getInt32($data, 1); //ALink JSON格式,标示该次请求id值。

$jsonMap['code'] = getInt8($data, 5);

}

return $jsonMap;

}

/*

示例数据:

属性设置:

传入参数:

{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_int16":333, "prop_bool":1}}

输出结果:

0x013039014d01

设备上报的返回结果:

传入数据:

{"method":"thing.event.property.post","id":"12345","version":"1.0","code":200,"data":{}}

输出结果:

0x023039c8

*/

function protocolToRawData($json)

{

$method = $json['method'];

$id = $json['id'];

$version = $json['version'];

$payloadArray = [];

if ($method == 'thing.service.property.set') //属性设置。

{

$params = $json['params'];

$prop_int16 = $params['prop_int16'];

$prop_bool = $params['prop_bool'];

//按照自定义协议格式拼接rawData。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0x01))); //command字段。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); //ALink JSON格式'id'。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($prop_int16))); //属性'prop_int16'的值。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($prop_bool))); //属性'prop_bool'的值。

} else if ($method == 'thing.event.property.post') { //设备上报数据返回结果。

$code = $json['code'];

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0x02))); //command字段。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); //ALink JSON格式'id'。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($code)));

} else { //未知命令,对于这些命令不做处理。

$code = $json['code'];

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(0xff))); //command字段。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex(intval($id)))); //ALink JSON格式'id'。

$payloadArray = concat($payloadArray, hexStringToByteArray(toHex($code)));

}

return $payloadArray;

}

/*

示例数据:

自定义Topic:

/user/update,上报数据。

输入参数:

topic: /{productKey}/{deviceName}/user/update

bytes: 0x000000000100320100000000

输出参数:

{

"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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值