在Fast DDS中,DomainParticipantListener
是一个抽象类,定义了在DomainParticipant
状态变化时触发的回调。它主要有三个回调函数,用于处理发现(discovery)过程中可能发生的事件:on_participant_discovery()
、on_data_reader_discovery()
和on_data_writer_discovery()
。
下面是对这些回调函数的实现示例,以及如何将其注册到 DomainParticipant
中。
示例代码
class DiscoveryDomainParticipantListener : public DomainParticipantListener
{
/* 自定义回调 on_participant_discovery */
void on_participant_discovery(
DomainParticipant* participant,
eprosima::fastdds::rtps::ParticipantDiscoveryStatus status,
const ParticipantBuiltinTopicData& info,
bool& should_be_ignored) override
{
should_be_ignored = false;
static_cast<void>(participant);
switch (status) {
case eprosima::fastdds::rtps::ParticipantDiscoveryStatus::DISCOVERED_PARTICIPANT:
std::cout << "新发现的 DomainParticipant '" << info.participant_name <<
"' 的 ID 为 '" << info.guid.entityId << "' 和 GuidPrefix '" <<
info.guid.guidPrefix << "'." << std::endl;
// 这里可以评估是否应该忽略发现的参与者
bool ignoring_condition = false;
if (ignoring_condition)
{
should_be_ignored = true; // 请求忽略此发现的参与者
}
break;
case eprosima::fastdds::rtps::ParticipantDiscoveryStatus::CHANGED_QOS_PARTICIPANT:
// 处理参与者QOS改变情况
break;
case eprosima::fastdds::rtps::ParticipantDiscoveryStatus::REMOVED_PARTICIPANT:
std::cout << "DomainParticipant '" << info.participant_name <<
"' 已离开域。" << std::endl;
break;
}
}
/* 自定义回调 on_data_reader_discovery */
void on_data_reader_discovery(
DomainParticipant* participant,
eprosima::fastdds::rtps::ReaderDiscoveryStatus reason,
const eprosima::fastdds::rtps::SubscriptionBuiltinTopicData& info,
bool& should_be_ignored) override
{
should_be_ignored = false;
static_cast<void>(participant);
switch (reason) {
case eprosima::fastdds::rtps::ReaderDiscoveryStatus::DISCOVERED_READER:
std::cout << "新发现订阅主题 '" << info.topic_name <<
"' 类型为 '" << info.type_name << "' 的 DataReader。" << std::
endl;
bool ignoring_condition = false;
if (ignoring_condition)
{
should_be_ignored = true; // 请求忽略此发现的 DataReader
}
break;
case eprosima::fastdds::rtps::ReaderDiscoveryStatus ::CHANGED_QOS_READER:
// 处理 DataReader QOS 改变情况
break;
case eprosima :: fastdds :: rtps :: ReaderDiscoveryStatus ::REMOVED_READER:
std :: cout << "已离开域的 DataReader,主题为 '"<<info.topic_name<<
"' 类型为 '"<<info.type_name<<"'."<<std::
endl;
break ;
}
}
/* 自定义回调 on_data_writer_discovery */
void on_data_writer_discovery(
DomainParticipant* participant,
eprosima: : fastdds: : rtps: : WriterDiscoveryStatus reason,
const eprosima: : fastdds: : dds: : PublicationBuiltinTopicData &info ,
bool &should_be_ignored ) override
{
should_be_ignored = false ;
static_cast<void>(participant);
switch(reason){
case eprosima: : fastdds: : rtps: : WriterDiscoveryStatus: : DISCOVERED_WRITER :
std :: cout <<" 新发现发布主题 ' "<<info.topic_name<<
"' 类型为 ' "<<info.type_name<<"' 的 DataWriter。" ;
bool ignoring_condition = false ;
if(ignoring_condition)
{
should_be_ignored=true ;//请求忽略此数据写入器
}
break;
case eprosima :: fastdds :: rtps :: WriterDiscoveryStatus :: CHANGED_QOS_WRITER:
// 处理数据写入器QOS改变情况
break;
case eprosima :: fastdds :: rtps :: WriterDiscoveryStatus :: REMOVED_WRITER:
std :: cout <<" 数据写入器已离开域,主题为 ' "<<info.topic_name<<
"' 类型为 ' "<<info.type_name<<"'." ;
break;
}
}
};
// 创建参与者 QoS 并配置值
DomainParticipantQos pqos;
// 创建自定义用户 DomainParticipantListener
DiscoveryDomainParticipantListener* plistener = new DiscoveryDomainParticipantListener();
// 在创建 DomainParticipant 时传递监听器。
DomainParticipant* participant =
DomainParticipantFactory :: get_instance()-> create_participant (
0, pqos, plistener );
注意事项
- 在使用这些回调之前,你需要确保你的环境已经设置好并且能够编译相关代码。
- 上述代码中的“应被忽视”的条件是一个占位符,你可以根据你的实际需求来决定何时要忽略某个被发现的参与者或数据读/写器。
- 请注意在调用
create_participant
方法时,将plistener
对象传递给该方法,以便注册回调。
你可以进一步阅读有关 Fast DDS 的文档,以深入了解其他功能和选项。
内容由零声教学AI助手提供,问题来源于学员提问