2009-03-22 6 views
2

携帯電話用のアプリケーションを作成しています。このアプリケーションは、サーバへのTCP接続を介して加速度測定値を送信します。TCPパケットの書式設定に関するアドバイスはありますか?

私はできるだけメッセージの長さを減らしたいと思いますが、同時に私は受信機の解析メカニズムを変更することに苦労することなく拡張することが可能な現在のフォーマットにしたいと考えています。私は次の形式で文字列を送信開始時に

##measurementTime#AccelerationX#AccelerationY#AccelerationZ 

butsoonは、実装後に私がメッセージに他のいくつかのデータを追加し、私は私がしなければならない場合、それは多くの時間がかかります実現しました頻繁にフォーマットを変更してください。

私はXMLについて考えていましたが、私が避けたいと思う多くの負荷を追加します(測定値は100〜250 msごとに送信されます)。

+0

「フォーマットを頻繁に変更する必要がある場合は、時間がかかります」と説明してください。これはどういう意味ですか?メッセージの解析に問題がありますか?送信に時間がかかりますか? –

+0

"#"文字のインスタンスを数え、メッセージを解析します。それは問題ではありませんが、私は解析を簡単にすることができる提案を聞いてうれしいです。 –

+0

あなたの質問を追加の事実で更新してください。何語? –

答えて

2

ASCIIテキストタイプのストリームに完全に固執する必要がある場合は、単純なキー名と値のペアを送信することをお勧めします。キー名は、それぞれの値が元の提案と同様伝えることフィールドの名前を記述するために使用されている:

##keyName1=value1#keyName2=value2# 

代わりに、あなたはこのようなバイナリタグ付けされた形式でデータを送信することができる:

<tagCodeNum><lengthInBytes><tagValueAsBytes> 

をここで、tagCodeNumはおそらくバイトまたは単語で、lengthは必要に応じてバイトまたは単語です。この形式の考え方は、受信者がコード番号で認識できるフィールドを認識し、デコード方法がわからないタグ​​をスキップできるということです。このようにして、エンコーディングは拡張可能になります。

<messageCodeNum><lengthInBytes><tag><tag><tag> 

上記のタグは長さが説明し、上述の前のタグ構造の複製である:あなたが論理的なメッセージにグループ化された複数のタグが必要な場合は、私は、全体的なメッセージ階層でこれらのバイナリコード化されたタグのグループをラップしますすべてのタグのバイト長は一緒に結合されます。

注:この構造について考えてみると、XML型構造とはまったく異なるものではありませんが、はるかに簡潔で拘束されているため、デコードするのは簡単ではありません。

1

サイズを縮小したい場合は、パケット構造をバイナリ形式に変更することを丁寧にお勧めします。パケットの区切り方によってはスケーラビリティも簡単です。

次の範囲で何かをすることができます:

のnバイトが+サイズ
のnバイトの時間
2-8バイトのx
2-8バイトのY
2-8を開始バイトz

0

考えてみてください:
- 以前の値との差分のみを送信します。
- 時折、完全なフレームを送信します。
- xmlを使用しないで、構造体定義を作成してください。

4

私はInSciTek Jeff's answerを少し作りたいと思います。これは、より一般的にはタグ長さ値エンコードとして知られているものです。最初のコードはタグというアイデアで、値の解釈方法がわかります。 2番目のコードは、の長さがで、値にいくつのバイトがあるかを示します。これは、拡張可能なバイナリエンコーディングを実行するのに最適な方法であり、MPEGエンコーディングで多く使われています。私は良い機能的なバイナリプロトコルには、いくつかのより多くのヒント/要件に追加します

  1. がメッセージ
  2. エンコードすべてのマルチのためのプロトコルのバージョンを述べ、各メッセージにバージョン番号を含めますフィールド内のバイトフィールドnetwork byte order
  3. 各フィールドのサイズを慎重に考慮する
  4. 整数のマルチバイトコード体系を使用することを検討してください。最後のバイトであり、各バイトの下位7ビットに値が含まれている場合は、0が続きます。
  5. はバイト、決して構造

最初のものは本当に重要であるとして、ワイヤの上のすべてを詰めます。変更を計画し、プロトコルの変更方法を慎重に決定することが重要です。クライアントは、バージョン番号をサポートしていない場合、メッセージの解釈を試みるべきではありません。決して!

安定した実装を行うには、5番目のものが非常に重要です。私は組み込み機器用のバイナリプロトコル実装を数多く書いてきており、パック構造を使うことは私が一番後悔している間違いです。数値フィールドをバイトスワップしたり、構造体をパッキングしたりすることを忘れることに関連する欠陥が多すぎます。バイトパッキングとアンパックプリミティブの素晴らしいライブラリを作成し、完全にテストし、宗教的に使用してください。

これらの原則を念頭に置いてプロトコルを設計して実装すると、サポートと拡張が必要な​​ときに、より簡単に自分の人生を変えることができます。私が非常にお勧めする最後のことは、あなたのプロトコルにWiresharkのようなもののために切開器を書くことです。また、デプロイ、テスト、およびサポートも容易になります。あなたがそれを考慮する前に、そのようなディセクターを書くだけでなく、それを配備する可能性のある法的影響を完全に理解してください。

0

私は、XMLを考えていたが、それはあなたが代わりにJSONを使用することができ、負荷

の多くを追加します。バイナリ形式ほどコンパクトではありませんが、XMLよりはるかにコンパクトです。また、データ形式を簡単に拡張できます。

関連する問題