0

私はデータ配信サービス (DDS) を初めて使用します。ワイルドカードを使用して DDS のトピックのグループにサブスクライブできるかどうか知りたいです。似たような名前のトピックからまとめてデータを受信できるようにします。たとえば、IN_Temperature、NEP_Temperature という 2 つのトピックがあります。温度を持つ名前を持つすべてのトピックをサブスクライブする方法があります。

4

1 に答える 1

2

ここに2つの答え。

(非 XTypes DDS)

そのようには機能しません。

トピックが作成されると、特定のタイプにバインドされます。リーダーがインスタンス化されると、特定のトピックにバインドされます。その振る舞いを変えることはできません。ワイルドカード トピック名を許可すると、ミドルウェアが (on_data_available トリガーごとに) 正しいリーダーにスワップする必要があることを意味します。

確かに、アプリケーション レベルで DDS インフラストラクチャの上に実装できますが、私には意味がわかりません。

(Xタイプの回答)

それはまだそのようには機能しません:)

X-Types もベンダー サポートに依存します。YMMV。

しかし、X-Types (Extensible Types for DDS) を使用すると、タイプの継承によって「1 つのトピックに対して 1 つのタイプ」という要件が変更されるシステムを構築できます。

次の IDL を検討してください (注意: これは PrismTech ではなく RTI フレーバーですが、X-Types 対応の ddsgen コンパイラを使用している場合、これは重要ではありません)。

struct ATemperatureReading {
    float value;
};

struct ATemperatureDevice : ATemperatureReading {
    string<32> deviceId; //@key
    string<64> description;
};

struct IN_T_Type : ATemperatureDevice {
    // additional fields that are specific to an IN_Temperature
    string<16> manuId; //@key
    unsigned long serialno; //@key
};

struct NEP_T_Type : ATemperatureDevice {
    // additional fields that are specific to a NEP_Temperature
    long long nepProvider; //@key
};

これで、トピック「Temperature Readings」を作成できます。1 人のサブスクライバーは NEP_T_Type リーダーを使用でき、別のサブスクライバーは IN_T_Type リーダーを使用できます。

内部的には、ミドルウェアは、IN_T_Type ライターまたは NEP_T_Type ライターに関係なく、すべての「温度測定値」を両方のリーダーに送信します。

NEP_T リーダーが IN_T データを受信すると、nepProvider フィールドはゼロになります。IN_T リーダーが NEP_T データを受信すると、manuID フィールドと serialNo フィールドは<null>ゼロになります。

ただし、残りのフィールドは入力されます。この動作を ATemperatureReading でサブスクライブするように拡張できます。 *_T_Type 温度ライター サンプルは float 値だけで渡されます (追加のデータは、受信時にミドルウェアによって破棄されます。つまり、サブスクライバー側です。注意してください)。帯域幅の使用量に)。

変更可能な型を使用することもできますが、それが未開発の開発である場合は使用しないでください。私はミュータブルな型を見ると恐ろしい恐怖を感じます -- なぜそれらがそこにあるのかは知っていますし、いつかそれらを使う必要があることも知っています。 " 皮肉ではなく、私はあなたを厳しく裁きます。完全な回答を提供するという理由で、この段落のみを含めました。

于 2015-12-19T16:51:08.350 に答える