php - 使用PHP套接字向多个客户端发送和接收数据

标签 php sockets php-socket

我正在使用SocketServer.class.php从我的服务器接收数据并将其发送到远程客户端。它仅与一个客户端完美地结合使用。
客户端是一个数字仪表,它使用与其连接的GPRS调制解调器通过TCP/IP发送数据。每个仪表都使用其仪表ID进行区分,其ID的范围为1到247,并且以ASCII格式传递和接收数据。
PHP代码在Windows命令 shell 程序中运行,并将输入的读数保存到数据库中。
现在,当尝试对ID为1和2的两个仪表执行相同操作时,它将不起作用。我不知道该如何进行。我将附加到现在为止已执行的代码。

    <?php

require_once("SocketServer.class.php"); // Include the File
    $server = new SocketServer("192.168.1.5",5001); // Create a Server binding to the given ip address and listen to port 5001for connections
    $server->max_clients = 247; // Allow no more than 247 people to connect at a time

    $server->hook("CONNECT","handle_connect"); // Run handle_connect every time someone connects
    $server->hook("INPUT","handle_input");// Run handle_input whenever text is sent to the server

/*  //main loop
for($i=1; $i<=247; $i++) {  




    }*/
$server->infinite_loop(); // Run Server Code Until Process is terminated.*/

/*$server   ->  loop_once();*/


function handle_connect(&$server,&$client,$input)
{
    SocketServer::socket_write_smart($client->socket,"String","");
}

function handle_input($server,&$client,$input)
{


        // You probably want to sanitize your inputs here
        $trim = trim($input); // Trim the input, Remove Line Endings and Extra Whitespace.

        saveInput($input); // this function would save the values to database as it is received
        $output =   "65030063002F"; //65 -> Meter ID 101 in HEX 03 -> function 0063 -> start register 002F -> Number of registers
        $hexad  =   hexToStr($output);
        $hexad  .=  crc16($hexad);
        echo $hexad;
        SocketServer::socket_write_smart($client->socket,&$hexad,"");

}
function saveInput($input)
{
        $res = strToHex($input);
        for ($i=0; $i < strlen($res)-1; $i+=2)
        {
            $string[] = $res[$i].$res[$i+1];
        }
        if(hexdec($string[0]) > 0 && hexdec($string[0]) < 248) {
        echo "Meter --> ".hexdec($string[0])."<br>";
        echo "Function --> ".hexdec($string[1])."<br>";
        $byte = hexdec($string[2]);
        echo "Byte Count --> ".$byte."<br>";
/*      $l=40100; 
            for($k=3; $k<($byte+3); $k+=2) {

        echo "Register $l --> ".hexdec($string[$k].$string[$k+1])."<br>";
        $l++;
        }*/
        echo "<br>";
        }
}
function hexToStr($hex)
{
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2)
    {
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}
function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= str_pad(dechex(ord($string[$i])),2,"0",STR_PAD_LEFT);

    }
    $hex = trim($hex);
    return $hex;
}
 function crc16($data)
 {
   $crc = 0xFFFF;
   for ($i = 0; $i < strlen($data); $i++)
   {
     $crc ^=ord($data[$i]);

        for ($j = 8; $j !=0; $j--)
        {
            if (($crc & 0x0001) !=0)
            {
                $crc >>= 1;
                $crc ^= 0xA001;
            }
            else
                $crc >>= 1;
        }
    }   
    $crc = dechex($crc);
    $order = str_split($crc, 2);
    $order = array_reverse($order);
    $crc    =   implode($order);
    $crc    =   hexToStr($crc);
   return $crc;
 }
?>

返回值全部以十六进制存储。有没有更好的方法可以做到这一点。

我想将65030063002FFC2C作为输入发送到电表101,将66030063002FFC1F作为输入发送给ID为“102”的电表,以此类推。仅当仪表ID在仪表输入处匹配时,才会将相应的读数返回到服务器。我已经尝试了很多天了,但是由于我是PHP套接字的新手,并且对它的了解很少,所以很难。

最佳答案

因此,由于尚无人回答,因此我进行了一些挖掘并找到了解决方法。但是它包括一个循环。因此,距离只有几米。我可以使用套接字写入和for循环将数据发送到仪表。不能使上面的代码起作用的部分是,在发送仪表100秒钟的请求数据包时,它实际上接收了前8个字节,而拒绝了其余的字节。因此,我增加了sleep(1)的延迟,并且代码的工作方式像魅力一样

关于php - 使用PHP套接字向多个客户端发送和接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38872558/

相关文章:

node.js - 我的 ExpressJS 网站和 socket.io 端口可以使用相同的端口吗?

ssl - 带 SSL/TLS 的 PHP 套接字 - 无法使用合适的共享密码

php - 如何从连接到本地网络的设备获取数据到我的应用程序

php - 如何正确地将来自 mysql 的数据放入 <ul><li> 中?

java - 没有收到服务器的响应

python - 编程 https 代理卡住了 - 下一步该怎么做?

php - localhost/test.php 什么都不返回

php - 组合多个类会导致 PHP 出现错误?

javascript - 根据另一个选项隐藏/显示下拉菜单