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