zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Docker
    Docker
    Docker
    Docker
    Docker
    Docker
    pandas——向已经存在的excel数据写入data
    python——利用UI选择路径
    python——装饰器的使用
    python——生成器(协程)gevent多任务
  • 原文地址:https://www.cnblogs.com/kala00k/p/12686664.html
Copyright © 2011-2022 走看看