2017-01-12 17 views
0

Я хотел бы понять, почему OpenDDS повторно отправляет те же последние данные n раз (где n - количество уже отправленных сообщений), когда DataWriter удален?Почему OpenDDS отправляет те же последние данные, когда DataWriter удален

Является ли это результатом определенного QoS, который я пропустил?

Выход небольшого теста я сделал:

Received data ! ID = 0 Text = Hello world ! 
Received data ! ID = 1 Text = Hello world ! 
Received data ! ID = 2 Text = Hello world ! 
Received data ! ID = 3 Text = Hello world ! 
Received data ! ID = 4 Text = Hello world ! 
Received data ! ID = 5 Text = Hello world ! 
Received data ! ID = 6 Text = Hello world ! 
Received data ! ID = 7 Text = Hello world ! 
Received data ! ID = 8 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 
Received data ! ID = 9 Text = Hello world ! 

Мы ясно видим, в этом примере 10 сообщений были отправлены и получены DataReader. Затем, как только DataWriter был удален (или во время удаления?), Появляется 10 повторений последнего полученного сообщения.

+0

Вы проверяли флаг 'valid_data' в' SampleInfo' перед печатью содержимого образца? –

+0

На самом деле я не проверял этот флаг. Включение этой проверки в моем коде, я смог ее отфильтровать, спасибо. Однако я нашел ответ на весь мой вопрос в Интернете ... – MSch8791

ответ

0

Хотя у меня нет опыта работы с OpenDDS, я хотел бы расширить свой собственный ответ, что для меня не совсем корректно. Я основываю это на механизмах, описанных в DDS specification.

Эти пустые DataSample символизировали уведомления об изменениях состояний внутри OpenDDS при выходе DataWriter.

Согласно спецификации DDS, уничтожение DataWriter приводит к незарегистрированию всех его экземпляров. Это незарегистрирование подразумевает изменение состояния экземпляров от ALIVE до NOT_ALIVE. Эти изменения состояния не являются «внутренними», как вы писали, но предназначены для того, чтобы быть видимыми для всех, кто заинтересован. Подписывающие приложения могут быть проинформированы об этом, проверив поле instance_state в структуре SampleInfo.

В вашем случае вы написали 10 экземпляров (значения ключа), поэтому уничтожение DataWriter привело к 10 обновлениям, каждый из которых указывает на изменение состояния ранее опубликованных экземпляров.

Их не следует читать, а просто рассматривать как уведомления.

Поскольку эти обновления указывают на изменения в состоянии только случаях valid_data флаг сброшен, и в самом деле, их поля данных не следует читать. Тем не менее, по-прежнему можно определить, к какому экземпляру относится обновление, вызывая get_key_value() в рассматриваемом DataReader и передавая ему InstanceHandle_t в поле instance_handle структуры SampleInfo. Если вы это сделаете, вы заметите, что будет уведомление для каждого ID от 0 до 9 в вашем случае.

+0

Спасибо за ваш ответ, он действительно расширяет информацию, которую я получил в Интернете и документацию. – MSch8791

0

Поиск в Интернете, я нашел ответ на мой собственный вопрос:

В самом деле, не было никаких данных внутри DataSample. Флаг valid_data полезен для определения наличия данных DataSample.

Эти пустые DataSample обозначены уведомления об изменениях состояний внутри в OpenDDS, когда DataWriter отключился. Их не следует читать, а просто рассматривать как уведомления.

 Смежные вопросы

  • Нет связанных вопросов^_^