1

私は OpenDDS v3.6 を使用しており、多くのうちの 1 つである特定の DDS ピアにメッセージを送信しようとしています。IDL では、メッセージ構造は次のようになります。

module Test
{
#pragma DCPS_DATA_TYPE "Test::MyMessage"
#pragma DCPS_DATA_KEY "Test::MyMessage dest_id"
    struct MyMessage {
        short dest_id;
        string txt;
    };
};

私の理解では、データ キーは一意であるため、これは書き込まれるトピックの新しいインスタンスであり、同じデータ キーで書き込まれたメッセージはトピックのこの特定のインスタンスに送信されます。私の送信コードは次のとおりです。

DDS::ReturnCode_t ret;
Test::MyMessage msg;

// populate msg
msg.dest_id = n;

DDS::InstanceHandle_t handle;

handle = msg_writer->register_instance(msg);

ret = msg_writer->write(msg, handle);

そのため、受信ピアがこのトピック インスタンスからのみ読み取り、他のピアに送信される他のすべてのメッセージを受信しないようにする方法を理解する必要があります。以下から始めましたが、特定のトピック インスタンスを適切に選択する方法がわかりません。

DDS::InstanceHandle_t instance;

status = msg_dr->take_next_instance(spec, si, 1, DDS::ANY_SAMPLE_STATE, 
    DDS::ANY_VIEW_STATE, DDS::ANY_INSTANCE_STATE);

どんな助けでも大歓迎です。

4

1 に答える 1

2

探しているものを実現する最も簡単な方法は、ContentFilteredTopic. このクラスはクラスの特殊化であり、関心のあるサンプルTopicDescriptionの式 (SQL 句など) を指定できます。WHERE

42 に等しいDataReaderサンプルのみを受け取りたい場合、 を作成するための対応するコードは次のようになります。dest_idContentFilteredTopic

DDS::ContentFilteredTopic_var cft =
              participant->create_contentfilteredtopic("MyTopic-Filtered",
                                                       topic,
                                                       "dest_id = 42",
                                                       StringSeq());

そこから、 のパラメータとしてDataReaderusingを作成します。結果のリーダーは通常の のように見えますが、目的のサンプルのみを受け取り、他には何も受け取りません。フィールドはたまたまインスタンスを識別するフィールドであるため、最終的に、DataReader には 1 つのインスタンスしかありません。cftTopicDescriptionDataReaderdest_id

詳細については、DDS 仕様(セクション 7.1.2.3.3) またはOpenDDS 開発者ガイド(セクション 5.2) を参照してください。

于 2015-04-20T14:13:10.777 に答える