1

GPSトラッカーを購入しました。SMSを携帯電話に送信できます。また、GPRSを介したサーバーへのレポートもサポートしています。

ポート8123で自分のサーバーに接続するようにデバイスをセットアップしました。これはFreeBSDサーバーであり、そのポートでパケットを受信することを確認しました。

PHPで記述されたリスナーサーバーのセットアップに成功し、デバイスからデータを受信できます。しかし、部分的なHEXデータを有用なもの(ASCII)に変換するにはどうすればよいですか?

データ文字列の例:

$$ ^ @ T ^ @ E Y'^WÿU210104.000、A、5534.4079、N、01146.2510、E、0.00、、170411 ,, * 10 | 1.0 |72|0000á

残念ながら、HEXパーツをコピーして貼り付ける方法がわかりません

ID部分を取り出すにはどうすればよいですか?私が試してみましたecho hexdec(mb_substr($data, 4, 7));

データはこのプロトコルに従っています

ドキュメントから:

GPRSパケットのコマンド形式は次のとおりです。

サーバーからトラッカーへ:
@@ \ r \ n

トラッカーからサーバーへ:
$$ \ r \ n

ノート:
コマンドを書くときは''を入力しないでください。
すべてのマルチバイトデータは、次のシーケンスに準拠しています。下位バイトの前の上位バイト。
GPRSパケット(データを含む)のサイズは約100バイトです

アイテム仕様
@@2バイト。これは、サーバーからトラッカーへのパケットのヘッダーを意味します。
            ASCIIコード(16進コード:0x40)です

$$2バイト。トラッカーからサーバーへのパケットのヘッダーです。
            ASCIIコード(16進コード:0x24)です

L2バイト。これは、パケット全体の長さを意味します。
            ヘッダーと終了文字で、16進コードです

ID 7バイト、IDは1桁で、14桁を超えてはなりません。未使用のバイトです。
            'f'または'0xff'が詰め込まれます。16進コードの形式です。
            たとえば、IDが13612345678の場合、次のように表示されます。
            次のとおりです:0x13、0x61、0x23、0x45、0x67、0x8f、0xff。
            7バイトすべてが0xffの場合、それはブロードキャストコマンドです。IDは16進コードです

コマンド2バイト。コマンドコードは16進コードです。を参照してください
            以下のコマンドリスト。

データ最小0バイトおよび最大100バイト。「データ」の説明については、付録1を参照してください。

チェックサム2バイト。これは、CRC-CCITT(デフォルトは0xffff)のチェックサムを示します。
            すべてのデータ(CRC自体と終了文字を含まない)。
            16進コードです。
            例:24 24 00 11 13 61 23 45 67 8f ff 50 00 05 d8 0d 0a
            0x05d8 = CRC-CCITT(24 24 00 11 13 61 23 45 67 8f ff 50 00)

\ r \n2バイト。これは終了文字であり、16進コードです
            (16進コードの0x0d、0x0a)

アップデート

アノミエからの返事で、これをつなぎ合わせることができました

$arr = unpack('H4length/H14id/H4cmd/H4crc/H4end', mb_substr($data, 2, 11) . mb_substr($data, -4));

var_dump($arr);

これは次のようなものを出します

array(5){
  ["長さ"]=>
  string(4) "0054"
  ["id"] =>
  string(14) "004512345678ff"
  ["cmd"] =>
  string(4) "9955"
  ["crc"] =>
  string(4) "c97e"
  ["終了"]=>
  string(4) "0d0a"
}
4

3 に答える 3

2

バイナリデータを整数または文字列に変換する必要があるようです。最も簡単な方法は、を使用することunpackです。

たとえば、すでに知っている長さを抽出するには、

$length_bin = substr($string, 2, 2);

整数に変換するには、次のようなものを使用できます

$length = unpack('v', $length_bin); $length = $length[1];

'v'コードは長さとチェックサムで機能します。4バイトとして格納されている数値がある場合は、を使用'V'し、IDには'H*'、16進数の文字列として取得するために使用できます。その他のコードはドキュメントに記載されています。


C*unpack withを使用してすべてのバイト値の配列を取得した後、ビット操作を手動で行うのは、やや簡単ではありません。例えば、

$bytes = unpack('C*', $length_bin);
$length = ($bytes[0] << 8) | $bytes[1];
于 2011-04-26T16:41:17.927 に答える
0

デバイスから受信するメッセージの形式を知る必要があります。この情報はメーカーから入手できます。次に、それに応じて、サーバー側で適切なリスナーを作成する必要があります。

私はそのようないくつかのデバイスを使用してきましたが、通常はサーバーでソケット(または同様のもの)を使用してポートをリッスンするプロセスを作成する必要があります。デバイスを区別するための認証プロセスもある場合があります(複数持つことができます)。その後、デバイスからデータを取得し、解析して保存するだけです。デバイスによっては、リクエストや設定を送信することもできます。

お役に立てれば

于 2011-04-12T10:26:49.673 に答える
0

* 4月26日編集: *質問を少し変更したので、これは場違いのようです。最初の質問は、TCPからデータを読み取る方法に関するものでした。

PHPでTCP/ソケットサーバーを作成することに関するいくつかの素晴らしい記事を見つけました(/ meは大きなマスでPHPを少し叩きます)

http://devzone.zend.com/article/1086 http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

これがうまくいくのが待ちきれません:)

于 2011-04-12T11:29:34.723 に答える