fastrtps: как использовать историю DDS на уровне публикации / подписки? - PullRequest
0 голосов
/ 06 февраля 2020

Я использую fastrtps (https://github.com/eProsima/Fast-RTPS) C ++ DDS для публикации sh и подписки данных, используя уровень публикации / подписки (не уровень чтения / записи нижнего уровня). Fastrtps поддерживает историю, то есть присоединение подписчика после публикации издателем некоторых сообщений должно быть в состоянии получать эти старые сообщения. Документация довольно четко объясняет, как настроить историю как на стороне издателя, так и на стороне подписчика, но нет документации о том, как читать реальные сообщения истории. Мне также не удалось найти никаких подсказок в файлах заголовков.

Как я могу получать сообщения истории, используя слой публикации / подписки fastrtps?

Обычный fastrtps :: SubscriberListener Обратный вызов :: onNewDataMessage (), похоже, не работает для истории, только для новых сообщений (как предполагает его подпись). Я бы ожидал что-то вроде этого:

fastrtps::Subsciber *mySubscriber;
(...)
mySubscriber->getHistory(...);

или, возможно,

MySubscriberListerner : public fastrtps::SubscriberListener
{
  (...)
  void onHistoryMessage();  // SubscriberListener callback
}

Но не могу найти ничего подобного.

1 Ответ

0 голосов
/ 07 февраля 2020

Когда вы устанавливаете историю на DataWriter, он содержит столько отправленных им выборок. Когда вы устанавливаете историю в DataReader, он запрашивает , что много ранее отправленных образцов. Примечание: читатель просит, писатель предлагает. Если читатель запрашивает больше, он все равно получает только то, что предлагает писатель. Если читатель запрашивает меньше, он только делает это множество доступным для вашего приложения. (Сказано так, потому что это может привести к разному поведению - где происходит фильтрация? Может быть, на стороне писателя, может на стороне читателя. Зависит от реализации).

Теперь ваш писатель имеет ИСТОРИЮ qos и a определенное количество образцов, которые были проведены на. Ваш читатель также имеет ИСТОРИЮ qos и запрашивает определенное количество ранее отправленных образцов. Нет разницы между «историческим» образцом и «текущим» образцом. Образцы получены ... и ваша заявка уведомлена.

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

Там нет ничего например, «дайте мне исторические образцы», потому что вы уже получили их, когда вы были уведомлены о том, что образцы были доступны (или опрашивали их, или у них был прослушиватель, или как бы то ни было).

Если вы не видите исторические образцы при создании DataReader у вас возникают другие разногласия QOS или проблемы с использованием памяти, или ...

DDS - это ничто, если не настраивается, но вам действительно нужно понимать нюансы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...