1.创建文件
extend\parse\Parse.php
2.使用方法
use parse\Parse;
public function index()
{
$model = new Parse();
$model->run($str);
}
3.类定义
<?php
namespace parse;
class Parse
{
public function run($str)
{
$str = '7e020000省略23137303039373937399f7e';
$str = hex2bin($str);
$data16Arrays = $this->getTo16Bytes($str);
foreach ($data16Arrays as $key => $data16Array) {
$MessageId = $this->getMessageIdNumber($data16Array);
$equipmentNumber = $this->getEquipmentNumber($data16Array);
if ($MessageId == '0200' && $equipmentNumber) {
$alarm_message = $this->getAlarmMessage($data16Array, 13);
$status = $this->getPositionStatus($data16Array, 17);
$latitude = $this->getLatitude($data16Array, 21, 'i');
$longitude = $this->getLongitude($data16Array, 25, 'i');
$height = $this->getHeight($data16Array, 29);
$speed = $this->getSpeed($data16Array, 31);
$direction = $this->getDirection($data16Array, 33);
$datetime = $this->getDatetime($data16Array, 35);
$data = [
'equipment_Number' => $equipmentNumber,
'alarm_message' => $alarm_message,
'status' => $status,
'latitude' => $latitude,
'longitude' => $longitude,
'height' => $height,
'speed' => $speed,
'direction' => $direction,
'datetime' => $datetime
];
dd($data);
}
}
}
public static $sequenceNumber = 0;
public function get10Bytes($string) {
$bytes = array();
$len = strlen($string);
for ($i = 0; $i < $len; $i++) {
array_push($bytes, ord($string[$i]));
}
return $bytes;
}
public function getTo16Bytes($data) {
$content = bin2hex($data);
$res = explode('7e7e', $content);
$array = [];
if (count($res) > 1) {
foreach ($res as $k => $v) {
if ($k == reset($res)) {
$array[$k] = str_split($v . '7e', 2);
} else if ($k == end($res)) {
$array[$k] = str_split('7e' . $v, 2);
} else {
$array[$k] = str_split('7e' . $v . '7e', 2);
}
}
} else {
$array[] = str_split($res[0], 2);
}
return $array;
}
public function supplementZero($data) {
$len = count($data);
$res = [];
for ($j = 0; $j < $len; $j++) {
if (strlen($data[$j]) == 1) {
$res[$j] = "0x" . "0" . $data[$j];
} else {
$res[$j] = "0x" . $data[$j];
}
}
return $res;
}
public function bytesToInt($data) {
$res = [];
foreach ($data as $k => $v) {
$res[$k] = intval(base_convert($v, 16, 10));
}
$temp0 = $res[0] & 0xFF;
$temp1 = $res[1] & 0xFF;
$temp2 = $res[2] & 0xFF;
$temp3 = $res[3] & 0xFF;
return (($temp0 << 24) + ($temp1 << 16) + ($temp2 << 8) + $temp3);
}
public function bcdToString($data) {
$len = count($data);
$temp = "";
for ($i = 0; $i < $len; $i++) {
$temp .= (($data[$i] & 0xf0) >> 4);
$temp .= ($data[$i] & 0x0f);
}
return (substr($temp, 0, 1) == 0) ? substr($temp, 1) : $temp;
}
public function getSensorId($data) {
$sensorArray = array_slice($data, 3, 6);
$sensorArrayZero = $this->supplementZero($sensorArray);
$res = [];
foreach ($sensorArrayZero as $k => $v) {
$res[$k] = intval(base_convert($v, 16, 10));
}
$string = $this->bcdToString($res);
return $string;
}
public function twoBytesToInteger($data) {
$res = [];
foreach ($data as $k => $v) {
$res[$k] = intval(base_convert($v, 16, 10));
}
$temp0 = $res[0] & 0xFF;
$temp1 = $res[1] & 0xFF;
return (($temp0 << 8) + $temp1);
}
public function getNum($data, $a = 0) {
$numArray = array_slice($data, $a, 4);
$res = $this->bytesToInt($numArray);
return $res;
}
public function getEveryXor($data) {
$len = count($data);
$rew = 0;
for ($i = 1; $i < $len; $i++) {
$rew = $rew ^ $data[$i];
}
return $rew;
}
public function checkCode($data) {
$sum = 0;
unset($data[0]);
foreach ($data as $k => $v) {
$sum = $sum ^ hexdec($v);
}
return str_pad(dechex($sum), 2, "0", STR_PAD_LEFT);
}
public function bytesArrayToString($data) {
$str = '';
foreach ($data as $ch) {
$str .= chr($ch);
}
return $str;
}
public function arrayToBytes($data) {
$ret = implode($data);
return hex2bin($ret);
}
public function getTurnStr($str, $n = 1, $char = '0') {
for ($i = 0; $i < $n; $i++) {
$str = $char . $str;
}
return $str;
}
public function getTwoStr($data) {
$str = array();
$req = array();
foreach ($data as $key => $value) {
$str[$key] = base_convert($data[$key], 16, 2);
$leng = 8 - strlen($str[$key]);
$req[] = $this->getTurnStr($str[$key], $leng, "0");
}
$rtq = implode("", $req);
return $rtq;
}
public function getEquipmentNumber($data, $length = 12) {
$equipmentArray = array_slice($data, 5, 6);
$res = [];
foreach ($equipmentArray as $k => $v) {
$res[$k] = base_convert($v, 16, 10);
}
$equipmentNumber = $this->bcdToString($res);
return str_pad($equipmentNumber, $length, "0", STR_PAD_LEFT);
}
public function getEquipmentNumberArray($data) {
$num_array = array_slice($data, 5, 6);
return $num_array;
}
public function getAlarmMessage($data, $index, $type = false) {
$alarmArray = $this->getTwoStr(array_slice($data, $index, 4));
if ($type == true) {
if (substr($alarmArray, -8, 1) == 1) {
$alarm = "主电源断电";
} elseif (substr($alarmArray, -30, 1) == 1) {
$alarm = "碰撞预警";
} elseif (substr($alarmArray, -31, 1) == 1) {
$alarm = "侧翻预警";
}
else {
$alarm = "一切正常";
}
}
return $alarmArray;
}
public function getPositionStatus($data, $index, $type = false) {
$positionArray = $this->getTwoStr(array_slice($data, $index, 4));
if ($type == true) {
$isPosition = substr($positionArray, -2, 1) == 0 ? $isPosition = "未定位" : $isPosition = "定位";
$isNorSou = substr($positionArray, -3, 1) == 0 ? $isNorSou = "北纬" : $isNorSou = "南纬";
$isEasWes = substr($positionArray, -4, 1) == 0 ? $isEasWes = "东经" : $isEasWes = "西经";
if (substr($positionArray, -19, 1) == 1 && substr($positionArray, -20, 1) == 0) {
$positionMethod = "北斗定位";
} elseif (substr($positionArray, -19, 1) == 0 && substr($positionArray, -20, 1) == 1) {
$positionMethod = "GPS定位";
} elseif (substr($positionArray, -19, 1) == 1 && substr($positionArray, -20, 1) == 1) {
$positionMethod = "北斗GPS双定位";
} else {
$positionMethod = "北斗GPS都未定位";
}
$positionStatusArray = array(
'position' => $isPosition,
'ns' => $isNorSou,
'ew' => $isEasWes,
'gps' => $positionMethod,
);
return $positionStatusArray;
} else {
return $positionArray;
}
}
public function getLatitude($data, $index, $type = 'f') {
$latitudeBytes = array_slice($data, $index, 4);
$latitude = $this->bytesToInt($latitudeBytes);
if ($type == 'f') {
$number = $latitude / pow(10, 6);
}
if ($type == 'i') {
$number = $latitude;
}
return $number;
}
public function getLongitude($data, $index, $type = 'f') {
$longitudeBytes = array_slice($data, $index, 4);
$longitude = $this->bytesToInt($longitudeBytes);
if ($type == 'f') {
$number = $longitude / pow(10, 6);
}
if ($type == 'i') {
$number = $longitude;
}
return $number;
}
public function getHeight($data, $index) {
$heightBytes = array_slice($data, $index, 2);
$height = $this->twoBytesToInteger($heightBytes);
return $height;
}
public function getSpeed($data, $index) {
$speedBytes = array_slice($data, $index, 2);
$speed = $this->twoBytesToInteger($speedBytes);
return $speed;
}
public function getDirection($data, $index) {
$directionBytes = array_slice($data, $index, 2);
$direction = $this->twoBytesToInteger($directionBytes);
return $direction;
}
public function getDatetime($data, $index) {
$datetimeArray = array_slice($data, $index, 6);
$res = [];
foreach ($datetimeArray as $k => $v) {
$res[$k] = base_convert($v, 16, 10);
}
$datetime = $this->bcdToString($res);
$datetimeStr = "20" . substr($datetime, 0, 2) . "-" . substr($datetime, 2, 2) . "-" . substr($datetime, 4, 2) . " " . substr($datetime, 6, 2) . ":" . substr($datetime, 8, 2) . ":" . substr($datetime, 10, 2);
return $datetimeStr;
}
public function getSequenceNumberArray() {
$number = $this->$sequenceNumber++;
if ($number > 65025) {
$number = 1;
}
$get16Number = base_convert($number, 10, 16);
$af = substr($get16Number, 0, 2);
$bf = substr($get16Number, 2);
$systemNumber = [];
if ($number > 0xff) {
$systemNumber = array('0x' . $af, '0x' . $bf);
} else {
$systemNumber = array('0x00', '0x' . $get16Number);
}
foreach ($systemNumber as $k => $v) {
$systemNumber[$k] = intval(base_convert($v, 16, 10));
}
return $systemNumber;
}
public function getMessageNumberArray($data) {
$messageNumber = array_slice($data, 11, 2);
return $messageNumber;
}
public function getMessageIdArray($data) {
$messageId = array_slice($data, 1, 2);
return $messageId;
}
public function getMessageIdNumber($data, $length = 4) {
$messageArray = array_slice($data, 1, 2);
$res = [];
foreach ($messageArray as $k => $v) {
$res[$k] = base_convert($v, 16, 10);
}
$messageNumber = $this->bcdToString($res);
return str_pad($messageNumber, $length, "0", STR_PAD_LEFT);
}
public function getMessageBodyArray($data) {
$messageNumber = $this->getMessageNumberArray($data);
return $messageNumber;
}
public function getVerifyNumberArray($data, $auth = '31313131') {
$ret = array('00');
$messageId = $this->getMessageIdArray($data);
$messageid = implode($messageId);
$messageBody = $this->getMessageBodyArray($data);
if ($messageid == '0100') {
$arrayStartFiveBytes = array('7E', '81', '00');
$jianquan = str_split($auth, 2);
$messageBody = array_merge($messageBody, $ret, $jianquan);
} else {
$arrayStartFiveBytes = array('7E', '80', '01');
$jianquan = [];
$messageBody = array_merge($messageBody, $messageId, $ret, $jianquan);
}
$equipmentNumber = $this->getEquipmentNumberArray($data);
$systemNumbers = $this->getMessageNumberArray($data);
$msglength = count(array_merge($systemNumbers, $messageId, $ret, $jianquan));
$msglength = decbin($msglength);
$attr = sprintf("%016d", $msglength);
$attr_str = str_pad(dechex(bindec($attr)), 4, '0', STR_PAD_LEFT);
$attrarray = str_split($attr_str, 2);
$array_attr = array_merge($arrayStartFiveBytes, $attrarray);
$arrayStartAndEquipmentNumber = array_merge($array_attr, $equipmentNumber);
$startEquipmentAndSystemNumber = array_merge($arrayStartAndEquipmentNumber, $systemNumbers);
$startEquipmentSystemAndMessageBody = array_merge($startEquipmentAndSystemNumber, $messageBody);
$dataAndRet = $startEquipmentSystemAndMessageBody;
$dataAndRetXor = $this->checkCode($dataAndRet);
$arrayEndTwoBytes = array($dataAndRetXor, '7E');
$completeArray = array_merge($dataAndRet, $arrayEndTwoBytes);
$sendClientStr = $this->arrayToBytes($completeArray);
return $sendClientStr;
}
}