RTPS报头映射
Header:
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 'R' | 'T' | 'P' | 'S' |
+---------------+---------------+---------------+---------------+
| ProtocolVersion version | VendorId vendorId |
+---------------+---------------+---------------+---------------+
| |
+ +
| GuidPrefix guidPrefix |
+ +
| |
+---------------+---------------+---------------+---------------+
GuidPrefix:定义用于出现在消息中的所有GUID的默认前缀
RTPS子消息映射
Submessage头
E = SubmessageHeader.flags& 0 x01
E=0表示大端,E=1表示小端。
struct SubmessageHeader {
octet submessageId;
octet flags;
unsigned short submessageLength; /* octetsToNextHeader */
};
SubmessageHeader:
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| submessageId | flags |E| ushort octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| |
| following are the |
~ contents of Submessage ~
| |
+---------------+---------------+---------------+---------------+
SubmessageId
enum SubmessageKind {
PAD = 0x01, /* Pad */
ACKNACK = 0x06, /* AckNack */
HEARTBEAT = 0x07, /* Heartbeat */
GAP = 0x08, /* Gap */
INFO_TS = 0x09, /* InfoTimestamp */
INFO_SRC = 0x0c, /* InfoSource */
INFO_REPLY_IP4 = 0x0d, /* InfoReplyIp4 */
INFO_DST = 0x0e, /* InfoDestination */
INFO_REPLY = 0x0f, /* InfoReply */
NACK_FRAG = 0x12, /* NackFrag */
HEARTBEAT_FRAG = 0x13, /* HeartbeatFrag */
DATA = 0x15, /* Data */
DATA_FRAG = 0x16, /* DataFrag */
};
octetsToNextHeader
标识当前子消息除去子消息头的大小
如果octetsToNextHeader> 0,则它是从Submessage内容的第一个八位位组到下一个Submessage的标头的第一个八位位组之间的八位组数(如果Submessage不是消息中的最后一个Submessage),或者消息中剩余的八位字节数(如果Submessage是消息中的最后一个Submessage)。消息的解释器可以区分这两种情况,因为它知道消息的总长度。
如果octetsToNextHeader == 0且Submessage的类型不是NOT PAD或INFO_TS,则Submessage是消息中的最后一个Submessage,并一直扩展到消息的末尾。如果它们是消息中的最后一个子消息,则可以发送大于64k(可以存储在octetsToNextHeader字段中的大小)的子消息。
如果octetsToNextHeader == 0并且Submessage的类型是PAD或INFO_TS,则下一个Submessage标头在当前Submessage标头之后立即开始,或者PAD或INFO_TS是消息中的最后一个Submessage。
AckNack Submessage
0...2...........7...............15.............23...............31
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ACKNACK |X|X|X|X|X|X|F|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
| |
~ SequenceNumberSet readerSNState ~
| |
+---------------+---------------+---------------+---------------+
| Count count |
+---------------+---------------+---------------+---------------+
Flags
F = SubmessageHeader.flags & 0x02
F=1 表示读取器不需要写入器的响应。
F=0 意味着写入器必须响应AckNack消息。
EntityId_t
EntityId_t唯一标识参与者端点
PSM将EntityId_t映射到以下结构:
typedef octet OctetArray3[3];
struct {
OctetArray3 entityKey;
octet entityKind;
};
EntityId_t内的entityKind字段编码实体类型(参与者、Writer、Reader),以及实体是否是内置实体(由协议完全预定义,自动实例化),用户定义的实体(由协议定义,但用户仅根据应用程序的需要实例化)或特定于供应商的实体(由Protoc的特定于供应商的扩展定义 因此,可以被另一个供应商的实现忽略)。
当未预先定义(见下文)时,EntityId_t 内的实体密钥字段可以由中间件实现任意选择,只要所产生的EntityId_t在参与者中是唯一的。
关于对象是内置实体、特定于供应商的实体或用户定义实体的信息被编码在实体种类的两个最重要的比特。 这两个位设置为:
- 用户定义实体的 00
- 内置实体的 11
- 供应商特定实体的 01
- 实体EntityId_t的八进制
实体种类 | 用户定义实体 | 内置实体 |
unknown | 0x00 | 0xc0 |
Participant | N/A | 0xc1 |
Writer (with Key) | 0x02 | 0xc2 |
Writer (no Key) | 0x03 | 0xc3 |
Reader (no Key) | 0x04 | 0xc4 |
Reader (with Key) | 0x07 | 0xc7 |
- RTPS协议完全预定义的EntityId_t值
实体对应的值entityId_t (NAME = value) | |
Participant | ENTITYID_PARTICIPANT = {{00,00,01},c1} |
SEDPbuiltinTopicWriter | ENTITYID_SEDP_BUILTIN_TOPIC_WRITER = {{00,00,02},c2} |
SEDPbuiltinTopicReader | ENTITYID_SEDP_BUILTIN_TOPIC_READER = {{00,00,02},c7} |
SEDPbuiltinPublicationsWriter | ENTITYID_SEDP_BUILTIN_PUBLICATIONS_WRITER = {{00,00,03},c2} |
SEDPbuiltinPublicationsReader | ENTITYID_SEDP_BUILTIN_PUBLICATIONS_READER = {{00,00,03},c7} |
SEDPbuiltinSubscriptionsWriter | ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_WRITER = {{00,00,04},c2} |
SEDPbuiltinSubscriptionsReader | ENTITYID_SEDP_BUILTIN_SUBSCRIPTIONS_READER = {{00,00,04},c7} |
SPDPbuiltinParticipantWriter | ENTITYID_SPDP_BUILTIN_PARTICIPANT_WRITER = {{00,01,00},c2} |
SPDPbuiltinSdpParticipantReader | ENTITYID_SPDP_BUILTIN_PARTICIPANT_READER = {{00,01,00},c7} |
BuiltinParticipantMessageWriter | ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_WRITER = {{00,02,00},c2} |
BuiltinParticipantMessageReader | ENTITYID_P2P_BUILTIN_PARTICIPANT_MESSAGE_READER = {{00,02,00},c7} |
Data Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATA |X|X|X|X|X|D|Q|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| Flags extraFlags | octetsToInlineQos |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
+ SequenceNumber writerSN +
+---------------+---------------+---------------+---------------+
~ ParameterList inlineQos [only if Q==1] ~
+---------------+---------------+---------------+---------------+
~ SerializedPayload serializedPayload [only if D==1 || K==1] ~
+---------------+---------------+---------------+---------------+
Submessage Header中的Flags
Q = SubmessageHeader.flags & 0x02
D = SubmessageHeader.flags & 0x04
K = SubmessageHeader.flags & 0x08
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
D=0和K=0表示没有序列化有效负载子messageelement。
D=1和K=0表示serializedPayload子messageelement包含序列化的数据。
D=0和K=1表示serializedPayload子messageelement包含序列化的键。
D=1和K=1在本协议中是一个无效的组合
extraFlags
为了支持协议的演进,而不会影响向后兼容性。当前应全部置0
DataFrag Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DATA_FRAG |X|X|X|X|X|K|Q|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| Flags extraFlags | octetsToInlineQos |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
+ SequenceNumber writerSN +
+---------------+---------------+---------------+---------------+
| FragmentNumber fragmentStartingNum |
+---------------+---------------+---------------+---------------+
| ushort fragmentsInSubmessage | ushort fragmentSize |
+---------------+---------------+---------------+---------------+
| unsigned long sampleSize |
+---------------+---------------+---------------+---------------+
~ ParameterList inlineQos [only if Q==1] ~
+---------------+---------------+---------------+---------------+
~ SerializedPayload serializedPayload ~
+---------------+---------------+---------------+---------------+
Gap Submessage
0...2...........7...............15.............23...............31
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| GAP |X|X|X|X|X|X|X|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
| |
+ SequenceNumber gapStart +
| |
+---------------+---------------+---------------+---------------+
| |
~ SequenceNumberSet gapList ~
| |
+---------------+---------------+---------------+---------------+
HeartBeat Submessage
0...2...........7...............15.............23...............31
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HEARTBEAT |X|X|X|X|X|L|F|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
| |
+ SequenceNumber firstSN +
| |
+---------------+---------------+---------------+---------------+
| |
+ SequenceNumber lastSN +
| |
+---------------+---------------+---------------+---------------+
| Count count |
+---------------+---------------+---------------+---------------+
HeartBeatFrag Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| HEARTBEAT_FRAG|X|X|X|X|X|X|X|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
| |
+ SequenceNumber writerSN +
| |
+---------------+---------------+---------------+---------------+
| FragmentNumber l astFragmentNum |
+---------------+---------------+---------------+---------------+
| Count count |
+---------------+---------------+---------------+---------------+
InfoDestination Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| INFO_DST |X|X|X|X|X|X|X|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| |
+ +
| GuidPrefix guidPrefix |
+ +
| |
+---------------+---------------+---------------+---------------+
InfoReply Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| INFO_REPLY |X|X|X|X|X|X|M|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| |
~ LocatorList unicastLocatorList ~
| |
+---------------+---------------+---------------+---------------+
| |
~ LocatorList multicastLocatorList [ only if M==1 ] ~
| |
+---------------+---------------+---------------+---------------+
InfoSource Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| INFO_SRC |X|X|X|X|X|X|X|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| long unused |
+---------------+---------------+---------------+---------------+
| ProtocolVersion version | VendorId vendorId |
+---------------+---------------+---------------+---------------+
| |
+ +
| GuidPrefix guidPrefix |
+ +
| |
+---------------+---------------+---------------+---------------+
InfoTimestamp Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| INFO_TS |X|X|X|X|X|X|I|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| |
+ Timestamp timestamp [ only if I==0 ] +
| |
+---------------+---------------+---------------+---------------+
Pad Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PAD |X|X|X|X|X|X|X|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
NackFrag Submessage
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| NACK_FRAG |X|X|X|X|X|X|X|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| EntityId readerId |
+---------------+---------------+---------------+---------------+
| EntityId writerId |
+---------------+---------------+---------------+---------------+
| |
+ SequenceNumber writerSN +
| |
+---------------+---------------+---------------+---------------+
| |
~ FragmentNumberSet fragmentNumberState ~
| |
+---------------+---------------+---------------+---------------+
| Count count |
+---------------+---------------+---------------+---------------+
InfoReplyIp4 Submessage(PSM specific)
0...2...........8...............16.............24...............32
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| INFO_REPLY_IP4|X|X|X|X|X|X|M|E| octetsToNextHeader |
+---------------+---------------+---------------+---------------+
| |
+ LocatorUDPv4 unicastLocator +
| |
+---------------+---------------+---------------+---------------+
| |
+ LocatorUDPv4 multicastLocator [ only if M==1 ] +
| |
+---------------+---------------+---------------+---------------+