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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM