2

問題: ブース パブリッシャの接続と切断の活性通知を取得するにはどうすればよいですか?

背景: 私は、同じトピックを使用して、データ型 (dt) のパブリッシャーとサブスクライバーが別々のコンピューターにある OpenDDS 実装を使用しています。

サブスクライバー側のリーダーは、 と の実装をオーバーライドしon_data_available(...)ましたon_liveliness_changed(...)。私のサブスクライバーが最初に開始され、on_liveliness_changed(...)利用可能なライターがいないことを示すコールバックが発生します。パブリッシャーが開始されると、ライターが利用可能であることを知らせる新しいコールバックを取得し、パブリッシャーがパブリッシュするon_data_available(...)と呼び出されます。これまでのところ、すべてが期待どおりに機能しています。

パブリッシャーのライターには、オーバーライドされた実装がありon_publication_matched(...)ます。on_publication_matched(...)サブスクライバーが既に開始されているため、パブリッシャーを開始するときに呼び出されます。

問題は、パブリッシャーが切断されたときにon_liveliness_changed(...)、リーダー側でコールバックが得られず、パブリッシャーが再び開始されたときに新しいコールバックが得られないことです。

を設定して、readerQos を変更しようとしましたreaderQos.liveliness.lease_duration。しかし、その結果、on_data_available(...)が呼び出されることはなく、への唯一のコールバックon_liveliness_changed(...)は起動時であり、パブリッシャーが存在しないことがわかります。

DDS::DataReaderQos readerQos;
DDS::StatusKind mask = DDS::DATA_AVAILABLE_STATUS | DDS::LIVELINESS_CHANGED_STATUS |  DDS::LIVELINESS_LOST_STATUS ; 
m_subscriber->get_default_datareader_qos( readerQos );
DDS::Duration_t t = { 3, 0 };
readerQos.liveliness.lease_duration = t;
m_binary_Reader = static_cast<binary::binary_tdatareader( m_subscriber->create_datareader(m_Sender_Topic,readerQos,this, mask, 0, false) );

/クリストファー

4

1 に答える 1

4

わかりました、ここには多くの DDS ユーザーがいないと思います。

いくつかの調査の結果、次の互換性基準が満たされている場合にのみ、リーダー/ライターの一致が発生することがわかりました。

解決策は、ライターの QoS を設定して、同じ活性を提供することでした。おそらく、要求されたリーダーの QoS が対応するライターによって提供されるかどうかを確認する方法があり、そうでない場合は「より低い」QoS を使用しますが、まだ試していません。

on_liveliness_changed コールバック メソッドでは、LivelinessChangedStatus からの alive_count を単純に評価しました。

/クリストファー

于 2009-12-16T08:02:22.523 に答える