FastDDS 源码剖析:src/cpp/fastdds 源码结构与Publisher源码分析

news2024/10/6 19:50:54

目录

源码结构

Publisher分析

Publisher 类分析

PublisherIImpl 类分析


源码结构

—builtin:该目录包含FastDDS使用的内置类型和协议的实现。

—core:该目录包含FastDDS库中使用的核心类和函数。这包括处理错误、管理内存和处理线程的类。

--domain:此目录包含DomainParticipant类的实现,它表示应用程序在特定域中的参与。

—log: FastDDS使用的日志系统实现。

—publisher:此目录包含用于发送数据的publisher类的实现。

—subscriber:此目录包含用于接收数据的subscriber类的实现。

—topic:这个目录包含topic类的实现,它定义了要发布和订阅的数据。

—utils:该目录包含整个FastDDS库中使用的各种实用程序函数和类。

Publisher分析

源码分析之前先看一个fastDDS pub 消息的demo 程序

#include <iostream>
#include <string>

#include "HelloWorldPubSubTypes.h"
#include "HelloWorld.h"

#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <fastdds/dds/publisher/Publisher.hpp>
#include <fastdds/dds/publisher/DataWriter.hpp>

using namespace eprosima::fastdds::dds;

int main()
{
    // Create a DomainParticipant with default attributes
    DomainParticipant* participant = DomainParticipantFactory::get_instance()->create_participant(0);
    if (nullptr == participant)
    {
        std::cerr << "Error creating DomainParticipant." << std::endl;
        return EXIT_FAILURE;
    }

    // Register the HelloWorld type
    HelloWorldPubSubType helloWorldType;
    if (participant->register_type(helloWorldType) != ReturnCode_t::RETCODE_OK)
    {
        std::cerr << "Error registering HelloWorld type." << std::endl;
        return EXIT_FAILURE;
    }

    // Create a Publisher and a Topic
    Publisher* publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr);
    Topic* topic = participant->create_topic("HelloWorldTopic", "HelloWorld", TOPIC_QOS_DEFAULT);

    // Create a DataWriter for the HelloWorld topic
    DataWriter* writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, nullptr);
    if (nullptr == writer)
    {
        std::cerr << "Error creating DataWriter." << std::endl;
        return EXIT_FAILURE;
    }

    // Publish the HelloWorld messages
    HelloWorld hello;
    hello.message("Hello, World!");
    for (int i = 1; i <= 10; ++i)
    {
        hello.index(i);
        std::cout << "Sending: " << hello << std::endl;
        writer->write((void*)&hello);
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }

    // Clean up
    participant->delete_datawriter(writer);
    participant->delete_publisher(publisher);
    participant->delete_topic(topic);
    DomainParticipantFactory::get_instance()->delete_participant(participant);

    return EXIT_SUCCESS;
}

接下来再分析Publisher

关键组件包括:

  1. PublisherImpl:PublisherImpl 类是Publisher接口的具体实现。它负责创建并管理与此发布者相关的DataWriter对象。PublisherImpl 类还处理与发布者相关的QoS策略,并负责在匹配的订阅者出现时建立连接。
  2. DataWriter:DataWriter 类表示一个特定主题的数据发布者。它负责序列化用户数据并将其发送给订阅者。DataWriter 还处理与数据实例相关的生命周期管理,例如实例的注册和反注册。
  3. DataWriterImpl:DataWriterImpl 类是DataWriter接口的具体实现。它处理底层的数据序列化和网络通信。此外,DataWriterImpl 类还负责管理与DataWriter相关的QoS策略和实例生命周期。
  4. DataWriterListener:DataWriterListener 类定义了DataWriter在特定事件发生时回调的接口。这些事件包括匹配的订阅者出现、实例状态改变等。用户可以通过实现 DataWriterListener 接口来定制事件处理。
  5. QoS:在 src/cpp/fastdds/publisher 目录中,还包含了一些与发布者和数据写入器相关的QoS策略实现。这些策略可以根据需要配置,以满足特定应用程序的性能和可靠性要求。

下面是距离的文件说明:

—DataWriter.cpp和DataWriterImpl.cpp:这两个文件包含了DataWriter类的实现和实现细节。DataWriter类用于发送数据。

—DataWriterHistory.cpp:该文件包含DataWriterHistory类的实现,用于管理DataWriter发送的数据样本的历史记录。

—Publisher.cpp和PublisherImpl.cpp:这些文件包含Publisher类的实现及其实现细节。Publisher类用于创建DataWriter对象并管理数据的发送。

—DataWriterImpl.hpp、DataWriterHistory.hpp、PublisherImpl.hpp:这是上述cpp文件对应的头文件。它们声明类和类的方法。

—filtering:该目录包含内容过滤功能的实现,该功能允许订阅服务器只接收符合特定条件的数据。

—history:包含历史缓存的实现,保存DataWriter或DataReader发送或接收的数据样本。

—qos:该目录包含qos (Quality of Service)策略的实现,qos策略控制系统行为的各个方面,如可靠性、持久性和资源限制。

Publisher 类分析

下面是Publisher类的成员变量和函数:

成员变量

PublisherImpl* impl_:这是一个指向Publisher类实现的指针。发布者的实际功能在这个类中实现。

成员函数

●create_datawriter():该函数用于创建用于发送数据的DataWriter。

●delete_datawriter():删除DataWriter。

●lookup_datawriter():该函数用于根据主题名称查找DataWriter。

●get_qos()和set_qos():这些函数用于获取和设置发布者的服务质量(QoS)策略。

●get_listener()和set_listener():这些函数用于获取和设置Publisher的PublisherListener。

●suspend_publications()和resume_publications():这两个函数用于挂起和恢复数据的发送。

●begin_coherent_changes()和end_coherent_changes():这些函数用于开始和结束应该一起发送的一组更改。

●wait_for_acknowledgement():该函数用于等待所有数据被订阅方确认。

●get_participant():该函数用于获取Publisher所属的DomainParticipant。

delete_contained_entities():该函数用于删除Publisher中包含的所有实体(如DataWriter)。

●set_default_datawriter_qos()和get_default_datawriter_qos():这些函数用于设置和获取该Publisher创建的DataWriter的默认QoS策略。

●copy_from_topic_qos():将QoS策略从Topic复制到DataWriter。

●get_datawriter_qos_from_profile():从配置文件中获取dataswriter对应的QoS策略。

●get_datawriters():该函数用于获取该Publisher创建的所有DataWriter对象。

●has_datawriters():这个函数用于检查Publisher是否有DataWriter对象。

Publisher类充当facade,将调用委托给PublisherImpl类。这些方法的实际实现隐藏在PublisherImpl类中。

PS:begin_coherent_changes()和end_coherent_changes() 这俩函数还没有实现。

/**
 * @brief Signals the beginning of a set of coherent cache changes using the Datawriters attached to the publisher
 *
 * @return RETCODE_OK if successful, an error code otherwise
 * @warning Not supported yet. Currently returns RETCODE_UNSUPPORTED
 */
RTPS_DllAPI ReturnCode_t begin_coherent_changes();
PublisherIImpl 类分析

类图如下:

PublisherImpl 类是 Publisher 的实际实现,它包含了 Publisher 的行为。这个类不应直接使用,而是通过 DomainParticipant 的 create_publisher 方法创建 Publisher。


成员变量:

  • DomainParticipantImpl* participant_:指向关联的 DomainParticipantImpl 实例的指针。
  • PublisherQos qos_:存储 Publisher 的 QoS(Quality of Service,服务质量)策略。
  • std::map<std::string, std::vector<DataWriterImpl*>> writers_:存储与 DataWriter 相关的指针。主题名称作为键值。
  • std::mutex mtx_writers_:用于保护对 writers_ 成员变量的访问的互斥锁。
  • PublisherListener* listener_:指向 PublisherListener 的指针,用于处理 Publisher 事件。
  • PublisherWriterListener publisher_listener_:监听 DataWriter 事件的内部类实例。
  • Publisher* user_publisher_:指向用户层 Publisher 的指针。
  • fastrtps::rtps::RTPSParticipant* rtps_participant_:指向底层 RTPSParticipant 实例的指针。
  • DataWriterQos default_datawriter_qos_:存储默认的 DataWriter QoS 策略。
  • fastrtps::rtps::InstanceHandle_t handle_:存储 Publisher 的实例句柄。

方法:

  • PublisherImpl(DomainParticipantImpl* p, const PublisherQos& qos, PublisherListener* p_listen = nullptr):构造函数,创建 PublisherImpl 实例。
  • ~PublisherImpl():析构函数,销毁 PublisherImpl 实例。
  • enable():启用 PublisherImpl。
  • get_qos() const:获取 Publisher 的 QoS 策略。
  • set_qos(const PublisherQos& qos):设置 Publisher 的 QoS 策略。
  • get_listener() const:获取 PublisherListener 指针。
  • set_listener(PublisherListener* listener):设置 PublisherListener。
  • create_datawriter(...):创建 DataWriter,有多个重载版本。
  • delete_datawriter(const DataWriter* writer):删除指定的 DataWriter。
  • lookup_datawriter(const std::string& topic_name) const:根据主题名称查找对应的 DataWriter。
  • contains_entity(const fastrtps::rtps::InstanceHandle_t& handle) const:检查给定实例句柄是否属于 Publisher。
  • get_datawriters(std::vector<DataWriter*>& writers) const:获取 Publisher 创建的所有 DataWriter 对象。
  • has_datawriters() const:检查 Publisher 是否有 DataWriter 对象。
  • wait_for_acknowledgments(const fastrtps::Duration_t& max_wait):等待订阅方确认所有数据。
  • get_participant() const:获取所属的 DomainParticipant。
  • delete_contained_entities():删除包含的所有实体,如 DataWriter。
  • set_default_datawriter_qos(const DataWriterQos& qos):设置默认的 DataWriter QoS 策略。
  • reset_default_datawriter_qos():重置默认的 DataWriter QoS 策略。
  • get_default_datawriter_qos() const:获取默认的 DataWriter QoS 策略。
  • get_datawriter_qos_from_profile(const std::string& profile_name, DataWriterQos& qos) const:从配置文件中获取 DataWriter 的 QoS 策略。
  • disable():移除所有监听器,以便安静地销毁 Publisher。
  • type_in_use(const std::string& type_name) const:检查是否有任何 DataWriter 使用给定的类型名称。
  • get_listener_for(const StatusMask& status):返回处理给定状态回调的最合适的监听器,如果没有合适的监听器,则返回 nullptr。
  • can_be_deleted():检查 Publisher 是否可以被删除。

另外,还有一些被注释掉的方法(可能在未来版本中实现):

  • suspend_publications()
  • resume_publications()
  • begin_coherent_changes()
  • end_coherent_changes()
  • copy_from_topic_qos(...)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

本地资源检测 自定义规则 零基础上手指南

本地资源检测是UWA推出的、面向于静态资源的全量分析。可以全面自动检测项目静态工程内各项资源、代码和设置&#xff0c;能够帮助项目组制定合理的资源与代码标准&#xff0c;及时发现潜在的性能问题和异常错误&#xff0c;建立有效的开发规范。其中“自定义规则”功能特别获得…

docker 安装zookeeper单机版

1. 安装版本3.5.7, 也可以自己去官网找到自己需要的版本复制命令即可 https://hub.docker.com/_/zookeeper/tags docker pull zookeeper:3.5.7 2. 创建映射文件夹&#xff1a; #1. 在centos中创建三个文件夹 mkdir -p /home/zookeeper/conf mkdir -p /home/zookeeper/data mkd…

图片视频抹除算法总结Inpaint

基本是从图片抹水印和视频抹水印两个方向 Video Inpainting&#xff1a;https://paperswithcode.com/task/video-inpaintingImage Inpainting&#xff1a;https://paperswithcode.com/task/image-inpainting 请根据目录查看 图片 Partial Conv 部分卷积层 源自于Image In…

游戏服务器搭建过程中Maven多模块编译遇到的一些问题

目录 1、多模块的创建 1.1 父模块的创建 1.2 删除垃圾文件 1.3 修改pom.xml 1.4 创建子模块继承 2、子模块之间的互相引用 3、多个模块间版本的管理 3.1 dependencis 3.2 dependencyManagement 4、依赖执行 5、在Spring Boot项目中加载依赖项目的组件有几种常用的方法…

十一、PBR材质金属度、粗糙度以及环境贴图的使用

Three.js——十一、PBR材质金属度、粗糙度以及环境贴图的使用 metalness金属度 金属度属性.metalness表示材质像金属的程度, 非金属材料,如木材或石材,使用0.0,金属使用1.0。 new THREE.MeshStandardMaterial({metalness: 1.0,//金属度属性 }) // 或者 // mesh.material.met…

Java面试题-并发篇(2万字带你搞定并发问题)

Java面试题-并发篇 一、线程 1. 线程和进程有什么区别&#xff1f; 线程具有许多传统进程所具有的特征&#xff0c;故又称为轻型进程(Light—Weight Process)或进程元&#xff1b;而把传统的进程称为重型进程(Heavy—Weight Process)&#xff0c;它相当于只有一个线程的任务…

山西电力市场日前价格预测【2023-07-12】

日前价格预测 预测明日&#xff08;2023-07-12&#xff09;山西电力市场全天平均日前电价为446.44元/MWh。其中&#xff0c;最高日前价格为584.92元/MWh&#xff0c;预计出现在12: 00。最低日前电价为325.62元/MWh&#xff0c;预计出现在00: 30。 价差方向预测 1&#xff1a;实…

【操作系统】磁盘调度算法 先来先服务、最短寻道时间优先、扫描算法、循环扫描算法

目录 一、实验要求二、实验原理三、实验内容四、实验结果五、总结 一、实验要求 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、扫描算法SCAN和循环扫描算法CSCAN的工作过程。假设有n个磁道号所组成的磁道访问序列&#xff0c;给定开始磁道号m和磁头移动的方向(正向或者反…

【sgRectSelect】Vue实现拖拽鼠标圈选、划区域、框选组件:矩形区域选中checkbox,并回调相关选中、取消选中的操作

边框线虚线动画效果请参阅边框虚线滚动动画特效_虚线滚动效果_你挚爱的强哥的博客-CSDN博客【代码】边框虚线滚动动画特效。_虚线滚动效果https://blog.csdn.net/qq_37860634/article/details/130507289 碰撞检测原理请前往 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞…

嵌入式c语言编码规范

学习嵌入式的同学应该首先掌握嵌入式编码规范&#xff0c;这样才能更好的嵌入式系统。 下面就从这几个方面讲解一下嵌入式c编码规范。 注释风格、排版风格、头文件风格、变量定义、宏定义、函数 1 注释风格 1.1 注释的原则是有助于对程序的阅读和理解&#xff0c;注释不宜太多…

通过(.zip 压缩文件)安装及卸载MySQL

文章目录 一、MySQL安装1.下载MySQL压缩包2.将下载好的压缩包解压到一个没有中文路径的目录下3.配置MySQL环境变量4.验证是否配置成功5.初始化MySQL数据库6.注册MySQL服务7.启动MySQL服务8.修改MySQL数据库默认账户密码9.登录MySQL数据库10.退出MySQL 二、MySQL卸载1.以管理员身…

什么是EDI 180 退货授权和通知?

EDI 180 退货授权和通知是零售商和供应商在退货过程中使用的电子数据交换&#xff08;EDI&#xff09;文件。它既可以作为请求和授权&#xff0c;也可以作为通知文件。 EDI 180 的基本组成部分是什么&#xff1f; EDI 180 交易需要包括有关退货的关键信息。由于EDI 180可以双…

Linux 批量杀掉进程(包含某个关键字)

一、场景说明 现场环境有十多个包含 ”celery” 关键字的进程在运行&#xff0c;每次重启服务&#xff0c;需要将这些进行kill掉&#xff0c;然后重新启动。 可以用如下命令批量kill掉这些进程&#xff1a; kill -9 PID1 PID2 PID3 PID4.....其中&#xff0c;PID是查询到的进…

第九章——内存模型和名称空间

单独编译 C允许程序员将组件函数放在独立的文件中。下面列出了头文件中常包含的内容&#xff1a; 函数原型使用#define或const定义的符号常量结构声明类声明模板声明内联函数 将结构声明放在头文件中是可以的&#xff0c;因为它们不创建变量&#xff0c;而只是在源代码文件…

数据结构--树的存储结构

数据结构–树的存储结构 树的逻辑结构 树是 n ( n ≥ 0 &#xff09; n (n\ge0&#xff09; n(n≥0&#xff09;个结点的有限集合&#xff0c;n 0 时&#xff0c;称为空树&#xff0c;这是一种特殊情况。 在任意一棵非空树中应满足: 1&#xff09;有且仅有一个特定的称为 根 …

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

操作系统接口 MIT 6.828 - 1. Lab 01: Xv6 and Unix utilities

本文会将lab1中的思路以及知识点进行分析&#xff0c;并作为作者学习MIT 6.828的一个学习总结&#xff0c;希望能够帮助到学习该lab的同学们 中文版书籍&#xff1a;中文版书籍 实验教案地址&#xff1a;教案地址 操作系统接口 在操作系统中&#xff0c;为了能够有效地与操作系…

Amelia、Bookly 和 Booked:哪个WordPress预约插件更好?

各种企业都需要预订软件来管理预约。然而&#xff0c;开发预订系统是网站中最复杂和最昂贵的元素之一。 那些使用 WordPress 构建网站的人有一个优势。只需点击几下&#xff0c;他们就可以将预约插件集成到他们的网站中。 预约插件是一个预订向导&#xff0c;可以自动执行和管…

数据结构——堆的实现(细)

目录 1.1 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆…

Netty核心技术十--Netty 核心源码剖析

1. 基本说明 只有看过Netty源码&#xff0c;才能说是真的掌握了Netty框架。 在 io.netty.example 包下&#xff0c;有很多Netty源码案例&#xff0c;可以用来分析 2. netty 启动过程源码分析 本次分析使用的是example包下的echo 2.1 源码剖析的目的 用源码分析的方式走一下…