文章

fastdds服务发现报文分析

注意

在抓包时偶然发现在不同的机器上服务发现的数据是不太一样的,已经测试过同一机器运行客户端服务端,不同机器运行客户端服务端,开启SHM或者关闭SHM 发现的数据都是可能不同的,因为服务发现的参数列表(QOS)允许厂商自定义的信息,某些参数可能还会以列表形式下发,根据机器的不同参数的不同所以数据会有所差异,以下是不同的抓包数据截图

image1

image2

image3

image4

名称功能
INFO_TS指示该条RTPS消息被发送时的时间戳。
INFO_DST指示在该条RTPS消息中,INFO_DST后面的子消息的处理者RTPS reader实体的GuidPrefix为INFO_DST.GuidPrefix。
DATA(p)数据消息,包含参与者的属性信息,即PDP消息。
DATA(w)数据消息,包含userWriter的属性信息。当发布端userWriter创建成功后,该消息会被发送给订阅端。
DATA(r)数据消息,包含userReader的属性信息。当订阅端userReader创建成功后,该消息会被发送给发布端。
DATA数据消息,包含用户发送的实际消息内容。
HEARTBEAT该消息有两个功能:
1. 它通知Reader在Writer的历史缓存中可用的序列号,这样Reader就可以请求(使用一个AckNack消息)任何已经错过的内容。

2. 它要求Reader发送对已进入Reader历史缓存的CacheChange更改的确认,以便Writer了解Reader的状态。

所有Heartbeat消息都有第一个功能。也就是说,Reader总是会发现writer的HistoryCache的状态,并可能请求它所遗漏的内容。通常,如果它丢失了一个CacheChange,RTPS Reader会发送一个AckNack消息。

Writer使用FinalFlag请求Reader对它收到的序列号发送确认信息。如果Heartbeat设置了FinalFlag,那么Reader就不需要回AckNack消息了。但是,如果没有设置FinalFlag,那么Reader必须发送一个AckNack消息,指示它已经接收到哪些缓存更改,即使AckNack指出它已经在Writer的历史缓存中获得了所有的CacheChange更改。
ACKNACK该子消息用于将Reader的状态通知Writer。该子消息允许Reader告知Writer所收到的序列号,以及它仍然缺少的序列号。这个子消息可以用来做正常应答以及异常应答。

ACKNACK消息中元素readerSNState,所有在readerSNState.base之前的序列号是已经被Reader确认收到的。出现在集合里面的序列号是Reader没有收到的序列号。

开始

以下数据都是16进制显示的数据
以数据包最大的开始数据包分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
0000   01 00 5e 7f 00 01 62 ef 4a 7b d3 bb 08 00 45 00
0010   02 48 81 af 00 00 01 11 00 00 c0 a8 0f 67 ef ff
0020   00 01 f2 c0 1c e8 02 34 c2 55 52 54 50 53 02 03
0030   01 0f 01 0f 97 16 a4 12 a9 9f 00 00 00 00 09 01
0040   08 00 bc 04 12 66 28 64 e7 99 15 05 cc 01 00 00
0050   10 00 00 01 00 c7 00 01 00 c2 00 00 00 00 01 00
0060   00 00 00 03 00 00 15 00 04 00 02 03 00 00 16 00
0070   04 00 01 0f 00 00 50 00 10 00 01 0f 97 16 a4 12
0080   a9 9f 00 00 00 00 00 00 01 c1 07 80 04 00 11 00
0090   00 00 32 00 18 00 01 00 00 00 f2 1c 00 00 00 00
00a0   00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67 32 00
00b0   18 00 01 00 00 00 f2 1c 00 00 00 00 00 00 00 00
00c0   00 00 00 00 00 00 c0 a8 38 01 31 00 18 00 10 00
00d0   00 00 f3 1c 00 00 55 97 16 00 00 00 00 00 00 00
00e0   00 00 00 00 00 00 31 00 18 00 01 00 00 00 f3 1c
00f0   00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8
0100   0f 67 31 00 18 00 01 00 00 00 f3 1c 00 00 00 00
0110   00 00 00 00 00 00 00 00 00 00 c0 a8 38 01 02 00
0120   08 00 14 00 00 00 00 00 00 00 58 00 04 00 3f 0c
0130   0f 00 62 00 14 00 10 00 00 00 50 61 72 74 69 63
0140   69 70 61 6e 74 5f 73 75 62 00 59 00 c8 00 04 00
0150   00 00 11 00 00 00 50 41 52 54 49 43 49 50 41 4e
0160   54 5f 54 59 50 45 00 00 00 00 07 00 00 00 53 49
0170   4d 50 4c 45 00 00 1b 00 00 00 66 61 73 74 64 64
0180   73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e
0190   68 6f 73 74 00 00 23 00 00 00 44 45 53 4b 54 4f
01a0   50 2d 32 34 30 32 30 49 52 3a 34 30 30 30 36 33
01b0   37 38 37 38 32 35 31 30 32 38 34 38 00 00 1b 00
01c0   00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63
01d0   61 6c 5f 64 61 74 61 2e 75 73 65 72 00 00 03 00
01e0   00 00 76 6d 00 00 1e 00 00 00 66 61 73 74 64 64
01f0   73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e
0200   70 72 6f 63 65 73 73 00 00 00 05 00 00 00 34 37
0210   37 32 00 00 00 00 01 00 00 00 80 01 38 00 01 00
0220   00 00 e8 1c 00 00 00 00 00 00 00 00 00 00 00 00
0230   00 00 ef ff 00 01 bc 04 12 66 47 f2 f0 99 02 00
0240   00 00 00 00 00 00 58 04 00 00 00 00 00 00 00 00
0250   00 00 00 00 00 00

报文总字节数 598 字节,使用的 fastdds

以太网帧

1
0000   01 00 5e 7f 00 01 62 ef 4a 7b d3 bb 08 00
  • 目的地址 01 00 5e 7f 00 01
  • 源地址62 ef 4a 7b d3 bb
  • 类型08 00 对应协议 IPV4

IP 帧

1
2
0000   45 00 02 48 81 af 00 00 01 11 00 00 c0 a8 0f 67
0010   ef ff 00 01
  • 版本 4 –>IPV4
  • 报头长度 20字节 这个单位是 4 字节所以是5*4=20字节
  • 服务类型质量 0 CS0 默认值
  • IP 包总长度02 48==584 字节
  • ID 标识符81 af
  • flag 为 0 没有分片
  • TTL 1
  • 协议0x11 对应 udp 协议
  • 头部校验 这里貌似是硬件校验的缘故所以是 0
  • 源地址c0 a8 0f 67 转换后是192.168.15.103
  • 目的地址ef ff 00 01转换后是239.255.0.1

udp 头

1
0000   f2 c0 1c e8 02 34 c2 55
  • 源端口 f2 c0 对应 62144
  • 目的端口1c e8 对应 7400
  • 数据报长度02 34 564 字节除去头那就是 556 个字节
  • 校验和c2 55

rtps 协议(udp 数据部分)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
0000   52 54 50 53 02 03 01 0f 01 0f 97 16 a4 12 a9 9f
0010   00 00 00 00 09 01 08 00 bc 04 12 66 28 64 e7 99
0020   15 05 cc 01 00 00 10 00 00 01 00 c7 00 01 00 c2
0030   00 00 00 00 01 00 00 00 00 03 00 00 15 00 04 00
0040   02 03 00 00 16 00 04 00 01 0f 00 00 50 00 10 00
0050   01 0f 97 16 a4 12 a9 9f 00 00 00 00 00 00 01 c1
0060   07 80 04 00 11 00 00 00 32 00 18 00 01 00 00 00
0070   f2 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0080   c0 a8 0f 67 32 00 18 00 01 00 00 00 f2 1c 00 00
0090   00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01
00a0   31 00 18 00 10 00 00 00 f3 1c 00 00 55 97 16 00
00b0   00 00 00 00 00 00 00 00 00 00 00 00 31 00 18 00
00c0   01 00 00 00 f3 1c 00 00 00 00 00 00 00 00 00 00
00d0   00 00 00 00 c0 a8 0f 67 31 00 18 00 01 00 00 00
00e0   f3 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00f0   c0 a8 38 01 02 00 08 00 14 00 00 00 00 00 00 00
0100   58 00 04 00 3f 0c 0f 00 62 00 14 00 10 00 00 00
0110   50 61 72 74 69 63 69 70 61 6e 74 5f 73 75 62 00
0120   59 00 c8 00 04 00 00 00 11 00 00 00 50 41 52 54
0130   49 43 49 50 41 4e 54 5f 54 59 50 45 00 00 00 00
0140   07 00 00 00 53 49 4d 50 4c 45 00 00 1b 00 00 00
0150   66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c
0160   5f 64 61 74 61 2e 68 6f 73 74 00 00 23 00 00 00
0170   44 45 53 4b 54 4f 50 2d 32 34 30 32 30 49 52 3a
0180   34 30 30 30 36 33 37 38 37 38 32 35 31 30 32 38
0190   34 38 00 00 1b 00 00 00 66 61 73 74 64 64 73 2e
01a0   70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 75 73
01b0   65 72 00 00 03 00 00 00 76 6d 00 00 1e 00 00 00
01c0   66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c
01d0   5f 64 61 74 61 2e 70 72 6f 63 65 73 73 00 00 00
01e0   05 00 00 00 34 37 37 32 00 00 00 00 01 00 00 00
01f0   80 01 38 00 01 00 00 00 e8 1c 00 00 00 00 00 00
0200   00 00 00 00 00 00 00 00 ef ff 00 01 bc 04 12 66
0210   47 f2 f0 99 02 00 00 00 00 00 00 00 58 04 00 00
0220   00 00 00 00 00 00 00 00 00 00 00 00

RTPS Header 结构

fastdds 的消息头部结构定义在fastdds/rtps/messages/RTPS_messages.h
此结构未包含protocol字段

image5

是在创建消息头的时候固定添加的RTPS位于cpp/rtps/messages/RTPSMessageCreator.cpp

image6

protocol

对应52 54 50 53RTPS
此值在规范中已固定PROTOCOL_RTPS

image7

version

对应02 03 即版本为2.3

截至20240402最新版本为2.5

在fastdds源码fastdds/rtps/common/Types.h 如果启用宏HAVE_SECURITY则默认是2.3 否则默认是2.2

image8

vendorId

对应01 0f 即对应eProsima
可在https://portals.omg.org/dds/dds-rtps-vendor-and-product-ids/ 网址中查询或者向OMG官方注册

在fastdds代码中的位置
fastdds/rtps/common/VendorId_t.hpp

image9

官网查询结果

image10

image11

guidPrefix

对应 01 0f 97 16 a4 12 a9 9f 00 00 00 00
这是当前公共的guid前缀

头部扩展

当前抓包是没有的,因为是在2.5版本中加入的,不破坏原有的结构,此结构符合子消息的格式在老版本中会被判定为未知消息所忽略

子消息

可以有多个子消息的按照以下结构排列

CDR编码后的子消息结构

image12

子消息ID

子消息的类型是固定的在协议中规定如下

image13

头部扩展是2.5新增的之前的版本是没有的

在fastdds中定义如下include/fastdds/rtps/messages/RTPS_messages.h

image14

  • 实体子消息
    • Data 包含有关应用程序数据对象值的信息。数据子消息由Writer发送给Reader。
    • DataFrag 等效于Data,但只包含新值的一部分(一个或多个片段)。允许数据作为多个片段传输,以克服传输消息大小的限制。
    • Hearbeat 描述Writer中可用的信息。Hearbeat消息由一个Writer发送给一个或多个Reader。
    • HeartbeatFrag 对于碎片数据,描述了写入程序中可用的碎片。HeartbeatFrag消息由Writer发送给一个或多个Reader。
    • Gap 描述与Reader不再相关的信息。Gap消息由Writer发送给一个或多个Reader。
    • AckNack 向Writer提供有关Reader状态的信息。AckNack消息由Reader发送给一个或多个Writer。
    • NackFrag向Writer提供有关Reader状态的信息,更具体地说,是Reader仍缺少哪些片段。NackFrag消息由Reader发送给一个或多个Writer。
  • 解释器子消息
    • HeaderExtension 提供逻辑上属于RTPS报头的其他信息。附加信息包含在此子消息中,而不是HTPS报头,以保持与RTPS协议早期版本的互操作性。RTPS 2.4版和早期版本无法处理HeaderExtension,将跳过此子消息。
    • InfoSource 提供有关后续实体子消息来源的信息。该子消息主要用于中继RTPS子消息。当前规范中未对此进行讨论。
    • InfoDestination 提供有关子序列实体子消息的最终目标的信息。该子消息主要用于中继RTPS子消息。当前规范中未对此进行讨论。
    • InfoReply 提供有关在何处回复在后续子消息中出现的实体的信息。
    • InfoTimestamp 为后续的实体子消息提供一个源时间戳
    • Pad 如果需要用于内存对齐,则用于向消息中添加填充。
flag

当前抓取的报文第一个子消息 flag值为0x01
即EndiannessFlag 值为true 所以使用小段编码

其他的位是根据具体的子消息类型来确定其意义的

submessageLength

子消息的长度(不包括子消息报头)

又称为octetsToNextHeader 是一个CDR无符号短整型(ushort)

如果子信息长度>0

  • 从子消息的内容开始到下一个子消息的报头开始的长度(如果子消息不是消息中的最后一条子消息)。
  • 或者它是剩余的消息长度(如果子消息是消息中的最后一条子消息)。消息的解释器可以区分这两种情况,因为它知道消息的总长度。

如果submessageLength==0,则子消息是消息中的最后一条子消息,并一直延伸到消息的末尾。这使得可以发送大于64k的子消息(可存储在子消息长度字段中的最大长度),前提是它们是消息中的最后一条子消息

当前第一个子消息
1
0000   09 01 08 00 bc 04 12 66 28 64 e7 99
  • ID 0x09 代表InfoTimestamp 用于为后续子消息提供源时间戳
  • flag 0x01
    • flag&0x01==true 小端
    • flag&0x02=false 代表后续的子消息是否应该被认为具有时间戳 此值为false 代表是有效时间戳
  • 数据长度 08 00 因为是小端所以是8字节
  • 时间戳bc 04 12 66 28 64 e7 99 转换后是Apr 7, 2024 02:28:12.601187000 UTC
当前第二个子消息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
0000   15 05 cc 01 00 00 10 00 00 01 00 c7 00 01 00 c2
0010   00 00 00 00 01 00 00 00 00 03 00 00 15 00 04 00
0020   02 03 00 00 16 00 04 00 01 0f 00 00 50 00 10 00
0030   01 0f 97 16 a4 12 a9 9f 00 00 00 00 00 00 01 c1
0040   07 80 04 00 11 00 00 00 32 00 18 00 01 00 00 00
0050   f2 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0060   c0 a8 0f 67 32 00 18 00 01 00 00 00 f2 1c 00 00
0070   00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01
0080   31 00 18 00 10 00 00 00 f3 1c 00 00 55 97 16 00
0090   00 00 00 00 00 00 00 00 00 00 00 00 31 00 18 00
00a0   01 00 00 00 f3 1c 00 00 00 00 00 00 00 00 00 00
00b0   00 00 00 00 c0 a8 0f 67 31 00 18 00 01 00 00 00
00c0   f3 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00d0   c0 a8 38 01 02 00 08 00 14 00 00 00 00 00 00 00
00e0   58 00 04 00 3f 0c 0f 00 62 00 14 00 10 00 00 00
00f0   50 61 72 74 69 63 69 70 61 6e 74 5f 73 75 62 00
0100   59 00 c8 00 04 00 00 00 11 00 00 00 50 41 52 54
0110   49 43 49 50 41 4e 54 5f 54 59 50 45 00 00 00 00
0120   07 00 00 00 53 49 4d 50 4c 45 00 00 1b 00 00 00
0130   66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c
0140   5f 64 61 74 61 2e 68 6f 73 74 00 00 23 00 00 00
0150   44 45 53 4b 54 4f 50 2d 32 34 30 32 30 49 52 3a
0160   34 30 30 30 36 33 37 38 37 38 32 35 31 30 32 38
0170   34 38 00 00 1b 00 00 00 66 61 73 74 64 64 73 2e
0180   70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 75 73
0190   65 72 00 00 03 00 00 00 76 6d 00 00 1e 00 00 00
01a0   66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c
01b0   5f 64 61 74 61 2e 70 72 6f 63 65 73 73 00 00 00
01c0   05 00 00 00 34 37 37 32 00 00 00 00 01 00 00 00
  • ID 0x15 代表DATA是从RTPS Writer发送到RTPS Reader

image15

  • flag 0x05
    • flag&0x01==true 小端
    • flag&0x02==false 不包含inlineQos
    • flag&0x04==true 有序列化后的有效数据
    • flag&0x08==false 不包含key
    • flag&0x10==false 代表是按照规定序列化的(貌似是新的)
  • 数据长度 cc 01 469字节
  • 扩展flag 占位符为以后扩展准备 暂时为0
  • octetsToInlineQos 10 00 小端所以是16 代表当前开始到inlineQos(不存在就inlineQos下一个字段)的偏移量,这里偏移16后是序列化的数据的起始地址
  • readerId 标识通知更改的RTPS Reader实体 这里是00 01 00 c7
  • writerId标识已对数据对象进行更改的RTPS Writer 实体这里是 00 01 00 c2
  • 数据发送序号 这里是00 00 00 00 01 00 00 00 分高位低位 这里高位为0 低位为1 所以序号为0x01
  • 剩下的部分为序列化后的PDP数据
PDP
  1. 按照RTPS协议规定 PDP的发现信息应当包含domainID和domainTag字段,这里从源码上看fastdds将这两个字段省略了(不可配置那种省略)。

  2. domainID 是与端口相关的是属于物理隔离,就是说如果两个APP的domainID不同那么他们呢根本无法接受到彼此的发现流量

  3. domainTag 是属于逻辑隔离,即当domainTag不同的数据会被忽略,fastdds这么做就是将domainTag认为是空,所以fastdds想要其他dds通讯的话其他dd是的此字段也要相应置空

  4. 这里抓rti的包是有domainID字段的,domainTag是可选的,默认不存在,但是rti是支持domainTag的可通过qos设置,PRES_PARTICIPANT_DOMAIN_TAG_PROPERTY_NAME

    image16

  • 00 03 这个是CDR的序列化类型,详见第10章节
  • 00 00 options未使用设置为0详见第10章节
  • 15 00 04 00 02 03 00 00
    • 参数ID15 00 代表 PID_PROTOCOL_VERSION 协议版本
    • 长度04 00 4字节
    • 数据02 03代表版本2.3
  • 16 00 04 00 01 0f 00 00
    • 参数ID16 00 代表 PID_VENDOR_ID 厂商ID
    • 长度04 00 4字节
    • 数据01 0f 00 00查表得知代表为eProsima的FastRTPS, FastDDS
  • 50 00 10 00 01 0f 97 16 a4 12 a9 9f 00 00 00 00 00 00 01 c1
    • 参数ID50 00 代表 PID_PARTICIPANT_GUID 参与制GUID
    • 长度10 00 16字节
    • 数据01 0f 97 16 a4 12 a9 9f 00 00 00 00 00 00 01 c1GUID为 010f9716-a412a99f-00000000-000001c1
  • 07 80 04 00 11 00 00 00
    • 参数ID07 80 这是厂商的自定义ID 这里代表远程网络配置
    • 长度04 00 4字节
    • 数据11 00 00 00
  • 32 00 18 00 01 00 00 00 f2 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67
    • 参数ID32 00 代表PID_METATRAFFIC_UNICAST_LOCATOR 是元数据单播的地址信息
    • 长度18 00 24字节
    • 数据01 00 00 00 f2 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67
      • 01 00 00 00 代表传输类型为UDPV4
      • f2 1c 00 00 代表端口为7410
      • 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67代表地址为192.168.15.103
  • 32 00 18 00 01 00 00 00 f2 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01
    • 参数ID32 00 代表PID_METATRAFFIC_UNICAST_LOCATOR 是元数据单播的地址信息
    • 长度18 00 24字节
    • 数据01 00 00 00 f2 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01
      • 01 00 00 00 代表传输类型为UDPV4
      • f2 1c 00 00 代表端口为7410
      • 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01代表地址为192.168.56.1
  • 31 00 18 00 10 00 00 00 f3 1c 00 00 55 97 16 00 00 00 00 00 00 00 00 00 00 00 00 00
    • 参数ID31 00 代表PID_DEFAULT_UNICAST_LOCATOR 参与者内部端点的默认通信地址信息
    • 长度18 00 24字节
    • 数据10 00 00 00 f3 1c 00 00 55 97 16 00 00 00 00 00 00 00 00 00 00 00 00 00
      • 10 00 00 00 这个应该是fastdds的共享内存,显示的是未知协议是因为rtps协议没有讲共享内存作为预定义的协议
      • f3 1c 00 00 代表端口为7411
      • 55 97 16 00 00 00 00 00 00 00 00 00 00 00 00 00 55 是 ‘U’的ASCII代表标记为单播 这里fastdds官方文档和代码不一致,所以这就是 97 16的由来 image17
  • 31 00 18 00 01 00 00 00 f3 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67
    • 参数ID31 00 代表PID_DEFAULT_UNICAST_LOCATOR 参与者内部端点的默认通信地址信息
    • 长度18 00 24字节
    • 数据01 00 00 00 f3 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67
      • 01 00 00 00 代表传输类型为UDPV4
      • f3 1c 00 00 代表端口为7411
      • 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 0f 67代表地址为192.168.15.103
  • 31 00 18 00 01 00 00 00 f3 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01
    • 参数ID31 00 代表PID_DEFAULT_UNICAST_LOCATOR 参与者内部端点的默认通信地址信息
    • 长度18 00 24字节
    • 数据01 00 00 00 f3 1c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01
      • 01 00 00 00 代表传输类型为UDPV4
      • f3 1c 00 00 代表端口为7411
      • 00 00 00 00 00 00 00 00 00 00 00 00 c0 a8 38 01代表地址为192.168.56.1
  • 02 00 08 00 14 00 00 00 00 00 00 00
    • 参数ID02 00 代表PID_PARTICIPANT_LEASE_DURATION租赁时间,每当从参与者接收到公告时,应认为参与者存活的时间长度
    • 长度08 00 8字节
    • 数据14 00 00 00 00 00 00 00 代表租赁时间为20秒
  • 58 00 04 00 3f 0c 0f 00
    • 参数ID58 00 代表PID_VENDOR_BUILTIN_ENDPOINT_SET 此属性标识参与者中可用的内建SEDP端点类型
    • 长度04 00 4字节
    • 数据3f 0c 0f 00=> 转换后(注意字节序)00000000000011110000110000111111
      • data & (0x01 < 0) == true : PARTICIPANT_ANNOUNCER
      • data & (0x01 < 1) == true : PARTICIPANT_DETECTOR
      • data & (0x01 < 2) == true : PUBLICATIONS_ANNOUNCER
      • data & (0x01 < 3) == true : PUBLICATIONS_DETECTOR
      • data & (0x01 < 4) == true : SUBSCRIPTIONS_ANNOUNCER
      • data & (0x01 < 5) == true : SUBSCRIPTIONS_DETECTOR
      • data & (0x01 < 6) == false : PARTICIPANT_PROXY_ANNOUNCER
      • data & (0x01 < 7) == false : PARTICIPANT_PROXY_DETECTOR
      • data & (0x01 < 8) == false : PARTICIPANT_STATE_ANNOUNCER
      • data & (0x01 < 9) == false : PARTICIPANT_STATE_DETECTOR
      • data & (0x01 < 10) == true : PARTICIPANT_MESSAGE_DATA_WRITER
      • data & (0x01 < 11) == true : PARTICIPANT_MESSAGE_DATA_READER
      • data & (0x01 < 12) == true : x-type TypeLookupServiceRequestDataWriter
      • data & (0x01 < 13) == true : x-type TypeLookupServiceRequestDataReader
      • data & (0x01 < 14) == true : x-type TypeLookupServiceReplyDataWriter
      • data & (0x01 < 15) == true : x-type TypeLookupServiceReplyDataReader
      • data & (0x01 < 16) == false : security SEDPbuiltinPublicationsSecureWriter
      • data & (0x01 < 17) == false : security SEDPbuiltinPublicationsSecureReader
      • data & (0x01 < 18) == false : security SEDPbuiltinSubscriptionsSecureWriter
      • data & (0x01 < 19) == false : security SEDPbuiltinSubscriptionsSecureReader
      • data & (0x01 < 20) == false : security BuiltinParticipantMessageSecureWriter
      • data & (0x01 < 21) == false : security SEDPbuiltinSubscriptionsSecureReader
      • data & (0x01 < 22) == false : security BuiltinParticipantStatelessMessageWriter
      • data & (0x01 < 23) == false : security BuiltinParticipantStatelessMessageReader
      • data & (0x01 < 24) == false : security BuiltinParticipantVolatileMessageSecureWriter
      • data & (0x01 < 25) == false : security BuiltinParticipantVolatileMessageSecureReader
      • data & (0x01 < 26) == false : security SPDPbuiltinParticipantSecureWriter
      • data & (0x01 < 27) == false : security SPDPbuiltinParticipantSecureReader
      • data & (0x01 < 28) == false : TOPICS_ANNOUNCER
      • data & (0x01 < 29) == false : TOPICS_DETECTOR
  • 62 00 14 00 10 00 00 00 50 61 72 74 69 63 69 70 61 6e 74 5f 73 75 62 00
    • 参数ID62 00 代表PID_ENTITY_NAME 这个可以代表一个DDS实体(如参与者、发布者、订阅者、主题等)的名称信息 这里fastdds是代表的是参与者名称
    • 长度14 00 20字节
    • 数据10 00 00 00 50 61 72 74 69 63 69 70 61 6e 74 5f 73 75 62 00
      • 10 00 00 00字符串长度16字节
      • 50 61 72 74 69 63 69 70 61 6e 74 5f 73 75 62 00 参与者名称Participant_sub
  • 59 00 c8 00 04 00 00 00 11 00 00 00 50 41 52 54 49 43 49 50 41 4e 54 5f 54 59 50 45 00 00 00 00 07 00 00 00 53 49 4d 50 4c 45 00 00 1b 00 00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 68 6f 73 74 00 00 23 00 00 00 44 45 53 4b 54 4f 50 2d 32 34 30 32 30 49 52 3a 34 30 30 30 36 33 37 38 37 38 32 35 31 30 32 38 34 38 00 00 1b 00 00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 75 73 65 72 00 00 03 00 00 00 76 6d 00 00 1e 00 00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 70 72 6f 63 65 73 73 00 00 00 05 00 00 00 34 37 37 32 00 00 00 00
    • 参数ID59 00 代表PID_PROPERTY_LIST 携带的用户自定义属性集(注意是使用pl_cdr序列化的,这里可能是4字节对齐的填充)
    • 长度c8 00 200字节
    • 列表元素数量04 00 00 00 4个元素
    • 11 00 00 00 50 41 52 54 49 43 49 50 41 4e 54 5f 54 59 50 45 00 00 00 00 07 00 00 00 53 49 4d 50 4c 45 00 00
      • 第一个属性的名称,长度为(11 00 00 00)17字节的字符串PARTICIPANT_TYPE
      • 第一个属性的值,长度为(07 00 00 00)7字节的字符串SIMPLE
    • 1b 00 00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 68 6f 73 74 00 00 23 00 00 00 44 45 53 4b 54 4f 50 2d 32 34 30 32 30 49 52 3a 34 30 30 30 36 33 37 38 37 38 32 35 31 30 32 38 34 38 00 00
      • 第二个属性的名称,长度为(1b 00 00 00)27字节的字符串fastdds.physical_data.host
      • 第二个属性的值,长度为(23 00 00 00)35字节的字符串DESKTOP-24020IR:400063787825102848
    • 1b 00 00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 75 73 65 72 00 00 03 00 00 00 76 6d 00 00
      • 第三个属性的名称,长度为(1b 00 00 00)27字节的字符串fastdds.physical_data.user
      • 第三个属性的值,长度为(03 00 00 00)3字节的字符串vm
    • 1e 00 00 00 66 61 73 74 64 64 73 2e 70 68 79 73 69 63 61 6c 5f 64 61 74 61 2e 70 72 6f 63 65 73 73 00 00 00 05 00 00 00 34 37 37 32 00 00 00 00
      • 第四个属性的名称,长度为(1e 00 00 00)30字节的字符串fastdds.physical_data.process
      • 第四个属性的值,长度为(05 00 00 00)5字节的字符串4772
  • 01 00 00 00 代表PID_SENTINEL结束标志
本文由作者按照 CC BY 4.0 进行授权