当前位置: 首页 > news >正文

【FastDDS】Layer DDS之Domain ( 05-Creating a DomainParticipant)

Fast DDS 域参与者(DomainParticipant)的创建与删除详解

一、域参与者(DomainParticipant)的基础创建方式

域参与者(DomainParticipant)的创建需通过域参与者工厂(DomainParticipantFactory)单例的 create_participant() 成员函数完成——DomainParticipantFactory 本质上就是 DomainParticipant 的创建工厂。当域参与者的生命周期结束时,必须通过 delete_participant() 函数将其删除,具体删除细节可参考“域参与者的删除”章节。

(一)创建所需的参数说明

1. 必选参数
  • DomainId(域ID):用于指定创建 DomainParticipant 所属的域,是域的唯一标识。
  • DomainParticipantQos(域参与者服务质量):用于描述 DomainParticipant 的行为特性。若传入的值为 PARTICIPANT_QOS_DEFAULT,则表示使用默认的 DomainParticipantQos 配置。

除上述两个必选参数外,还可选择传入 DomainParticipantExtendedQos(扩展域参与者服务质量)——该参数同时包含 DomainIdDomainParticipantQos,可替代前两个必选参数使用。

2. 可选参数
  • 监听器(Listener):需继承自 DomainParticipantListener,用于实现响应 DomainParticipant 事件与状态变化的回调函数。默认情况下,使用空回调函数(即不触发任何自定义逻辑)。
  • StatusMask(状态掩码):用于激活或禁用 DomainParticipantListener 中单个回调函数的触发。

(二)重要警告

根据 DDSI-RTPS V2.2 标准(第 9.6.1.1 节),默认端口会根据 DomainId 计算(具体计算规则详见“知名端口(Well Known Ports)”章节)。因此,建议使用小于 200 的 DomainId——若 DomainId 超过 233,默认端口分配会持续失败。

(三)创建结果的判断

若创建过程中出现错误(例如传入的 QoS 不兼容或不受支持),create_participant() 会返回空指针(nullptr)。因此,建议在创建后检查返回值是否为有效指针,以确保创建成功。

(四)基础创建方式的示例代码

以下代码展示了三种常见的基础创建场景:使用默认 QoS 且无监听器、使用自定义 QoS、使用默认 QoS 且带自定义监听器。

// 1. 使用默认DomainParticipantQos且无监听器创建DomainParticipant
// PARTICIPANT_QOS_DEFAULT 表示使用默认QoS
DomainParticipant* participant_with_default_attributes =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == participant_with_default_attributes)
{// 错误处理return;
}// 2. 传入自定义DomainParticipantQos创建DomainParticipant
DomainParticipantQos custom_qos;// (根据需求)修改QoS属性
// (...)DomainParticipant* participant_with_custom_qos =DomainParticipantFactory::get_instance()->create_participant(0, custom_qos);
if (nullptr == participant_with_custom_qos)
{// 错误处理return;
}// 3. 使用默认QoS且带自定义监听器创建DomainParticipant
// CustomDomainParticipantListener 是继承自 DomainParticipantListener 的自定义监听器
CustomDomainParticipantListener custom_listener;
DomainParticipant* participant_with_default_qos_and_custom_listener =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT,&custom_listener);
if (nullptr == participant_with_default_qos_and_custom_listener)
{// 错误处理return;
}

二、基于配置文件创建域参与者(Profile-Based Creation)

除直接传入 DomainParticipantQos 外,还可通过配置文件(Profile)的名称创建 DomainParticipant,具体需调用 DomainParticipantFactory 单例的 create_participant_with_profile() 成员函数。

(一)创建所需的参数说明

1. 必选参数
  • DomainId(域ID):指定 DomainParticipant 所属的域,需注意不要使用大于 200 的 DomainId(原因详见“域参与者的基础创建方式”中的警告)。
  • 配置文件名称:需为 DomainParticipant 应用的配置文件名称(配置文件需预先加载,详见下文说明)。
2. 可选参数
  • 监听器(Listener):继承自 DomainParticipantListener,用于实现事件与状态变化的回调函数,默认使用空回调。
  • StatusMask(状态掩码):控制 DomainParticipantListener 中单个回调的触发,默认启用所有事件的回调。

(二)前置条件:加载 XML 配置文件

使用配置文件创建前,必须预先加载包含该配置文件的 XML 文件(加载方式详见“从 XML 文件加载配置文件”章节)。若未加载,将无法找到指定配置文件,导致创建失败。

(三)基于配置文件创建的示例代码

// 第一步:加载包含配置文件的XML文件
DomainParticipantFactory::get_instance()->load_XML_profiles_file("profiles.xml");// 1. 使用配置文件且无监听器创建DomainParticipant
DomainParticipant* participant_with_profile =DomainParticipantFactory::get_instance()->create_participant_with_profile(0, "participant_profile");
if (nullptr == participant_with_profile)
{// 错误处理return;
}// 2. 使用配置文件且带自定义监听器创建DomainParticipant
// CustomDomainParticipantListener 是继承自 DomainParticipantListener 的自定义监听器
CustomDomainParticipantListener custom_listener;
DomainParticipant* participant_with_profile_and_custom_listener =DomainParticipantFactory::get_instance()->create_participant_with_profile(0, "participant_profile",&custom_listener);
if (nullptr == participant_with_profile_and_custom_listener)
{// 错误处理return;
}

(四)创建结果的判断

create_participant() 类似,若创建过程出错(如 QoS 不兼容),create_participant_with_profile() 会返回空指针,建议创建后检查返回值的有效性。

三、基于默认配置文件创建域参与者

若环境中已导出某个配置文件(相关说明详见“XML 配置文件(XML profiles)”章节),可通过 DomainParticipantFactory 单例的 create_participant_with_default_profile() 成员函数创建 DomainParticipant,此时会自动使用环境中导出的配置文件进行配置。

若环境中未导出配置文件,则会使用 DomainParticipantQos 的默认值创建 DomainParticipant,且默认 DomainId 为 0。

(一)创建所需的参数说明

该方式仅包含可选参数,无必选参数:

  • 监听器(Listener):继承自 DomainParticipantListener,默认使用空回调。
  • StatusMask(状态掩码):控制回调触发,默认启用所有事件。

(二)前置条件:加载 XML 配置文件

与“基于配置文件创建”相同,需预先加载 XML 配置文件(详见“XML 配置文件”章节),否则无法使用环境中导出的配置。

(三)基于默认配置文件创建的示例代码

// 1. 使用环境配置文件且无监听器创建DomainParticipant
DomainParticipant* participant =DomainParticipantFactory::get_instance()->create_participant_with_default_profile();
if (nullptr == participant)
{// 错误处理return;
}// 2. 使用环境配置文件且带自定义监听器创建DomainParticipant
// CustomDomainParticipantListener 是继承自 DomainParticipantListener 的自定义监听器
CustomDomainParticipantListener custom_listener;
DomainParticipant* participant_with_custom_listener =DomainParticipantFactory::get_instance()->create_participant_with_default_profile(&custom_listener, StatusMask::none()); // StatusMask::none() 表示禁用所有事件回调
if (nullptr == participant_with_custom_listener)
{// 错误处理return;
}

(四)创建结果的判断

create_participant_with_default_profile() 出错时会返回空指针,建议创建后检查返回值。

四、域参与者(DomainParticipant)的删除

DomainParticipant 必须通过 DomainParticipantFactory 单例的 delete_participant() 成员函数删除,且删除需满足严格的前置条件。

(一)删除的前置条件(重要)

只有当该 DomainParticipant 所属的所有实体(Entities)(包括发布者 Publisher、订阅者 Subscriber、主题 Topic)均已删除时,才能删除 DomainParticipant。若存在未删除的实体,delete_participant() 会报错,且 DomainParticipant 不会被删除。

实体的删除有两种方式:

  1. 调用 DomainParticipantdelete_contained_entities() 成员函数,批量删除其所属的所有实体。
  2. 手动调用 DomainParticipant 的对应删除函数,逐个删除实体(如 delete_publisher() 删除发布者、delete_subscriber() 删除订阅者、delete_topic() 删除主题等)。

(二)删除域参与者的示例代码

// 第一步:创建DomainParticipant
DomainParticipant* participant =DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
if (nullptr == participant)
{// 错误处理return;
}// (根据需求)使用DomainParticipant进行通信
// (...)// 第二步:删除DomainParticipant所属的所有实体(批量删除)
if (participant->delete_contained_entities() != RETCODE_OK)
{// 域参与者删除其创建的实体失败,进行错误处理return;
}// 第三步:删除DomainParticipant
if (DomainParticipantFactory::get_instance()->delete_participant(participant) != RETCODE_OK)
{// 错误处理return;
}

文章转载自:

http://SjWpkS7b.Lzzqz.cn
http://7vwVlNte.Lzzqz.cn
http://z3hSqOZx.Lzzqz.cn
http://DKH95dzF.Lzzqz.cn
http://CMH9Nrss.Lzzqz.cn
http://csEADLvV.Lzzqz.cn
http://UOUe8gvV.Lzzqz.cn
http://EdJ2vQK0.Lzzqz.cn
http://w6qgCSj5.Lzzqz.cn
http://H9uuoTgD.Lzzqz.cn
http://3FJSGxav.Lzzqz.cn
http://ponQJu2d.Lzzqz.cn
http://mBvbpxJU.Lzzqz.cn
http://Kdg8X0XI.Lzzqz.cn
http://49aqt151.Lzzqz.cn
http://Q5Yu0Vjv.Lzzqz.cn
http://aUhXDpxT.Lzzqz.cn
http://k4NXcxpi.Lzzqz.cn
http://R9vj4r3k.Lzzqz.cn
http://YdYBcnPm.Lzzqz.cn
http://spwJbp12.Lzzqz.cn
http://BmrJi5Wo.Lzzqz.cn
http://ZldMrd9t.Lzzqz.cn
http://QCX99hCx.Lzzqz.cn
http://nx69AfNi.Lzzqz.cn
http://GrosH8c2.Lzzqz.cn
http://WeMk6CMv.Lzzqz.cn
http://2jLEQaYp.Lzzqz.cn
http://90qaTp3E.Lzzqz.cn
http://xGqef4Z6.Lzzqz.cn
http://www.dtcms.com/a/365150.html

相关文章:

  • 关于linux网络编程——3
  • 扫地日记:有鹿巡扫机器人在景区被人类“调戏”的365天
  • ansible总结2
  • GIS大学课程表都长啥样?几个地信专业的大学一周课程表
  • 如何评价2025年数学建模国赛?
  • (二)文件管理-基础命令-pwd命令的使用
  • 高并发数据写入场景下 MySQL 的性能瓶颈与替代方案
  • “我店”积分模式的可持续性拷问:短剧能否撑起长期消泡沫需求?
  • 蓝桥杯算法之基础知识(6)
  • Python函数和方法类型注释
  • k8s使用StatefulSet(有状态)部署单节点 MySQL方案(使用本地存储)
  • 【Python】 Python 项目初始化脚本
  • JavaWeb03
  • EagleTrader观察|你的固定心态,可能正在悄悄让你交易破产
  • 【踩坑记录】Unity 项目中 PlasticSCM 掩蔽列表引发的 文件缺失问题排查与解决
  • 3种通过USB从电脑传输文件到iPad的方法
  • Python_occ 学习记录 | 细观建模(1)
  • Ubuntu查看开机以来修改的文件
  • 论文介绍“DUSt3R”:让 3D 视觉从“繁琐”走向“直观”
  • 语音合成之二十六 TTS情感控制技术开源数据集
  • PHP如何解决使用国密SM4解密Base64数据错误问题?(基于lpilp/guomi)
  • [论文阅读] 人工智能 + 软件工程 | ReCode:解决LLM代码修复“贵又慢”!细粒度检索+真实基准让修复准确率飙升
  • 一键 i18n 国际化神库!适配 Vue、React!
  • CMake构建学习笔记24-使用通用脚本构建PROJ和GEOS
  • Web端最强中继器表格元件库来了!55页高保真交互案例,Axure 9/10/11通用
  • Java学习笔记-零基础学MySQL(四)
  • 三阶Bezier曲线,已知曲线上一点到曲线起点的距离为L,计算这个点的参数u的方法
  • 【C++】C++入门—(中)
  • MySQL 开发避坑:DROP TABLE 前你必须知道的几件事
  • 【题解】洛谷P1776 宝物筛选 [单调队列优化多重背包]