【FastRTPS】概述、架构

概述

 

【FastRTPS】概述、架构_第1张图片

使用Fast RTPS的两种方式:

Publisher-Subscriber方式:对RTPS的简单抽象,用户只需要定义某个Topic的Publisher和Subscriber、传输方式就可以发布订阅数据。可参考上一节中的HelloWorld。

Writer-Reader方式:更接近RTPS标准中的概念,能直接操作RTPS的读写端点的HistoryCache。

Fast RTPS 架构

线程

eProsima Fast RTPS是并发的、基于事件的。每个Paricipant都生成一些线程去管理后台任务,如日志、消息接收、异步通信等。但这并不会影响到对这个库的使用:公共API是线程安全的,你可以放心的从不同线程上调用同一个Participant的任何方法。

那么Fast RTPS 任务过程是怎样的呢?

主线程:由应用程序管理

事件线程:每个Participant都拥有一个,它用于处理周期性的触发事件。

异步写线程:为所有的Participant管理异步写操作,甚至对于同步写操作来说,也必须在后台初始化一些形式的通信。

接收线程:Pariticipant为每一个接收通道生成一个线程。(接收通道就是传输层的通道概念)

资源(1.5版本的doc)

实现了三种资源,每个Participant封装并管理与这些资源有关的类。

ReceiverResources:每个 IP:port Socket连接都有一个在专用线程(接收线程)上运行的侦听资源。侦听资源接收处理从socket接收的数据,并对关联的 Writer 和 Reader 执行必要的操作。每个Participant含有多个这种类型的侦听资源。

ResourceEvent:用于管理基于时间和事件的功能,每个Participant都有一个此类资源生成的线程。

SenderResources:用于管理Participant的发送操作。无论同步或者异步,EndPoint都会用SendResource通过网络发送消息。用户可以为Pariticipant指定一个或多个通道,从而让RTPS能够通过多个系统接口连接通信。每个输出通道都会生成一个SenderResource。

事件(1.5版本的doc)

Fast RTPS使用事件系统去响应某些特定条件,如处理周期任务。这些事件大部分是与RTPS的metadata有关,所以对用户不可见。不过用户可以通过继承TimedEvent类来定义自己的周期事件。

用户触发事件:这些事件是在用户执行一个动作之后,直接触发到RTPSWriter或者RTPSWriter的HistoryCache。通常在主线程内同步执行,所以不会用到ResourceEvent类。

消息触发事件:接收到网络消息时会触发。例如,接收到ACKNACK类型的消息会触发HistoryCache中某些CacheChange状态的改变,这操作也会导致一些包重新发送给Reader。

周期性事件:如HEARTBEAT类型的包,心跳包会周期性(heartbeatPeriod)的给所有匹配的Reader发送。

 

你可能感兴趣的:(C++,FastRTPS)