Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

按照RTPS协议中描述的,动态发现协议分为PDP(参与者发现协议)EDP(端点发现协议)两种协议。

下面通过先在一台PC上运行HelloworldExample订阅端,再在另外一台PC上运行HelloworldExample发布端,截取通信的码流,来分析发布端和订阅端的完成匹配的交互流程。


PDP

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP
图2-1 发布端和订阅端PDP码流(红色方框)

图2-1 红色方框部分 DATA(p)子消息包含PDP的数据。可以发现PDP数据是通过组播发送的(目的ip地址都是239.255.0.1)。PDP数据不仅在发布端/订阅端匹配的时候会被发送,而且发布端/订阅端都会启动一个定时器,每隔40秒重发一次各自的PDP数据。

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP
定时器默认参数设置
Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP
PDP消息发送定时器

图2-1中红色方框标记的部分有5条PDP消息,其中发布端(192.168.1.7)发送3条,订阅端(192.168.1.169)发送2条。

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP
图2-2 PDP交互时序图

图2-2 中PDP消息发送的时序对应图2-1 中的码流顺序。70,73,74是发布端发送的3次PDP消息,71,72是订阅端发送的2次PDP消息。实际上发布端和订阅端发送的PDP消息次数是一样的,各发送3次PDP消息,发送PDP消息的流程也是一样的。

由于笔者是在订阅端运行后,才运行的wireshark,所以订阅端发送的第一条PDP消息,没有被wireshark捕获。

另外,图2-2中的发布端和订阅端PDP消息交互时序,受网络环境和系统影响,每次测试,捕获的PDP消息交互时序可能不一样。但是发布端和订阅端的PDP消息流程是一致的。

下面以发布端为例,列出70,73,74消息发送的对应的源码具体位置。

70:该消息是在创建参与者时,初始化内置协议完成后发送。源码位置如下:

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

 对应的调用堆栈:

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

 73:该消息是在发布端收到订阅端的PDP消息的时候,立刻又发送了一次PDP消息。 源码如下:

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

 对应的调用堆栈:

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

74:该消息是在发布端收到订阅端的PDP消息时,SPDPWriter完成匹配一个远端的SPDPReader,这时唤醒异步写线程,发送自己的历史数据(即PDP消息)。需要说明一点,PDP消息存放在SPDPWriter的历史缓存中,由SPDPWriter负责发送。

唤醒异步写线程,代码如下: 

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

调用堆栈:

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

异步写线程类在线程中回调SPDPWriter的send_any_unsent_changes()函数发送PDP消息。异步线程代码如下: 

Fast RTPS原理与代码分析(2):动态发现协议之参与者发现协议PDP

订阅端发送PDP消息的流程和发布端一致。这里不再详述。