文章

ConnextDDS发现报文分析

类别说明
DATA(p)域参与者的信息,包含参与者的GUID,QoS等信息。
DATA(w)DataWriter的信息,包含topic name,type,QoS等信息。
DATA(r)DataReader的信息,包含topic name,type,QoS等信息。
HEARTBEAT1.通知Reader在Writer的历史缓存中可用的序列号,这样Reader就可以请求(发送ACKNACK)任何错过的内容。2.它要求Reader发送对已进入Reader历史缓存的CacheChange更改的确认,以便Writer可以了解Reader的状态。
ACKNACK将Reader的状态通知给Writer,用于告知Writer所收到的消息的序列号或所缺少的消息的序列号。
INFO_TS显示数据包的源时间戳,Endianness表示小字节序(1)还是大字节序(0)。
INFO_DST指示处理该条消息中之后的子消息的RTPS reader实体,该实体的GUID为INFO_DST.GuidPrefix。
GAP通知DataReader 特定sample在DataWriter的队列中不可用。

image1

image2

端点发现阶段:DataWriters

image3

image4

#57 当DATA(p)包被接收到后,参与者发现阶段就结束。此时publication WRITER会发送一条HEARTBEAT,在该条信息中,firstAvailableSeqNumber为1,lastSeqNumber为1,表示这个Publisher application中有一个DataWriter。这条HEARTBEAT消息会被一条ACKNACK消息回复。如#60

image5

#60 通过该条ACKNACK,订阅者告诉发布者,它需要接收一个DATA(w) sample。之后,发布者的publications Writer就会发送一条DATA(w),如#61。

image6

#61 在该条消息中,包含了topic name,type,Qos。 发送方式为reliably,因此也会发送一条HEARTBEAT,其中firstSeqNumber(1),lastSeqNumber(1)表示发布者期望订阅者对接收到这一条DATA(w)消息进行确认。

image7

image8

#69 订阅者发送ACKNACK确认收到了DATA(w)。

image9

端点发现阶段:DataReaders

image10

image11

#50 当DATA(p)包被接收到后,参与者发现阶段就结束。此时subscription WRITER会发送一条HEARTBEAT,在该条信息中,firstAvailableSeqNumber为1,lastSeqNumber为1,表示这个Subscriber application中有一个DataReader。这条HEARTBEAT消息会被一条ACKNACK消息回复。如#51

image12

#51 通过该条ACKNACK,发布者告诉订阅者,它需要接收一个DATA(r) sample。之后,订阅者的subscriptions Writer就会发送一条DATA(r),如#65。

image13

#65 在该条消息中,包含了topic name,type,Qos。 发送方式为reliable,因此也会发送一条HEARTBEAT,其中firstSeqNumber(1),lastSeqNumber(1)表示订阅者期望发布者对接收到这一条DATA(r)消息进行确认。

image14

image15

#67 发布者发送ACKNACK确认收到了DATA(r)。

image16

DataWrier和DataReader在相互发现后,开始通信:

在这个demo中,在DataReader和DataWriter相互发现之前,DataWriter已经发布了一些samples。由于它们的durability被设置为VOLATILE,wrtiters需要让readers知道它们将接收不到第一个samples,通过给每个匹配的DataReaders发送GAP消息来实现。

image17

image18

#72 本demo中,仅包含一个DataWriter和一个DataReader,因此可以看到只有一条GAP消息,该条消息中bitmapBase的值为2表示,该DataWriter告知所有相匹配的DataReaders通信从sequence Number为2的sample开始。

image19

#74 这是第一条通信开始后发送的sample,可以看到SeqNumber为2,与#72中相对应。

image20

本文由作者按照 CC BY 4.0 进行授权