2017-01-12 8 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 번 반복됩니다. 사실, DataSample 내부 데이터가 없었다

: 웹 검색

+0

샘플 내용을 인쇄하기 전에'SampleInfo'에서'valid_data' 플래그를 확인 했습니까? –

+0

사실이 플래그를 확인하지 않았습니다. 내 코드에서이 확인을 사용하도록 설정 했으므로 필터링 할 수있었습니다. 감사합니다. 그러나 나는 인터넷에 관한 나의 전체 질문에 대한 해답을 발견했다 ... – MSch8791

답변

0

, 나는 나에게 완전히 올바른을하지 않는 것 자신의 대답을 확장하고 싶습니다. 나는 DDS specification에 설명 된 메커니즘을 기반으로합니다.

이러한 빈 DataSample은 DataWriter가 꺼질 때 OpenDDS에서 내부적으로 상태 변경 알림을 상징합니다.

DDS 사양에 따르면 DataWriter가 삭제되면 모든 인스턴스가 등록 취소됩니다. 등록 취소는 인스턴스가 ALIVE에서 NOT_ALIVE로 상태가 변경됨을 의미합니다. 이러한 상태 변화는 당신이 쓴 것처럼 "내부"가 아니지만 관심이있는 누구에게나 보이기위한 것입니다. SampleInfo 구조의 instance_state 필드를 검사하여 애플리케이션을 구독 할 수 있습니다. 귀하의 경우에는

, 당신은 10 인스턴스 (키 값)를 썼다 그래서 DataWriter의 파괴, 10 업데이트에 각각 표시 이전에 게시 된 인스턴스의 상태에 변화를 초래.

는 그들은 읽을 수 없습니다해야하지만 단지 알림으로 간주 될 수있다.

이러한 업데이트는 인스턴스 상태 만 변경되었으므로 valid_data 플래그가 지워지고 실제로 해당 데이터 필드를 읽지 않아야합니다. 그러나 해당 DataReader에서 get_key_value()을 호출하고 SampleInfo 구조체의 instance_handle 필드에있는 InstanceHandle_t을 전달하여 업데이트가 어떤 인스턴스인지 확인할 수 있습니다. 그렇게했다면, 귀하는 귀하의 케이스에서 ID (0-9)에 대한 통지가있을 것입니다.

+0

답변을 주셔서 감사합니다. 실제로 인터넷 및 문서에있는 정보를 확장합니다. – MSch8791

0

, 나는 내 자신의 질문에 대한 답을 발견했다. valid_data 플래그는 DataSample에 데이터가 있는지 여부를 확인하는 데 유용합니다.

은 이 꺼져있을 때 OpenDDS의 내부적으로 상태 변경 알림을 상징합니다. 그것들은 읽히지 말고 단지 통고로 간주되어야합니다. 내가 특별히 OpenDDS과 경험이 없지만