0

独自の GPS ローカライザーを制御するための独自の小さな Web サイトを作成したいと考えています。問題は、HTTP プロトコルではなく UDP を使用して (GPRS 経由で) データを送信していることです。そのようなデータを受信して​​MySQLデータベースに入れる方法について誰かアドバイスをもらえますか?

その質問に対するこの回答に書かれているのとまったく同じものを探しています。唯一の問題は、この回答に記載されているサイトの有効期限が切れており、スクリプトが利用できないことです。

必要なのは、座標、速度、日付などを含む UDP パケット/データグラムを受信し、このデータを MySQL データベースに入れる方法に関するアドバイスまたは例です。できるだけ簡単にゲートウェイを作成するには? 残りはすべて自分で処理できます。

私は以前 Delphi 開発者であり、UDP と MySQL の間のゲートウェイを作成することは Windows では難しい仕事ではないため、Windows でも問題なくこれを行うことができました。しかし、Kylix (Delphi for Linux) プログラムを実行できない小規模な Linux ベースのサーバーでこのソリューション (ゲートウェイ) を実行する必要があるため、この方法は行き止まりです。

これは、PHP、JavaScript、または Bash スクリプトを使用して実行できますか? 私は node.js について考えていました。これは、ホーム Web ページに同様の例があります (そして、おそらくインターネットにはもっと多くの例があります)。しかし、私はnode.jsに精通していないため、これを行うためのより良い/簡単な方法がないかどうかはわかりません.

4

3 に答える 3

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/にアクセスしてください。

于 2012-09-03T10:04:18.037 に答える
1

これが、私が見つけたものです。

全般的

Venkatが書いたように、純粋なPHPで簡単なlistnerを書くことができます。約3〜5分後にタイムアウトすると失敗するため、ブラウザ経由ではなく、CLISAPIモードのPHPでSSH経由で実行するだけで済みます。

CLIモードで実行するには、PHPへのフルパスを知っている必要があり、適切なスイッチを使用して呼び出す必要があります。例えば:

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

PHP CLIはstdoutforを使用しechoません(何を使用するかはわかりません)。したがって、エコーをファイルまたはデータベースに値を格納することで置き換えて、リストナーが機能している実際の効果を確認します。

set_time_limit(0)無限の中断のない実行のために関数を使用する必要があるかもしれません。ただし、報告されており(ここでユーザー提供のメモを参照)、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. すべてのソース(IPアドレス)からリッスンする場合はsocket_bindの0.0.0.0 IPアドレスを使用し、ローカルホストのみに制限する場合は127.0.0.1を使用します。

  3. socket_recvfromの3番目のパラメーター(受信される最大バイト数)を慎重に選択して、待機しているデータが切り捨てられないようにします。

  4. ファイルへのフルパスを使用する必要があります。使用しているのは、コードで$file = './dump.txt'はなく、が存在する理由です。$file = 'dump.txt'フルパスがないと、Webブラウザ経由でのみ機能します。

データベースの使用

受信したUDPパケットをデータベースにドロップすることにし、この目的でSQLiteを選択した場合は、データベースファイルへのフルパスだけでなく、絶対パスも指定する必要があります。それで:

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

いいえ:

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

あるいは:

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

2回目と3回目の試行は一部のシステムで失敗し(PHP構成によって異なります)、この場合、データベースファイルにそのようなテーブルがないという警告が表示されます。

ログオフの問題の修正

そのリスナーを実行するマシンに直接アクセスできず、SSH経由で接続している場合は、ログオフするとリスナーがオフになる可能性があることに注意してください。

この問題を修正するには、PHPスクリプトをデーモンモードで実行する必要があります(&最後に追加することにより)。

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

またはscreen、「wirtual」ターミナルで非デーモンバージョンのリスナーを実行するコマンドを使用します。

于 2012-09-05T06:39:41.593 に答える
1

socket_recvfromに興味があるかもしれません。

于 2012-09-03T09:51:34.710 に答える