FastDDS-5.发现机制
5、发现机制
Fast DDS作为一种数据分发服务(DDS)实现,提供了发现机制,允许在域参与者之间自动查找和匹配DataWriter和DataReader,以便他们可以开始共享数据。对于所有机制,此发现分两个阶段执行。
5.1 发现阶段
-
参与者发现阶段(Participant Discovery Phase PDP)
在此阶段,域名参与者相互承认对方的存在。要做到这一点,每个DomainParticipant都会定期发送公告消息,其中指定DomainParticipator正在侦听传入元数据和用户数据流量的单播地址(IP和端口)。当两个给定的DomainParticipants存在于同一DDS域中时,它们将匹配。默认情况下,使用已知的多播地址和端口(使用DomainId计算)发送通知消息。此外,还可以指定使用单播发送通知的地址列表(请参阅初始对等方中的)。此外,还可以配置此类公告的周期性(请参阅发现配置)。 -
端点发现阶段(Endpoint Discovery Phase EDP)
在此阶段,数据写入器和数据读取器相互确认。为此,DomainParticipants使用PDP期间建立的通信信道,相互共享有关其DataWriter和DataReader的信息。这些信息包括主题和数据类型(请参阅主题)。要使两个端点匹配,它们的主题和数据类型必须一致。一旦DataWriter和DataReader匹配,它们就可以发送/接收用户数据流量了。
重要
可以使用PDP阶段来传输有关DomainParticipant正在其中运行的主机、用户和进程(物理信息)的信息。有关如何配置传输的物理数据的更多信息,请参阅发现信息中的物理数据。
5.2 发现机制
快速DDS提供以下发现机制:
- 简单发现Simple Discovery:这是默认机制。它支持PDP和EDP的RTPS标准,因此提供了与任何其他DDS和RTPS实现的兼容性。
- 静态发现Static Discovery: 这种机制在PDP阶段使用简单参与者发现协议(SPDP)(如RTPS标准所规定的),但当所有DataWriters和DataReaders的IP和端口、数据类型和Topics事先已知时,允许跳过简单端点发现协议(SEDP)阶段。
- 发现服务器Discovery Server: 此发现机制使用集中式发现体系结构,其中DomainParticipant(称为服务器)充当元流量发现的集线器。
- 手动发现 Manual Discovery: 该机制仅与RTPS层兼容。它禁用PDP,允许用户使用其选择的任何外部元信息信道手动匹配和取消匹配RTPS参与者、RTPSReader和RTPSWriter。因此,用户必须访问DomainParticipant实现的RTPSParticipant,并直接匹配RTPS实体。
5.3 发现设置
以下部分列出并描述了每个先前定义的发现机制的可用设置,以及如何定义DomainParticipantListener发现回调。
5.3.1 一般的发现服务
一些发现设置在不同的发现机制之间共享。这些设置是在WireProtocolConfigQos类的内置公共数据成员下定义的。这些是:
名字 | 描述 | 类型 | 默认 |
---|---|---|---|
发现协议 | 使用的发现协议(参考发现机制) | DiscoveryProtocol | SIMPLE |
忽略参与者标志 | 筛选的发现流量中的域参与者相同的过程,不同的进程或在不同的主机中。 | ParticipantFilteringFlags | NO_FILTER |
租约 | 指示多长时间应该是远程DomainParticipant考虑本地DomainParticipant | Duration_t | 20s |
声明周期 | DomainParticipant发送PDP通告的期间。 | Duration_t | 3s |
5.3.1.1 发现协议
指定要使用的发现协议(请参阅发现机制)。可能的取值是:
发现机制 | 可能的取值 | 描述 |
---|---|---|
Simple | SIMPLE | 在RTPS标准里指定的简单发现协议 |
Static | STATIC | SPDP是在xml文件中手动指定的EDP |
Discovery Server | SERVER | DomainParticipant充当发现流量的集线器,接收以及分发发现信息。 |
CLIENT | DomainParticipant充当发现流量的客户端。它将其发现信息发送到服务器,并接收只有与之相关的信息。 | |
SUPER_CLIENT | DomainParticipant充当发现流量的客户端。它将其发现信息发送到服务器,并接收来自服务器的所有其他发现信息。 | |
BACKUP | 创建具有持久sqlite的SERVER DomainParticipant数据库BACKUP服务器可以在启动时加载数据库。这种类型的服务器使Discovery Server体系结构对服务器破坏具有弹性。 | |
Manual | NONE | 禁用PDP阶段,因此该阶段不是EDP阶段。所有匹配都必须通过addReaderLocator、addReaderProxy、addWriterProxy RTPS层方法 |
DomainParticipantQos pqos;
pqos.wire_protocol().builtin.discovery_config.discoveryProtocol = DiscoveryProtocol_t::SIMPLE;
<participant profile_name="participant_discovery_protocol">
<rtps>
<builtin>
<discovery_config>
<discoveryProtocol>SIMPLE</discoveryProtocol>
</discovery_config>
</builtin>
</rtps>
</participant>
5.3.1.2 忽略参与者标志
定义一个筛选器,以便在接收到某些发现流量时忽略该流量。这对于添加额外级别的DomainParticipant隔离非常有用。可能的值为:
5.3.1.3 租约期限
指示远程DomainParticipant应将本地DomainParticipient视为活动的时间。如果本地DomainParticipant的活跃度在此时间内未被断言,则远程DomainParticipator认为本地DomainPartition已死亡,并销毁有关本地DomainPartitor及其所有端点的所有信息。
每当远程DomainParticipant从本地DomainParticipient接收到任何类型的流量时,本地DomainPartition的活跃度都会在远程DomainPartition上断言。
租赁持续时间指定为使用duration_t以秒和纳秒表示的时间。
5.3.1.4 宣告周期
它指定DomainParticipant的PDP公告的周期。为了保持活跃性,建议公告期短于租赁期,这样即使没有数据流量,DomainParticipant的活跃性也会被断言。需要注意的是,在公告周期的设置中涉及到一种权衡,即过于频繁的公告会使网络的元流量膨胀,但过于稀少的公告会延迟发现延迟加入者。
DomainParticipant的公告周期指定为使用Duration_t以秒和纳秒表示的时间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通