FastDDS-5.发现机制



5、发现机制

Fast DDS作为一种数据分发服务(DDS)实现,提供了发现机制,允许在域参与者之间自动查找和匹配DataWriter和DataReader,以便他们可以开始共享数据。对于所有机制,此发现分两个阶段执行。



5.1 发现阶段

  1. 参与者发现阶段(Participant Discovery Phase PDP)
    在此阶段,域名参与者相互承认对方的存在。要做到这一点,每个DomainParticipant都会定期发送公告消息,其中指定DomainParticipator正在侦听传入元数据和用户数据流量的单播地址(IP和端口)。当两个给定的DomainParticipants存在于同一DDS域中时,它们将匹配。默认情况下,使用已知的多播地址和端口(使用DomainId计算)发送通知消息。此外,还可以指定使用单播发送通知的地址列表(请参阅初始对等方中的)。此外,还可以配置此类公告的周期性(请参阅发现配置)。

  2. 端点发现阶段(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以秒和纳秒表示的时间。




posted @   zhangzl419  阅读(2237)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示