ZBLOG

As stated in DomainParticipantListener, the DomainParticipantListener is an abstract class defining the callbacks that will be triggered in response to state changes on the DomainParticipant. Fast DDS defines three callbacks attached to events tha...

在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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=7220

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?