[设备]PHP的异或校验/BCC校验函数

 public function test()
    {
        //bin2hex
        //ASCII 字符的字符串转换为十六进制值
        $data = strtolower('04129da167763b');
        $command = substr($data, 0, 2);
        //异或检验和
        //去掉后两位,校验
        $wb = substr($data, 0, -2);
        //获取后两位
        $last_two = mb_substr(strval($data), -2, 2);
        $check = $this->sumCheck($wb);
        if($check == $last_two){
            //通过
            //04 命令字段 转2进制
            //12 9d a1 设备唯一ID
            $imei = substr($data, 2, 6);
            //67 状态字段 转2进制
            $state = str_pad(base_convert(substr($data, 8, 2), 16, 2), 8, "0", STR_PAD_LEFT);
            //电量
            $dl = substr($state, 0, 7);
            //使用状态
            $use = substr($state, 7, 1);
            //74 信号强度
            $signal = substr($data, 10, 2);
            
            //回复
            $ack = '05'.$imei.'01';
            $ackData = $ack.$this->sumCheck($ack);
            print_r($command);exit;
        } else {
            //未通过
        }
    }
    

function BlueCode_BCCXOR($str){
        $split_length = 2;
        $len = strlen($str);
        $End = 0;
        for($i = 0; $i < $len; $i+=$split_length){
            $s = substr($str, $i, $split_length);
            $End = $End ^ hexdec($s);
        }
        $End = strtoupper(str_pad(dechex($End), '2', '0', STR_PAD_LEFT));
        return $End;
    }
调用:

echo BlueCode_BCCXOR("5504A15F00");
输出:AF
在线异或校验/BCC校验工具:https://www.metools.info/code/c48.html
引用 https://www.bluecode.cn/show-621.html
function DataIn($fd, $data = '')
    {
        $config = new \EasySwoole\Mysqli\Config([
            'host'          => '',
            'port'          => '',
            'user'          => '',
            'password'      => '',
            'database'      => '',
            'timeout'       => 5,
            'charset'       => 'utf8mb4',
        ]);
        //echo "fd:{$fd} send:{$data}\n";
        $command = substr($data, 0, 2);
        if($command == '04'){
            //异或检验和
            //去掉后两位,校验
            $wb = substr($data, 0, -2);
            //获取后两位
            $last_two = mb_substr(strval($data), -2, 2);
            $check = $this->sumCheck($wb);
            //echo "check:{$check} last_two:{$last_two}\n";
            if($check == $last_two){
                //通过
                //04 命令字段 转2进制
                //12 9d a1 设备唯一ID
                $imei = substr($data, 2, 6);
                //echo "imei:{$imei}\n";
                //67 状态字段 转2进制
                $state = str_pad(base_convert(substr($data, 8, 2), 16, 2), 8, "0", STR_PAD_LEFT);
                //电量
                $dl = base_convert(substr($state, 0, 7), 2, 10);
                //echo "dl:{$dl}\n";
                //使用状态
                $use = substr($state, 7, 1);
                //echo "use:{$use}\n";
                //74 信号强度
                $signal = base_convert(substr($data, 10, 2), 16, 10);
                //echo "signal:{$signal}\n";
                $client = new \EasySwoole\Mysqli\Client($config);
                $client->queryBuilder()->where('imei', $imei)->getOne('jq_device');
                $result = $client->execBuilder();
                if($result){
                    $client->queryBuilder()->where('imei', $imei)->update('jq_device', ['fd' => $fd,'createtime' => date('Y-m-d H:i:s', time())]);
                } else {
                    $client->queryBuilder()->insert('jq_device', ['fd' => $fd, 'imei' => $imei, 'dl' => $dl, 'use' => $use, 'signal' => $signal, 'content' => $data, 'createtime' => date('Y-m-d H:i:s', time())]);
                }
                $client->execBuilder();
                //file_put_contents('./log.txt', date("Y-m-d H:i:s") . " 设备:" . $imei . "\r\n电量:".$dl."\r\n使用状态:".$use."\r\n信号强度:".$signal."\r\n", FILE_APPEND);
                //回复
                $ack = '05'.$imei.'01';
                $ackData = $ack.$this->sumCheck($ack);
                $resString = "";
                $dataArr = str_split($ackData, 2);
                foreach ($dataArr as $k => $v) {
                    $resString .= chr(hexdec('0x' . $v));
                }
                $info = ServerManager::getInstance()->getSwooleServer()->connection_info($fd);
                if (is_array($info)) {
                    ServerManager::getInstance()->getSwooleServer()->send($fd, $resString);
                } else {
                    $this->response()->write("fd {$fd} not exist");
                }
            } else {
                //未通过
            }
        }
    }

47 thoughts on “[设备]PHP的异或校验/BCC校验函数

  1. Я бы смотрел не на топы, а на авторов обзоров. У Генриха Лидова на gir-casi.fun тексты с нормальными пояснениями — где можно играть, а где лучше не рисковать.

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Back To Top

鄂ICP备17008157号-1