php使用socket通过tcp通信及php16进制求和校验位计算

需求:

php项目需要通过tcp链接给中间件发送16进制数据指令(包含校验位 16进制求和校验)

实现:

首先说下16进制求和校验,这个用php怎么做。

比如有如下24位16进制数据:

02 09 01 00 55 55 00 02 77 23 49 9b
 
9b为 前22位数据16进制求和取的低两位数据:
 
               //计算校验位 $m 为数据
               $dexArr = explode(' ',$m);
               foreach ($dexArr as $key => $value) {
                   $dexArr[$key] = hexdec($value);
               }
               $ck2 = dechex(array_sum($dexArr));
               $check = substr($ck2,strlen($ck2)-2,2);

先转化为10进制求和再转化为16进制取低两位。

准备好数据后,socket 如何发送数据呢。

先将16进制的数据转化为2个一个的数组,再发送出去,同理,收到的2进制数据根据需要转换。

        // 将16进制数据转换成两个一组的数组 如 02 09 01 00 55 55 00 02 77 23 49 9b
$ctlcmdStrArray
= str_split(str_replace(' ', '', $ctlcmd), 2);

// 创建Socket ipv4 tcp 流数据 $socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp")); if (socket_connect($socket, "127.0.0.1", 8888)) { //连接 for ($j = 0; $j < count($sendStrArray); $j++) { socket_write($socket, chr(hexdec($sendStrArray[$j]))); // 逐组数据发送 } $receiveStr = ""; $receiveStr = socket_read($socket, 1024, PHP_BINARY_READ); // 采用2进制方式接收数据 $receiveStrHex = bin2hex($receiveStr); // 将2进制数据转换成16进制 }else{
// 链接失败
return false; } socket_close($socket); // 关闭Socket

猜你喜欢

转载自www.cnblogs.com/kala00k/p/12686664.html