在PHP中接收UDP数据包数据

6

我正在使用php构建一个用于GPS跟踪系统的监听服务器。 GPS通过UDP数据包发送数据,运行下面的脚本可以显示出这些数据包。但是实际的数据以符号形式输出,我猜测我错过了一些转换操作。

    //Reduce errors
    error_reporting(~E_WARNING);

    //Create a UDP socket
    if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    echo "Socket created \n";

    // Bind the source address
    if( !socket_bind($sock, "192.168.1.29" , 1731) )
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Could not bind socket : [$errorcode] $errormsg \n");
    }

    echo "Socket bind OK \n";

    //Do some communication, this loop can handle multiple clients
    while(1)
    {
        echo "\n Waiting for data ... \n";

        //Receive some data
        $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
        echo "$remote_ip : $remote_port -- " . $buf;

            //Send back the data to the client
        //socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);

    }

    socket_close($sock);

你需要了解你的GPS是如何发送数据的。应该有一个协议,数据可能会以某种方式进行编码以处理校验和/或纠错。请参考您特定设备的用户手册或知识库。 - Ghigo
1个回答

4

我以前没有用过PHP做过这个,但我的第一个猜测是你得到了一个二进制字符串,需要将其转换为ASCII码(或者你正在使用的字符集)。

看起来你应该能够使用PHP的unpack来实现。

不知道你得到的数据是什么格式,很难确定提供pack的确切格式。看起来unpack至少可以返回一个十进制值数组(假设你得到的是字符),然后你可以使用chr将其转换为ASCII码。可能是这样的:

//Receive some data
$r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
//Convert to array of decimal values
$array = unpack("c*chars", $buf);
//Convert decimal values to ASCII characters:
$chr_array = array();
for ($i = 0; $i < count($array); $i++)
{
    $chr_array[] = chr($array[$i]);
}

这取决于协议设计,你需要解析二进制数据的复杂程度(也就是说,你只发送字符串数据,还是混合了整数和字符串等等...你需要相应地解析二进制数据)。 编辑:我已经更新了格式字符串,以匹配不确定数量的字符,使用数组元素名称“chars”,如here中列出的格式。 编辑:在代码示例中添加了一些基本的ASCII转换。

谢谢,看起来这是二进制的。这是现在的输出。A¤¡ÿ}©x - dslauter
实际上我需要从二进制转换为十六进制。我会查看手册页面。非常感谢。 - dslauter
@dslauter 你没有列出输出结果的地方,我看不到。你有GPS数据的技术规范吗?例如,所有标题是什么,它们的值是什么(它们是无符号整数、长整型等等)。你需要有某种协议规范来解析二进制数据,这样才能正确地进行解析。 - Geekman
@dslauter 没问题。我认为如果你要转换成十六进制,可以使用bin2hex()函数?不过不要引用我的函数名。 - Geekman
@dslauter 可能值得阅读这个页面,评论区提供了一些十六进制转换的实用例子,适用于各种应用:http://www.php.net/function.bin2hex - Geekman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接