FastDDS(8)Discovery自动发现

24 篇文章 ¥179.90 ¥299.90
本文深入探讨了Fast DDS的发现机制,包括参与者发现PDP和端点发现EDP阶段,以及简单的发现协议。介绍了常规发现设置如忽略参与者标志、租约持续时间和公告周期,并详细阐述了静态和发现服务器设置。静态发现允许预先知道所有DataWriter和DataReader,而发现服务器则采用集中式架构管理元流量。此外,还讨论了微调发现服务器握手和在运行时修改远程服务器列表的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

发现阶段

  1. Participant Discovery Phase参与者发现阶段(PDP):在此阶段,域参与者确认彼此的存在。为此,每个DomainParticipant都会定期发送通知消息,其中指定了DomainParticipate侦听传入元和用户数据流量的单播地址(IP和端口)。当两个给定的DomainParticipant存在于同一DDS域中时,它们将匹配。默认情况下,使用已知的多播地址和端口(使用DomainId计算)发送通知消息。此外,还可以指定使用单播发送通知的地址列表(请参阅初始对等体中的)。此外,还可以配置此类通知的周期性(请参阅发现配置)。
  2. Endpoint Discovery Phase端点发现阶段(EDP):在此阶段,DataWriter和DataReader相互确认。为此,DomainParticipants使用PDP期间建立的通信信道,彼此共享有关其DataWriter和DataReader的信息。除其他外,此信息还包含主题和数据类型(请参阅主题)。要使两个端点匹配,其主题和数据类型必须一致。一旦DataWriter和DataReader匹配,它们就可以发送/接收用户数据流量了。

        可以使用

<think>我们正在讨论DDS(数据分发服务)中的自动发现机制。根据引用内容,DDS的发现机制是其核心机制之一,主要包括SPDP简单参与者发现协议)和SEDP简单端点发现协议)。用户希望了解如何配置和实现这一机制。首先,DDS的自动发现机制允许参与者(Participants)自动发现彼此,并交换有关发布者(Publishers)和订阅者(Subscribers)的信息,而无需手动配置。这通过两种主要协议实现: 1. SPDP:用于发现域中的其他参与者。2.SEDP:在参与者之间交换关于数据写入者和数据读取者的信息(即端点信息)。 配置和实现自动发现机制通常涉及以下步骤: ###1.设置域ID(DomainID)所有需要在同一域内通信的参与者必须使用相同的域ID。域ID在创建参与者时指定。###2.配置发现协议在DDS中,可以通过QoS(服务质量)策略来配置发现机制。以下是一些关键QoS设置: -**DiscoveryConfig**:用于配置发现协议的行为。例如,可以设置是否启用SPDP和SEDP。- **Multicast地址**:SPDP通常使用多播地址(如239.255.0.1)来发送参与者发现消息。 -**InitialPeers**:如果多播不可用,可以配置初始对等列表(单播地址),使参与者能够直接连接到指定的对等方。 ###3.静态发现与动态发现- **静态发现**:仅使用SPDP,适用于端点(发布者和订阅者)在运行时不会改变的情况。- **动态发现**:使用SPDP和SEDP,适用于端点可能在运行时动态增加或删除的情况。###4.编程实现在代码中,通常需要设置参与者的QoS来配置发现机制。以下是一个使用FastDDS(以前称为FastRTPS)的示例: ```cpp#include <fastdds/dds/domain/DomainParticipantFactory.hpp>#include <fastdds/dds/domain/DomainParticipant.hpp> #include<fastdds/rtps/attributes/RTPSParticipantAttributes.h> usingnamespace eprosima::fastdds::dds; intmain(){//创建域参与者DomainParticipant* participant;DomainParticipantQospqos;//配置发现协议//设置初始对等列表(如果需要)pqos.wire_protocol().builtin.initialPeersList.push_back("192.168.1.100"); //添加一个初始对等点//配置发现协议:启用SPDP和SEDP(默认通常已启用)//如果需要静态发现,可以禁用SEDP// pqos.wire_protocol().builtin.discovery_config.use_SEDP =false;//禁用SEDP,仅使用SPDP(静态发现)//创建参与者participant =DomainParticipantFactory::get_instance()->create_participant(0,pqos);if(nullptr ==participant){//错误处理return1;}//...创建发布者或订阅者 ...return0; }``` ###5.网络配置确保网络允许多播通信(如果使用多播)或参与者之间的单播通信。防火墙设置可能会阻止发现消息。###6.调试与监控可以使用网络抓包工具(如Wireshark)来监控发现消息。过滤条件可以设置为多播地址(如239.255.0.1)或指定的端口(通常为7400-7410)。###注意事项-不同的DDS实现(如FastDDS、OpenDDS、Connext DDS)在配置细节上可能有所不同,请参考具体实现的文档。 -在复杂网络环境中(如跨子网),可能需要配置多播路由或使用初始对等列表。通过以上步骤,可以配置和实现DDS中的自动发现机制。根据应用需求,可以选择静态或动态发现,并调整相应的QoS设置。 §§相关问题§§1. DDS中的SPDP和SEDP协议具体是如何工作的? 2.在多子网环境中如何配置DDS的发现机制?3.如何通过QoS策略优化DDS的发现性能?4.DDS发现机制的安全性如何保障?</think>### DDS自动发现机制配置与实现 DDS(数据分发服务)的自动发现机制是其实现高可靠性和即插即用扩展性的核心基础。该机制通过**SPDP**(简单参与者发现协议)和**SEDP**(简单端点发现协议)实现,具体配置步骤如下: #### 一、核心配置步骤 1. **域参与者的QoS配置** ```xml <domain_participant_qos> <discovery_config> <initial_announcements count="3" period="1.0"/> <!-- 初始通告配置 --> <initial_peers> <element>192.168.1.100</element> <!-- 初始对等节点列表 --> </initial_peers> </discovery_config> </domain_participant_qos> ``` - `initial_announcements`:控制新节点加入时发送的广播次数和间隔 - `initial_peers`:指定初始发现的目标节点(支持单播/组播地址)[^1][^2] 2. **选择发现模式** - **静态发现**(仅SPDP): ```cpp participant_qos.wire_protocol().builtin.discovery_config.use_SEDP = false; ``` 适用于端点(发布者/订阅者)数量固定的场景 - **动态发现**(SPDP+SEDP): ```cpp participant_qos.wire_protocol().builtin.discovery_config.use_SEDP = true; ``` 支持运行时动态添加/删除端点[^2] 3. **网络传输配置** ```cpp RTPSParticipantAttributes pattr; pattr.builtin.metatrafficUnicastLocatorList.push_back(Locator(ip_address, port)); pattr.builtin.metatrafficMulticastLocatorList.push_back(Locator("239.255.0.1", 7400)); // 默认组播地址 ``` #### 二、工作流程 1. **SPDP阶段**(参与者发现): - 新节点通过UDP组播(239.255.0.1:7400)发送`ParticipantData` - 现有节点响应自身信息,建立参与者级通信 2. **SEDP阶段**(端点发现): - 通过新建立的TCP/UDP通道交换`PublisherData`/`SubscriberData` - 匹配相同主题/类型的发布者与订阅者[^1][^2] #### 三、关键优化配置 ```xml <discovery_config> <lease_duration>30.0</lease_duration> <!-- 存活声明周期 --> <lease_announcement>5.0</lease_announcement> <!-- 心跳间隔 --> <disable_repair_piggyback_heartbeat>true</disable_repair_piggyback_heartbeat> </discovery_config> ``` - `lease_duration`:超时未收到心跳则判定节点离线 - `disable_repair_piggyback`:禁用冗余心跳提升性能[^4] #### 四、编程实现示例(Fast DDS) ```cpp DomainParticipant* create_participant_with_discovery(int domain_id) { DomainParticipantQos pqos; // 启用动态发现 pqos.wire_protocol().builtin.discovery_config.discoveryProtocol = eprosima::fastrtps::rtps::DiscoveryProtocol_t::SIMPLE; // 设置初始对等节点 pqos.wire_protocol().builtin.initialPeersList.push_back( "192.168.1.100:5100"); // 配置多播地址 Locator_t multicast_locator; multicast_locator.set_IP4_address(239, 255, 0, 1); multicast_locator.port = 7400; pqos.wire_protocol().builtin.metatrafficMulticastLocatorList.push_back( multicast_locator); return DomainParticipantFactory::get_instance()->create_participant( domain_id, pqos); } ``` > **调试提示**:使用Wireshark捕获组播流量(过滤器:`udp.port == 7400 && ip.dst == 239.255.0.1`)可观察SPDP/SEDP报文交换过程[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pony12

助力1000篇OpenDDS文

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值