需求:
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