Fast DDS之RTPS


我们承担ROS,FastDDS,C++,cmake等技术的项目开发和专业指导和培训,有10年+相关工作经验,质量有保证,如有需要请私信联系。

RTPS层实现了RTPS标准。DDS层概念映射关系如下:

DDS LayerRTPS Layer
DomainRTPSDomain
DomainParticipantRTPSParticipant
DataWriterRTPSWriter
DataReaderRTPSReader

RTPS层的四个实体:
RTPSDomain:DDS domain在RTPS协议的扩展
RTPSParticipant:包含所有的RTPS实体
RTPSWriter:从DataWriterHistory 中读数据,传递给匹配的RTPSReaders
RTPSReader:读取RTPSWriter 写入DataReaderHistory中的数据

数据结构的定义

GUID_t

参考这里

ChangeKind_t

在Fast DDS中,ChangeKind_t是一个枚举类型,用于表示CacheChange_t数据实例的状态更改类型。它有以下四种可能的值:

  • ALIVE - 表示数据实例是活跃的,即它还在生成新的数据。
  • NOT_ALIVE_DISPOSED - 表示数据实例已被销毁。在这种情况下,Fast DDS不会再为此实例生成任何新的数据。
  • NOT_ALIVE_UNREGISTERED - 表示数据实例已被注销。这意味着实例可能在未来重新注册并生成新的数据。
  • NOT_ALIVE_DISPOSED_UNREGISTERED - 表示数据实例已被销毁并注销。在这种情况下,实例将不会再生成任何新的数据。

Fast DDS使用ChangeKind_t来跟踪数据实例的状态,并据此决定如何处理实例生成的数据。例如,如果一个实例的状态被标记为NOT_ALIVE_DISPOSED,那么Fast DDS就会停止接收或处理此实例生成的任何新数据。

CacheChange_t

CacheChange_t是一个结构体,它用于存储与数据相关的所有信息,包括数据的实例、序列号、时间戳、数据类型等。这个结构体通常用于表示在数据发布者和订阅者之间传输的数据。
CacheChange_t的主要成员包括:

  • instanceHandle:一个句柄,用于唯一标识与此更改关联的数据实例。
  • sequenceNumber:序列号,用于标识此更改在数据实例历史中的位置。
  • sourceTimestamp:源时间戳,表示数据实例产生此更改的时间。
  • writerGUID:datawriter的GUID,表示产生此更改的数据发布者。
  • kind:一个ChangeKind_t值,表示此更改的类型(例如,数据实例是否处于活动状态,是否已被销毁等)。
  • serializedPayload:一个SerializedPayload_t对象,包含实际的序列化数据。

Fast DDS使用CacheChange_t来跟踪和管理数据更改,确保数据的一致性和正确传输。

InstanceHandle_t

InstanceHandle_t是一个特殊的句柄类型,用于唯一标识数据实例。InstanceHandle_t通常用于以下场景:

  • 在读取或取样数据时,用于表示那个特定的数据实例正在被操作。
  • 在发布数据时,用于指示正在更新哪个数据实例。
  • 在使用DataReaderlookup_instance方法时,用于返回与给定数据样本对应的实例句柄。
    因此,InstanceHandle_t为处理和管理数据实例提供了一种有效的方式。

SequenceNumber_t

SequenceNumber_t用于表示消息的序列号。序列号是用来标识和排序消息的,确保消息的顺序和完整性。
在分布式系统中,消息可能因为网络延迟或者其他原因而达到的顺序和发送的顺序不一致。通过在每个消息上附加一个序列号,接收方就可以根据序列号重新对消息进行排序,确保消息按照发送的顺序被处理。同时,序列号也可以用来检测是否有消息丢失。例如,如果接收方收到了序列号为1和3的消息,但没有收到序列号为2的消息,那么接收方就知道有一个消息丢失了。

总的来说,SequenceNumber_t在Fast DDS中用于确保消息的顺序和完整性,是实现可靠通信的一个重要工具。

HistoryAttributes

用于指定WriterHistory 或 ReaderHistory的属性,包含以下属性:
MemoryManagementPolicy_t memoryPolicy; 内存管理策略
uint32_t payloadMaxSize 最大负载,默认值为500
int32_t initialReservedCaches; 初始缓存,默认值为500
int32_t maximumReservedCaches 最大缓存
int32_t extraReservedCaches; 需要保存的额外的缓存

RTPSParticipantAttributes

这个类用于配置RTPSParticipantImpl的数据,有以下内容:
LocatorList_t defaultUnicastLocatorList 单播地址,默认端口是从7411开始
BuiltinAttributes builtin 内置协议如服务发现,保活等协议的属性配置

ParticipantProxyData

服务发现的对端的信息都存储在ParticipantProxyData中。这个实例在发现过程中被创建,然后填充发现后的信息后,加入到PDP的参与者列表(ResourceLimitedVector<ParticipantProxyData*> participant_proxies_)中。participant_proxies_的第一个成员是其所在的ParticipantProxyData数据。具体有以下数据成员:

ProtocolVersion_t m_protocolVersion; 协议版本,当前版本?
GUID_t m_guid; participant的guid
VendorId_t m_VendorId; 供应商 id,fastdds的id为?
bool m_expectsInlineQos;
BuiltinEndpointSet_t m_availableBuiltinEndpoints; //!Available builtin endpoints
RemoteLocatorList metatraffic_locators; //!Metatraffic locators
RemoteLocatorList default_locators; //!Default locators
Count_t m_manualLivelinessCount; //!Manual liveliness count
string_255 m_participantName; //!Participant name
InstanceHandle_t m_key;
Duration_t m_leaseDuration;
#if HAVE_SECURITY
//!
IdentityToken identity_token_;
//!
PermissionsToken permissions_token_;
//!
security::ParticipantSecurityAttributesMask security_attributes_;
//!
security::PluginParticipantSecurityAttributesMask plugin_security_attributes_;
#endif // if HAVE_SECURITY
//!
bool isAlive;
//!
ParameterPropertyList_t m_properties;
//!
UserDataQosPolicy m_userData;
//!
TimedEvent* lease_duration_event;
//!
bool should_check_lease_duration;
//!
ProxyHashTable* m_readers = nullptr;
//!
ProxyHashTable* m_writers = nullptr;

RTPS的使用

RTPS层实体有以下:

  1. RTPSDomain
  2. RTPSParticipant:包含RTPS层其他实体
  3. RTPSWriter:从DataWriterHistory中读数据并发送给和他匹配的所有的RTPSReaders
  4. RTPSReader:接收从RTPSWriter发送的消息并写入DataReaderHistory

RTPS层RTPSParticipant的创建时序如下:
在这里插入图片描述
RTPSWriter的创建过程:
在这里插入图片描述
和文档中使用 RTPSDomain::createRTPSWriter() 创建有差异?

使用History发送和接收数据
History相关类图如下: 在这里插入图片描述

配置Readers和Writers

设置数据持久化属性:

  • VOLATILE:数据发送后即丢失。如果一个新的reader被发现并匹配后,message发送到第n条,此时新的reader从第n+1条开始接收
  • TRANSIENT_LOCAL:writer保存了k条已发送的messages,新的reader加入进来后此时消息已经发送n条了,新的reader从第n-k条开始接收
  • TRANSIENT:数据一直保存,及时writer被销毁和重新创建,或者app crash。

配置History

通过HistoryAttributes配置History

使用自定义PayloadPool

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值