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