2

プリミティブ型のパブリッシャーとサブスクライバーを正常に作成しました。ファイル (xml、txt、ビデオ、オーディオなど) を DDS に公開しようとすると問題が発生します。IDL ファイルで型を指定する方法と、ファイル全体を DDS に公開する方法 (サブスクライバー側でファイルを受け取る方法も) がわかりません。

もう 1 つ質問があります。「DDS でのパブリッシュにメモリ制限はありますか?」

4

3 に答える 3

3

DDSを使用してファイルを配布するために使用できるルートはいくつかあります。最も簡単な(ただし必ずしも最良ではない)のは、オクテット(バイト)のシーケンスを使用してファイルの内容をキャプチャすることです。これは、次のようなIDL定義によって実現できます。

const long MAX_NAME_LEN = 128;
const long MAX_FILE_SIZE = 100000;

typedef string<MAX_NAME_LEN> NameType;
typedef sequence<octet,MAX_FILE_SIZE> BinaryContentsType;

struct BinaryFile {
    NameType name; //@key
    BinaryContentsType contents;
};
#pragma keylist BinaryFile name

あなたの質問はOpenSpliceDDSに固有のものではありませんが、どのDDS実装にも適用できるので、いくつかの実装で機能するようにキー属性を定義するための構文を含めました。

アプリケーションでは、タイプをインスタンス化し、メンバーの値を入力する必要があります。これは次のようになります

BinaryFile instance = new BinaryFile();
instance.name = "SomeFileName";
// fill instance.contents by reading file into array of bytes.

contents属性はバイトの配列になります。内容が入力されたら、他の例と同様にwrite、でメソッドを呼び出すだけです。BinaryFileDataWriter

構成された共有メモリの制限以外に、この方法で配布されるファイルのサイズに実際の制限はありません。ただし、サイズに制限を設けることをお勧めします。そのため、BinaryContentsType型のシーケンスは制限されています。

使用しているプログラミング言語について言及していないため、コーディングの詳細を説明するのは困難です。BinaryFileTypeただし、基本的な型を使い始めたとおっしゃっていたので、特に提供されているドキュメントと例を見て、それを自分の型に適用すると、型を公開する方法を簡単に理解できるはずです。

補足として、完全なファイルを配布してもよろしいですか?状況によっては、ファイルの内容の構造を分析し、それに一致するデータモデルを作成することをお勧めします。パブリッシャー側でファイルを読み取り、blobではなく意味のあるデータアイテムに変換します。このようにして、サブスクライバーは、利用可能なトピックのサブセットのみをサブスクライブすることによって、またはコンテンツに基づくフィルターを使用することによって、コンテンツのサブセットをサブスクライブするなど、より高度なデータ管理機能を利用できます。ただし、これがすべて理にかなっているかどうかは、ユースケースによって異なります。

于 2012-07-12T01:37:11.597 に答える
0

しかし、本当の問題は-なぜですか?DCPSを介して不透明(OPAQUE)データを転送することは1つのことですが、ファイル全体ですか?これにはるかに適したプロトコルがいくつかありませんか?IPCに似たファイル転送を検討できるように、多くのファイルをメモリに保持していますか?あなたへの私の答えは、FTP、NFS、SSHFS、SMB、またはHTTPを探すことです。これらはすべてDDSトラフィックと平和的に共存でき、ファイル転送にDDSを使用しても正味のメリットは見られない可能性があります。

質問によると、Reinierの答えは正しいです。(ところで、あなたは本当にいくつかの答えを受け入れることを検討する必要があります-あなたは2つの未解決のものを持っています!あなたはあなたの次の質問に答えるためにSOに誰もいないかもしれません)。

于 2012-07-13T01:41:52.347 に答える
0

One benefit that DDS can bring to sending files is for the case where you want to send a file to multiple recipients. Through the use of a reliable protocol built on top of UDP with Multicast enabled, you can then send the file to several recipients at the same time without incurring the bandwidth usage to perform multiple file transfers.

于 2013-11-12T16:35:32.273 に答える