【问题标题】:PHP / JS / Bash script for receiving GPS data over UDP用于通过 UDP 接收 GPS 数据的 PHP / JS / Bash 脚本
【发布时间】:2012-09-03 09:39:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php mysql node.js gps udp


    【解决方案1】:

    可以使用 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/

    【讨论】:

    • 感谢您的想法。听起来真的很棒。但即便如此,我还是不得不放弃它。 PHPDaemon 需要 PECL,而我非常有限的 Linux (QNAP) 没有它。我将不得不寻找一种方法来无休止地运行socket_recvfrom,而不使用 PHPDaemon,只使用纯 PHP。
    • 嘿,您可以在纯 php 中使用它,这是 PHP 手册中的示例,您可以在从 udp 端口​​获取数据后使用普通的 php 命令连接到数据库一次。
    • 是的,我自己找到了,所以我发表了我自己对这个问题的回答。感谢您的想法,这迫使我朝着解决这个问题的正确方向前进。
    【解决方案2】:

    您可能对socket_recvfrom 感兴趣?

    【讨论】:

    • 感谢您的想法。使用您提到的页面中的示例,我能够编写一个简单的 PHP 脚本。我能够通过 SSH 在我的服务器上运行它。但是,我无法收到任何东西。或者我在命令行中没有看到任何响应(示例中的echo),尽管我已经从两个不同的应用程序发送了一些 UDP 数据包。
    【解决方案3】:

    这就是我自己发现的。

    一般

    正如 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'。没有完整路径,只能通过浏览器运行。

    使用数据库

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

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

    不是:

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

    甚至:

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

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

    注销问题修复

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

    要解决此问题,您必须以守护程序模式运行 PHP 脚本(通过在末尾添加 &amp;):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2017-09-27
      相关资源
      最近更新 更多