OpenDDS и уведомление о присутствии издателя

Проблема: Как я могу получать уведомления о живом подключении и отключении издателя стенда?

Предпосылки: я работаю с реализацией OpenDDS, где у меня есть издатель и подписчик с типом данных (dt), использующий одну и ту же тему, расположенную на разных компьютерах.

Читатель на стороне подписчика переопределил реализации on_data_available(...)а также on_liveliness_changed(...), Мой подписчик запускается первым, что приводит к обратному вызову on_liveliness_changed(...) который говорит, что нет доступных авторов. Когда издатель запущен, я получаю новый ответный звонок, чтобы сообщить мне, что писатель доступен, и когда издатель публикует, on_data_available(...) называется. Пока все работает как положено.

Автор на издателе имеет переопределенную реализацию on_publication_matched(...), При запуске издателя, on_publication_matched(...) вызывается, так как у нас уже есть подписчик.

Проблема в том, что когда издатель отключается, я не получаю обратного вызова on_liveliness_changed(...) на стороне читателя, и я не получаю новый обратный вызов, когда издатель запускается снова.

Я попытался изменить читатель Qos, установив 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) );

/ Kristofer

1 ответ

Решение

Хорошо, думаю, здесь не так много пользователей DDS.

После некоторых исследований я обнаружил, что совпадение между читателем и писателем происходит только в том случае, если этот критерий совместимости удовлетворяется: предложил lease_duration <= запрошенный lease_duration

Решение состояло в том, чтобы установить QoS автора, чтобы предложить ту же живость. Вероятно, есть способ проверить, может ли запрашиваемый QoS считывателя быть предоставлен соответствующим автором, и если нет, использовать "более низкий" QoS, все, что я еще не пробовал.

В методе обратного вызова on_liveliness_changed я просто оценил alive_count в элементе из LivelinessChangedStatus.

/ Kristofer

Другие вопросы по тегам