2016-08-10 6 views
0

私はSocketServer.class.phpを使用して、自分のサーバーからリモートクライアントにデータを送信し、リモートクライアントに送信します。 1つのクライアントで完全に動作します。 クライアントは、GPRSモデムを使用してTCP/IPを介してデータを送信するデジタルメーターです。各メーターはメーターID(1〜247の範囲)を使用して区別され、データはASCIIで渡されて呼び出されます。 PHPコードは、Windowsのコマンドシェルで実行され、入力値をデータベースに保存します。 ID 1とID 2の2メートルで同じことをしようとすると、機能しません。私はどのように進めるか分かりません。私は今までに実行したコードを添付しています。PHPソケットを使用して複数のクライアントにデータを送受信する

<?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; 
} 
?> 

戻り値はすべて16進数で格納されます。これを行うためのより良い方法はありますか?

メーターをメーター10166030063002FFC1Fの入力にIDとして `102 'というメーターの入力として送りたいとします。メーターIDがメーター入力で一致した場合にのみ、対応する読み取り値をサーバーに返します。私はこれを数日にわたって理解しようとしてきましたが、PHPソケットが初めてで、同じことについてほとんど知識がないので難しいです。

答えて

0

誰もまだ答えていないので、私はいくつかの掘り出し物をして、その周りに道を得ました。しかしそれはループを含んでいます。そこで数メートルの距離がありました。 socket writeとforループを使ってデータをメーターに送ることができました。上記のコードを動作させなかった部分は、100パケットのリクエストパケットを送信していましたが、実際には最初の8バイトを受信し、残りを拒否します。だから私は睡眠(1)と遅延を追加し、コードは魅力のように働いた

関連する問題