php 物联网项目,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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值