Fast DDS之Publisher

news2024/9/24 9:26:14

目录

  • Publisher
  • DataWriter

在这里插入图片描述

Publisher

Publisher是一直归属于DomainParticipant。

  1. 通过DomainParticipant的create_publisher创建Publisher,参数PublisherQos是必需的,可以使用默认值PUBLISHER_QOS_DEFAULT。可选的参数:PublisherListener和StatusMask
Publisher* publisher_with_default_qos =
        participant->create_publisher(PUBLISHER_QOS_DEFAULT);
if (nullptr == publisher_with_default_qos) {
    // Error
    return;
}
  1. 基于Profile创建Publisher,参数PublisherQos是必需的,可以使用默认值PUBLISHER_QOS_DEFAULT。可选的参数:PublisherListener和StatusMask
// First load the XML with the profiles
DomainParticipantFactory::get_instance()->load_XML_profiles_file("profiles.xml");
// Create participant
// Create a Publisher using a profile and no Listener
Publisher* publisher_with_profile = participant->create_publisher_with_profile("publisher_profile");
if (nullptr == publisher_with_profile) {
    // Error
    return;
}
  1. 删除Publisher
    删除Publisher前需要先删除所有属于Publisher的实体(DataWriters),可以使用delete_contained_entities()。
// Delete the entities the Publisher created.
if (publisher->delete_contained_entities() != ReturnCode_t::RETCODE_OK) {
    // Publisher failed to delete the entities it created.
    return;
}

// Delete the Publisher
if (participant->delete_publisher(publisher) != ReturnCode_t::RETCODE_OK) {
    // Error
    return;
}

DataWriter

DataWriter归属于Publisher,对DataWriter来说,Publisher就是一个创建工厂。每个DataWriter在创建之处绑定到一个Topic,所以Topic必须先于DataWriter创建。
默认的DataWriterQos可以通过Publisher实例函数get_default_datawriter_qos()获取
DataWriterListener是一个抽象类,用于响应DataWriter的状态发生变化,有以下成员函数用于回调:

  • on_publication_matched()
  • on_offered_deadline_missed()
  • on_offered_incompatible_qos()
  • on_liveliness_lost()
  • on_unacknowledged_sample_removed()
    创建DataWriter:使用Publisher的函数create_datawriter()函数创建。必选的参数为绑定到要发送数据的Topic和DataWriterQos,可选的参数为继承自DataWriterListener和StatusMask
DataWriter* data_writer_with_default_qos = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT);
if (nullptr == data_writer_with_default_qos) {
    // Error
    return;
}

通过Profile创建:

// First load the XML with the profiles
DomainParticipantFactory::get_instance()->load_XML_profiles_file("profiles.xml");

// Create a DataWriter using a profile and no Listener
DataWriter* data_writer_with_profile = publisher->create_datawriter_with_profile(topic, "data_writer_profile");
if (nullptr == data_writer_with_profile) {
    // Error
    return;
}

通过自定义PayloadPool创建DataWriter

// A DataWriterQos must be provided to the creation method
DataWriterQos qos;

// Create PayloadPool
std::shared_ptr<eprosima::fastrtps::rtps::IPayloadPool> payload_pool =
        std::dynamic_pointer_cast<eprosima::fastrtps::rtps::IPayloadPool>(std::make_shared<CustomPayloadPool>());

DataWriter* data_writer = publisher->create_datawriter(topic, qos, nullptr, StatusMask::all(), payload_pool);
if (nullptr == data_writer) {
    // Error
    return;
}

删除DataWriter

// Delete the DataWriter
if (publisher->delete_datawriter(data_writer) != ReturnCode_t::RETCODE_OK) {
    // Error
    return;
}

发送数据
write()函数有两个参数:指向要发送数值的data实例;instance的handler。如果handle是非空,那么它必须要被TypeSupport的getKey()获取到,否则write函数会失败。

// Publish the new value, deduce the instance handle
if (data_writer->write(data, eprosima::fastrtps::rtps::InstanceHandle_t()) != ReturnCode_t::RETCODE_OK) {
    // Error
    return;
}

减少发送数据的拷贝:通过loan sample,步骤如下:

  1. 通过 loan_sample()函数获取loaned sample的引用
  2. 使用上一步获取的引用构建data
  3. write发送
    如果loan_sample()被调用但sample未被发送,必须要使用discard_loan()释放。
void* data = nullptr;
if (ReturnCode_t::RETCODE_OK == data_writer->loan_sample(data)) {
    bool error = false;

    // Fill the data values
    // (...)

    if (error) {
        // Return the loan without publishing
        data_writer->discard_loan(data);
        return;
    }

    // Publish the new value
    if (data_writer->write(data, eprosima::fastrtps::rtps::InstanceHandle_t()) != ReturnCode_t::RETCODE_OK) {
        // Error
        return;
    }
}

// The data instance can be reused to publish new values,
// but delete it at the end to avoid leaks
custom_type_support->deleteData(data)

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

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

相关文章

智能电表的功率计算方式是一样的吗?

随着科技的发展&#xff0c;智能电表已经成为了家庭和企业用电的必备设备。智能电表不仅可以实现用电量的监测和控制&#xff0c;还可以对用电负荷进行管理和优化。在智能电表的使用过程中&#xff0c;功率计算是一个重要的环节。那么&#xff0c;智能电表的功率计算方式是一样…

凉鞋的 Godot 笔记 202. 变量概述与简介

202. 变量概述与简介 想要用好变量不是一件简单的事情&#xff0c;因为变量需要命名。 我们可以从两个角度去看待一个变量&#xff0c;第一个角度是变量的功能&#xff0c;第二个是变量的可读性。 变量的功能其实非常简单&#xff0c;变量可以存储一个值&#xff0c;这个值是…

嵌入式行业是否会面临中年危机?

今日话题&#xff1a;嵌入式行业是否会面临中年危机&#xff1f;事实上&#xff0c;无论你在哪个行业工作&#xff0c;都可能面临下岗风险。因此&#xff0c;我的建议是选择一个有前景、发展空间大的行业和方向&#xff0c;并不断提升自己的技能价值。为了帮助你在嵌入式领域取…

面试知识点--基础篇

文章目录 前言一、排序1. 冒泡排序2. 选择排序3. 插入排序4. 快速单边循环排序5. 快速双边循环排序6. 二分查找 二、集合1.List2.Map 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、排序 1. 冒泡排序 冒泡排序就是把小的元素往前调或者把大…

万宾科技智能井盖传感器特点介绍

当谈论城市基础设施的管理和安全时&#xff0c;井盖通常不是第一项引人注目的话题。然而&#xff0c;传统井盖和智能井盖传感器之间的差异已经引起了城市规划者和工程师的广泛关注。这两种技术在功能、管理、安全和成本等多个方面存在着显著的差异。 WITBEE万宾智能井盖传感器E…

天锐绿盾数据防泄密系统

天锐绿盾数据防泄密系统&#xff08;简称数据防泄密系统&#xff09;是一套从源头上保障数据安全和使用安全的软件系统。包含了文件透明加解密、内部文件流转功能、密级管控、离线管理、文件外发管理、灵活的审批流程、工作模式切换、服务器白名单等功能。从根本上严防信息外泄…

Mysql创建视图中文乱码修改docker里的配置

问题现象&#xff1a; 创建的视图查询无数据&#xff0c;查看创建语句得知&#xff0c;where条件里的中文变成了“???”。 在客户端里查询字符编码&#xff1a; show VARIABLES like %char%;就是character_set_server导致的&#xff0c;它配置的竟然不是utf8&#xff0c;…

Linux设备树插件

什么是设备树插件 Linux4.4 以后引入了动态设备树&#xff08;Dynamic DeviceTree&#xff09;。设备树插件&#xff08;Device Tree Overlay&#xff09; 是一种用于设备树&#xff08;Device Tree&#xff09;的扩展机制。设备树是一种用于描述硬件设备的数据结构&#xff0c…

eNSP笔记②

动态路由 RIP [适用于小型网络] 静态路由是加上非直连的网段&#xff0c;动态路由是加上直连的网段 动态路由就是要宣告它要去的网段&#xff0c;在图中可以看到&#xff0c;一台路由需要宣告两个网段&#xff0c;路由A分别宣告10.0.0.0与192.168.1.0&#xff0c;路由B宣告10.…

是不是所有的低代码产品都能解决真实问题

随着大数据、云计算、人工智能技术的逐渐普及&#xff0c;越来越多的企业开始尝试建立&#xff0c;或者已经在企业内部建立起数字化的产品矩阵&#xff0c;有很多企业成功使用数字化帮助提升效率、发展业务能力的案例&#xff0c;但是也有不少企业发现数字化的能力建设成本巨大…

OpenCV17-图像形态学操作

OpenCV17-图像形态学操作 1.形态学操作1.1腐蚀1.2膨胀 2.形态学应用2.1开运算2.2闭运算2.3形态学梯度2.4顶帽运算2.5黑帽运算2.6击中击不中变换2.7形态学应用示例 1.形态学操作 1.1腐蚀 图像腐蚀&#xff08;Image erosion&#xff09;可用于减小图像中物体的大小、填充孔洞或…

高压放大器有哪些实际应用场景

高压放大器是一种特殊类型的放大器&#xff0c;用于放大高电压信号。它在各种实际应用场景中发挥着重要作用。在本文中&#xff0c;安泰电子将介绍高压放大器的主要应用场景&#xff0c;让我们更好地了解这些关键技术的实际应用。 医疗设备领域&#xff1a; 高压放大器在医疗设…

2023最新短视频配音软件~

随着互联网的迅猛发展&#xff0c;网络平台上的影视剧配音逐渐成为一种热门赚钱方式。那么&#xff0c;想要参与影视剧配音赚钱&#xff0c;就需要拥有一款好用的配音软件。下面我就为大家介绍一款最新的影视剧配音神器&#xff01; 悦音配音 这是一款大家都在用的配音工具&am…

TSINGSEE烟火识别算法的技术原理是什么?如何应用在视频监控中?

AI烟火识别算法是基于深度学习技术的一种视觉识别算法&#xff0c;主要用于在视频监控场景中自动检测和识别烟雾、火焰的行为。该技术基于深度学习神经网络技术&#xff0c;可以动态识别烟雾和火焰从有到无、从小到大、从大到小、从小烟到浓烟的状态转换过程。 1、技术原理 1…

企业微信设置可信域名

可信域名的验证文件注意一定放在域名所在的根目录下。 以cloud studio为例&#xff0c;工作区新建终端的路径就是域名在的根目录&#xff0c;而不是服务器的根目录

[DRAFT] LLVM ThinLTO原理分析

我们在《论文阅读&#xff1a;ThinLTO: Scalable and Incremental LTO》中介绍了ThinLTO论文的主要思想&#xff0c;这里我们介绍下LLVM ThinLTO是如何实现的。本文主要分为如下几个部分&#xff1a; LLVM ThinLTO Object 含有哪些内容&#xff1f;LLVM ThinLTO 是如何做优化的…

Splashtop 与 Canopy 携手共同增强对物联网设备的远程管理

2023年10月17日 加利福尼亚州库比蒂诺 Splashtop 在安全远程访问解决方案领域处于领先地位&#xff0c;Canopy 则是用于复杂硬件部署的领先 RMM 平台&#xff0c;双方今天宣布达成战略合作伙伴关系&#xff0c;以进一步增强和简化对物联网设备的远程管理。通过此次合作&#x…

react实现一维表格、键值对数据表格key value表格

UI画的需求很抽象&#xff0c;直接把数据铺开&#xff0c;不能直接用antd组件了 上一行是name&#xff0c;下一行是value&#xff0c;总数不定&#xff0c;最后前端还要显示求和 class OneDimensionTable extends React.Component { render() {const { data } this.props;le…

C++基础系列(一) 对象指针

一. 函数指针和指针函数 1.1 函数指针 这两个是C语言里两个比较绕的概念&#xff0c;我们先说一下函数指针 函数指针本质是一个指针&#xff0c;该指针的地址指向了一个函数。 在程序中定义了一个函数&#xff0c;那么在编译时系统就会为这个函数代码分配一段存储空间&#xf…

金融机器学习方法:K-均值算法

目录 1.算法介绍 2.算法原理 3.python实现示例 1.算法介绍 K均值聚类算法是机器学习和数据分析中常用的无监督学习方法之一&#xff0c;主要用于数据的分类。它的目标是将数据划分为几个独特的、互不重叠的子集或“集群”&#xff0c;以使得同一集群内的数据点彼此相似&…