fastdds服务发现

发现协议定义了给定Topic下publisher的DataWriter和subscriber的DataReader的匹配机制,以便它们之间共享数据,服务发现出现在服务通信过程中的任何时刻。

发现阶段

参与者发现阶段(Participant Discovery Phase PDP)

域名参与者互相发现,每个DomainParticipant定期发送公告消息,指定DomainParticipator正在侦听传入元数据和用户数据流量的单播地址(IP和端口),当两个给定的DomainParticipants存在于同一DDS域中时,它们将匹配。

端点发现阶段(Endpoint Discovery Phase EDP)

数据写入器和数据读取器相互确认,DomainParticipants使用PDP期间建立的通信信道,相互共享有关其DataWriter和DataReader的信息。这些信息包括主题和数据类型(请参阅主题)。要使两个端点匹配,它们的主题和数据类型必须一致。一旦DataWriter和DataReader匹配,它们就可以发送/接收用户数据流量了。
PDP的时候会创建一对Writer和Reader,PDP的过程是无状态的不需要去响应。
EDP创建的时候需要创建两对,第一对Publisher:Writer&Reader 第二对Subscriber:Writer&Reader两对进行匹配,也就是两个Paticipant之间的Topic和QoS匹配。

发现机制

  • 简单发现(SimpleDiscovery)
    默认机制。它支持PDP和EDP的RTPS标准,因此提供了与任何其他DDS和RTPS实现的兼容性。DomainParticipant在初始阶段单独被发现,以便在后面匹配它们下面的DataWriter和DataReader
  • 静态发现(StaticDiscovery)
    这种机制实现了DomainParticipant之间的发现,在PDP阶段使用简单参与者发现协议(SPDP)(如RTPS标准所规定的),但当所有DataWriters和DataReaders的IP和端口、数据类型和Topics事先已知时,允许跳过简单端点发现协议(SEDP)阶段。
  • 发现服务器(DiscoveryServer)
    使用集中式发现体系结构,其中DomainParticipant(称为服务器)充当元流量发现的中心。
  • 手动发现(ManualDiscovery)
    该机制仅与RTPS层兼容。它禁用PDP,允许用户使用其选择的任何外部元信息信道手动匹配和取消匹配RTPS参与者、RTPSReader和RTPSWriter。因此,用户必须访问DomainParticipant实现的RTPSParticipant,并直接匹配RTPS实体。
    在这里插入图片描述
    发现协议的配置:
DomainParticipantQos pqos;

pqos.wire_protocol().builtin.discovery_config.discoveryProtocol =
        DiscoveryProtocol_t::SIMPLE;

如果需要使用静态发现协议,则必须禁用SEDP,如下:

DomainParticipantQos pqos;

pqos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocol = false;
pqos.wire_protocol().builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocol = true;

xml配置配置文件

fastdds提供了通过xml文件配置一些设置,因此用户可以通过配置修改fastdds实体的行为,而无需通过源代码的接口实现,也不用重新编译源代码。
用户拥有每个API的功能标签,可以通过标签配置DomainParticipant的行为,通过、标签配置DataWriter、DataReader等的行为。

发现流程源码剖析

  1. 创建Participant时,会初始化RTPSParticipantImpl,此时会根据配置的组播或者单播ip:port创建一个接收线程,这个线程会不断接收消息,并将DataReader注册到线程里;另外会初始化内置的协议,用来做服务发现
RTPSParticipantImpl::RTPSParticipantImpl(
        uint32_t domain_id,
        const RTPSParticipantAttributes& PParam,
        const GuidPrefix_t& guidP,
        const GuidPrefix_t& persistence_guid,
        RTPSParticipant* par,
        RTPSParticipantListener* plisten)
    : domain_id_(domain_id)
    , m_att(PParam)
    , m_guid(guidP, c_EntityId_RTPSParticipant)
    , mp_builtinProtocols(nullptr)
    , mp_ResourceSemaphore(new Semaphore(0))
    , IdCounter(0)
    , type_check_fn_(nullptr)
    , client_override_(false)
    , internal_metatraffic_locators_(false)
    , internal_default_locators_(false)
#if HAVE_SECURITY
    , m_security_manager
### FastDDS 服务发现的实现原理与源码分析 FastDDS服务发现机制基于 DDS 协议中的参与者发现协议(PDP, Participant Discovery Protocol)和主题发现协议(EDP, Endpoint Discovery Protocol)。这两种协议共同协作,使得不同节点上的 DomainParticipant 可以相互识别并建立通信连接。 #### PDP (Participant Discovery Protocol) PDP 是 FastDDS 中的核心发现协议之一,主要用于检测同一域内的其他 DomainParticipants。当一个新的 DomainParticipant 创建时,它会广播自己的存在并通过监听网络来获取其他参与者的元数据信息[^4]。具体来说: - **本地注册表维护**:每个 DomainParticipant 都有一个本地注册表,记录已知的所有远程 DomainParticipants 的信息。 - **Builtin Topics 使用**:为了传播这些信息,FastDDS 利用了几个内置的主题(Built-in Topics),例如 `DCPSParticipant` 主题。此主题描述了 DomainParticipant 的属性及其 QoS 设置。 - **周期性心跳消息**:除了初始广播外,DomainParticipants 还定期发送心跳消息以保持活跃状态,并通知其他节点自己仍然在线[^5]。 ```cpp // 示例代码片段展示如何初始化 BuiltinTopicsData 并设置相关参数 void initialize_builtin_topics(BuiltinTopicsData& builtin_data) { builtin_data.participant_guid.prefix.value[0] = ...; builtin_data.participant_proxy.qos.policies.reliability.kind = RELIABLE_RELIABILITY_QOS; } ``` #### EDP (Endpoint Discovery Protocol) 一旦两个或多个 DomainParticipants 成功交换彼此的信息后,则进入端点级别的协商阶段——即由 EDP 来处理 Publisher 和 Subscriber 的匹配过程。这一步骤涉及以下几个方面: 1. **Publisher 和 Subscriber 注册**:每当创建一个新的 DataWriter 或 DataReader 时,对应的 DomainParticipant 将其详细资料提交到全局数据库中。 2. **兼容性检查**:根据 Topic 名称、Type 类型以及其他预定义条件评估哪些 Publishers 能够被 Subscribers 订阅。 3. **关联建立**:最终达成一致意见之后,双方开始正式握手流程从而形成实际的数据流管道[^4]。 值得注意的是,在整个过程中,FastDDS 提供了一种灵活的方式来调整默认行为,比如通过修改 XML 文件来自定义某些高级选项或者启用额外的安全特性等等[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值