用于通过UDP接收GPS数据的PHP / JS / Bash脚本

时间:2012-09-03 09:39:40

标签: php mysql node.js gps udp

我想写一个自己的小网站来控制我自己的GPS定位器。问题是,他们使用UDP而不是HTTP协议发送数据(通过GPRS)。谁能给我任何关于如何接收这些数据并将其放入MySQL数据库的建议?

我正在寻找与this answerthat question完全相同的内容。唯一的问题是此答案中提到的网站已过期且脚本不可用。

我需要的是关于如何接收包含坐标,速度,日期等的UDP数据包/数据报并将此数据放入MySQL数据库的建议或示例。如何尽可能简单地编写网关?其余的我都可以自己处理。

我可以毫无问题地在Windows上做到这一点,因为我以前是Delphi开发人员,在UDP和MySQL之间编写网关并不是一件很难的事。但我需要在基于Linux的小型服务器上运行这个解决方案(网关),该服务器无法运行Kylix(Delphi for Linux)程序,所以这种方式是一个死胡同。

可以使用PHP,JavaScript或编写Bash脚本来完成吗?我在考虑node.js,它在家庭网页上有类似的例子(可能还有很多在互联网上)。但我不熟悉node.js,因此我不知道,如果没有更好/更方便的方法来做到这一点。

3 个答案:

答案 0 :(得分:2)

可以使用PHP从UDP端口读取数据。我发布了一个从udp端口读取数据的示例代码。

<?php
    error_reporting(E_ALL | E_STRICT);

    $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    socket_bind($socket, '127.0.0.1', 1223);

    $from = '';
    $port = 0;
    socket_recvfrom($socket, $buf, 12, 0, $from, $port);

    echo "Received $buf from remote address $from and remote port $port" .                                              PHP_EOL;
?>

并将该数据插入MySQL数据库可能需要使用守护进程,请通过此链接 http://phpdaemon.net/

答案 1 :(得分:1)

也许socket_recvfrom可能会让您感兴趣?

答案 2 :(得分:1)

这就是我发现自己。

常规

正如Venkat所写,你可以用纯PHP编写一个简单的列表器。您只需通过SSH在CLI SAPI模式下以PHP运行它,而不是通过浏览器运行它,因为它会在大约3-5分钟后超时失败。

要在CLI模式下运行,您需要知道PHP的完整路径,并且必须使用正确的开关调用它。例如:

/mnt/ext/opt/apache/bin/php -f /share/Web/projects/gps/gateway.php

PHP CLI不会将stdout用于echo(不知道,它使用的是什么)。因此,将任何echo替换为存储值到文件或数据库,以查看列表工作的实际效果。

您可能需要使用set_time_limit(0)函数进行无休止的不间断执行;但是有人报道了(参见用户提供的注释here),CLI SAPI将其硬编码为0,因此设置它可能不是强制性的。

在CLI模式下运行脚本后,可以使用Ctrl + C打破它。

Listner示例

这是一个列表器的示例,它会删除所有内容,它会在同一目录中的“drop.txt”文件中接收,其中放置了脚本文件:

error_reporting(E_ALL | E_STRICT);

$file = './dump.txt';

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 12345);

while(TRUE)
{
    $buf = '';
    $from = '';
    $port = 0;

    socket_recvfrom($socket, $buf, 1024, 0, $from, $port);

    $momentum = time();

    $entry = $momentum.' -- received "'.trim($buf).'" from '.$from.' on port '.$port.PHP_EOL;

    file_put_contents($file, $entry, FILE_APPEND | LOCK_EX);
}

事情,你应该记住:

  1. 此脚本使用无限循环,因此在运行后断开它的唯一方法是转换Ctrl + C.

  2. 在socket_bind中使用0.0.0.0 IP地址来监听所有来源(IP地址)或127.0.0.1以将其限制为仅限本地主机。

  3. 小心选择socket_recvfrom中的第三个参数 - 将接收的最大字节数 - 以确保您所等待的数据不会被截断。

  4. 您必须使用正在使用的文件的完整路径 - 这就是代码中$file = './dump.txt'而不是$file = 'dump.txt'的原因。没有完整路径,它只能通过webbrowser工作。

  5. 使用数据库

    如果您决定将接收到的UDP数据包放入数据库并为此选择SQLite,则不仅需要提供数据库文件的完整路径,还需要提供绝对路径!所以:

    $dbhandle = new SQLiteDatabase('/share/Web/projects/gps/data.db');
    

    $dbhandle = new SQLiteDatabase('data.db');
    

    甚至:

    $dbhandle = new SQLiteDatabase('./data.db');
    

    第二次和第三次尝试在某些系统上会失败(取决于PHP配置),在这种情况下,你会看到警告,你在数据库文件中找不到这样的表。

    注销问题修复

    如果您无法直接访问将要运行该侦听器的计算机,并且您通过SSH进行连接,请记住,一旦您注销,您的听众就会被关闭。

    要解决此问题,您必须以守护进程模式运行PHP脚本(最后添加&):

    /mnt/ext/opt/apache/bin/php -f /share/Web/gps/gateway.php&
    

    或者在“wirtual”终端的运行非守护程序版本的监听器中使用screen命令。