RTPS实时发布订阅协议报头及子消息映射 (未更完)

 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在参与者中是唯一的。

关于对象是内置实体、特定于供应商的实体或用户定义实体的信息被编码在实体种类的两个最重要的比特。 这两个位设置为:

  1. 用户定义实体的 00
  2. 内置实体的 11
  3. 供应商特定实体的 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 ]   + 
|                                                               | 
+---------------+---------------+---------------+---------------+

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值