0

接続を処理し、追跡ユニットから情報を読み取るための追跡スクリプトで忙しくしています。しかし、製造元が私に説明した方法は、ユニットが URL のような情報を送信し、7203 などの TCP ポートに接続するということです。

私の質問は次のとおりです。ポートを操作するときに、サーバーに接続するユニットでヘッダーを取得するにはどうすればよいですか? また、Linux コマンド ラインからコードを実行します。

以下は、ポートを開くために使用するコードです。

#!/usr/bin/php -q
<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    set_time_limit(0);
    ob_implicit_flush();
    $ip = 'IP of my server';
    $port = '7203';
    $__server_listening = true;

    declare(ticks = 1);

    become_daemon();

    /* nobody/nogroup, change to your host's uid/gid of the non-priv user 

    ** Comment by Andrew - I could not get this to work, i commented it out
       the code still works fine but mine does not run as a priv user anyway....
       uncommented for completeness
    */
    change_identity(99, 99);

    /* handle signals */
    pcntl_signal(SIGTERM, 'sig_handler');
    pcntl_signal(SIGINT, 'sig_handler');
    pcntl_signal(SIGCHLD, 'sig_handler');

    /* change this to your own host / port */
    server_loop($ip, $port);

    /**
      * Change the identity to a non-priv user
      */
    function change_identity( $uid, $gid )
    {
        if( !posix_setgid( $gid ) )
        {
            print "Unable to setgid to " . $gid . "!\n";
            exit;
        }

        if( !posix_setuid( $uid ) )
        {
            print "Unable to setuid to " . $uid . "!\n";
            exit;
        }
    }

    /**
      * Creates a server socket and listens for incoming client connections
      * @param string $address The address to listen on
      * @param int $port The port to listen on
      */
    function server_loop($address, $port)
    {
        GLOBAL $__server_listening;

        if(($sock = socket_create(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            echo "failed to create socket: ".socket_strerror($sock)."\n";
            exit();
        }

        if(($ret = socket_bind($sock, $address, $port)) < 0)
        {
            echo "failed to bind socket: ".socket_strerror($ret)."\n";
            exit();
        }

        if( ( $ret = socket_listen( $sock, 0 ) ) < 0 )
        {
            echo "failed to listen to socket: ".socket_strerror($ret)."\n";
            exit();
        }

        socket_set_nonblock($sock);

        echo "waiting for clients to connect on $address:$port\n";

        while ($__server_listening)
        {
            $connection = @socket_accept($sock);
            if ($connection === false)
            {
                usleep(100);
            }
            elseif ($connection > 0)
            {
                handle_client($sock, $connection);
            }
            else
            {
                echo "error: ".socket_strerror($connection);
                die;
            }
        }
    }

    /**
    * Signal handler
    */
    function sig_handler($sig)
    {
        switch($sig)
        {
            case SIGTERM:
            case SIGINT:
                //exit();
            break;

            case SIGCHLD:
                pcntl_waitpid(-1, $status);
            break;
        }
    }

    /**
    * Handle a new client connection
    */
    function handle_client($ssock, $csock)
    {
        GLOBAL $__server_listening;

        $pid = pcntl_fork();

        if ($pid == -1)
        {
            /* fork failed */
            echo "fork failure!\n";
            die;
        }
        elseif ($pid == 0)
        {
            /* child process */
            $__server_listening = false;
            socket_getpeername($csock, $remip, $remport);
            print date("d-m-y H:i:s") . " Connection from $remip:$remport\r\n\r\n";
            socket_close($ssock);
            interact($csock);
            socket_close($csock);
            print date("d-m-y H:i:s") . " Connection to $remip:$remport closed\r\n\r\n";
            print "------------------------------------------------------------------------------------------------------------------------------------------\r\n\r\n";
        }
        else
        {
            socket_close($csock);
        }
    }

    function interact($socket)
    {
        $gets = $_REQUEST;
        print $gets;
    }

    /**
      * Become a daemon by forking and closing the parent
      */
    function become_daemon()
    {
        $pid = pcntl_fork();

        if ($pid == -1)
        {
            /* fork failed */
            echo "fork failure!\n";
            exit();
        }
        elseif ($pid)
        {
            /* close the parent */
            exit();
        }
        else
        {
            /* child becomes our daemon */
            posix_setsid();
            //chdir('/');
            //umask(0);
            return posix_getpid();

        }
    } 

?>

関数が対話する場所は、接続が既に確立されている場所であり、ヘッダーを読み取ることができるはずです。しかし、喜びはありません。私が受け取ったエラーは次のとおりです: Notice: Array to string conversion in /home/armand/bin/7203/7203.php on line 198

そして、ユニットが送信する情報は次のようになります。

357671030507047#V500#0000#AUTOLOW#1#00ab46cb,0,0,0,2,09,14,$GPRMC,073106.000,A,2647.0278,S,02750.8628,E,0.00,324.27,021213,,,A*7C ##`

4

1 に答える 1

0

このコマンドを使用すると、PHP に組み込まれている http サーバーを使用できます。

php -S ローカルホスト:7203

または、Apache http サーバーを使用する場合は、構成ファイルで次を使用します。

聞く *:7203

于 2013-12-03T10:45:51.137 に答える