$value){ $bin .= sprintf('%02X',$value); if($space) $bin .= ' '; } return trim($bin); } private static function packValue( $value ){ if($value['cmd'] == 0x02){ return pack('C1',$value['result']); } elseif($value['cmd'] == 0x04){ return pack('C1',$value['result']); } elseif($value['cmd'] == 0x09){ return pack('C1n1',$value['type'],$value['data']); } elseif($value['cmd'] == 0x01 || $value['cmd'] == 0xBC){ return pack('H*', $value['data']); } else{ return false; } } private static function unpackValue( $cmd, $value, $length ){ if($cmd == 0x01){ //设备注册 if($length == 6) return array('uid' => self::bin2str($value,false) ); else return null; } elseif($cmd == 0x05){ //设备心跳 return null; } elseif($cmd == 0x07){ //上报IMSI if($length == 21){ return array( 'uid' => self::bin2str(substr($value,0,6),false) , 'imsi' => substr($value,6,15) ); } else return null; } elseif($cmd == 0x08){ //设备响应 if($length == 2){ return array( 'type' => Ord(substr($value,0,1)) , 'result' => Ord(substr($value,1,1)) ); } else return null; } elseif($cmd == 0xbc){ //上报标签 if($length >= 14){ //解析设置的时间间隔,设置的设备数量 $setting = unpack('n1maxtime/n1maxlabels', substr($value,10,4)); //解析车辆信息 $count = ($length - 14)/14; $labels = array(); for($i=0;$i<$count;$i++){ //解析RFID $j = 14+$i*14; $rfid = self::bin2str(substr($value,$j,6),false); $j += 6; //解析SSD信号强度 $ssd = Ord(substr($value,$j,1)); //解析时间 $year1 = Ord(substr($value,$j+1,1)); $year2 = Ord(substr($value,$j+2,1)); $month = Ord(substr($value,$j+3,1)); $day = Ord(substr($value,$j+4,1)); $hour = Ord(substr($value,$j+5,1)); $minute = Ord(substr($value,$j+6,1)); $second = Ord(substr($value,$j+7,1)); $hour = sprintf('%02d',$hour); $minute = sprintf('%02d',$minute); $second = sprintf('%02d',$second); $time = date('Y-m-d').' '.$hour.':'.$minute.':'.$second; if(strtotime($time) > time()){ $time = date('Y-m-d H:i:s',strtotime('-1 day',strtotime($time))); } $info = array( 'rfid' => $rfid, 'ssd' => $ssd, 'time' => $time ); array_push($labels,$info); } return array( 'maxtime' => $setting['maxtime'], 'maxlabels' => $setting['maxlabels'], 'labels' => $labels ); } else return null; } elseif($cmd == 0xbd){ //上报报警 if($length == 1) return array('v' => self::bin2str($value) ); else return null; } return $value; } public static function decode( $buffer ){ //解码头部数据 $unpack_head = unpack('C1magic/C1cmd/n1length', $buffer); $unpack_head['method'] = sprintf("method%'04x",$unpack_head['cmd']); //判断头部引导符 if( $unpack_head['magic'] != 0xEC ) return null; //判断最后结尾符 if( Ord(substr($buffer,-1)) != 0x68 ) return null; //判断签名是否正确 //如果长度等于0则没有值数据 if($unpack_head['length'] == 0) return $unpack_head; //解码值数据 $value = substr($buffer,4,$unpack_head['length']); $unpack_value = self::unpackValue($unpack_head['cmd'],$value,$unpack_head['length']); if(!$unpack_value) return null; //头部+值一起返回 return array_merge($unpack_head,$unpack_value); } public static function encode( $value ){ $pack_value = self::packValue($value); $length = strlen($pack_value); $sign = $value['cmd'] + $length; for($i=0;$i