【FastDDS】Layer DDS之Publisher (03-PublisherListener)

Fast DDS中的PublisherListener总结

一、PublisherListener的基本定义

PublisherListener是一个抽象类,用于定义在发布者(Publisher)状态发生变化时触发的回调函数。默认情况下,所有这些回调函数都是空实现,不执行任何操作。用户需要通过实现该类的特化版本,重写应用程序所需的回调函数;未被重写的回调函数将保持空实现。

二、继承关系与回调触发机制

  1. 继承关系PublisherListener继承自DataWriterListener,因此它能够响应所有向数据写入器(DataWriter)报告的事件。
  2. 触发规则:事件总是会通知给最能处理该事件的特定实体监听器。因此,PublisherListenerDataWriterListener继承的回调函数,仅在以下两种情况下才会被调用:
    • 触发事件的数据写入器(DataWriter)没有附加监听器(Listener);
    • 该数据写入器的StatusMask禁用了对应的回调函数。

三、其他说明

PublisherListener没有添加任何新的回调函数。有关其继承的回调函数列表及重写示例,请参考DataWriterListener的相关内容。

#include <fastdds/dds/domain/DomainParticipantFactory.hpp> #include <fastrtps/fastdds/dds/domain/DomainParticipant.hpp> #include <fastdds/dds/topic/Topic.hpp> #include <fastdds/dds/publisher/Publisher.hpp> #include <fastdds/dds/publisher/DataWriter.hpp> #include <fastdds/dds/publisher/qos/DataWriterQos.hpp> #include <fastdds/dds/core/status/StatusMask.hpp> #include <fastdds/dds/log/Log.hpp> #include <thread> #include <iostream> #include "PosPubSubTypes.h" using namespace eprosima::fastdds::dds; int main() { // 创建 DomainParticipant DomainParticipant* participant = DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT); if (!participant) { std::cerr << "创建 participant 失败" << std::endl; return 1; } // 注册类型 TypeSupport type(new topic_01::msg::PosPubSubType()); type.register_type(participant); // 创建 Topic Topic* topic = participant->create_topic("rt/pos_topic", "topic_01/msg/Pos", TOPIC_QOS_DEFAULT); if (!topic) { std::cerr << "创建 topic 失败" << std::endl; return 1; } // 创建 Publisher Publisher* publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr); if (!publisher) { std::cerr << "创建 publisher 失败" << std::endl; return 1; } // 创建 DataWriter DataWriter* writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, nullptr); if (!writer) { std::cerr << "创建 writer 失败" << std::endl; return 1; } // 随机数初始化 std::srand(static_cast<unsigned>(std::time(nullptr))); topic_01::msg::Pos msg; for (int i = 0; i < 100000; ++i) { for (int j = 0; j < 4; ++j) { msg.coordinates()[j] = static_cast<float>(std::rand() % 100) / 10.0f; } writer->write(&msg); std::cout << "发送消息: ["; for (int j = 0; j < 4; ++j) { std::cout << msg.coordinates()[j]; if (j != 3) std::cout << ", "; } std::cout << "]" << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } // 清理资源 participant->delete_contained_entities(); DomainParticipantFactory::get_instance()->delete_participant(participant); return 0; } 为什么这样发布的话题,ROS2的订阅者订阅不到?
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Ray.so

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值