OpenDDS中避免订阅发布同一主题时的自环现象(适用于所有DDS)

目录

  • 1、摘要
  • 2、理解"自反传输"
  • 2、解决方案
    • 2.1、使用 DataReaderListener 进行过滤
    • 3.2、使用 Partition 进行隔离
    • 3.3、 使用不同的 Topic
  • 总结

1、摘要

在 OpenDDS 中,同时订阅并发布同一主题会导致自环现象,即接收到自己发送的消息。本文介绍了在 OpenDDS 中避免自环现象的解决方案,主要包括使用 DataReaderListener 进行过滤和使用 Partition 进行隔离的方法。通过这些方法,可以在应用层面有效地控制数据的接收,确保数据的正确处理,提高系统的稳定性和可靠性。

2、理解"自反传输"

在 OpenDDS 中,如果你订阅并且发布了同一个主题,会导致你收到自己发布的消息,这是正常的行为。这种情况通常称为 “自反传输” 或 “自环”,是 DDS 规范的一部分。

2、解决方案

2.1、使用 DataReaderListener 进行过滤

在 DataReaderListener 中可以实现对接收到的数据进行过滤,避免处理自己发送的消息。你可以在 on_data_available 回调中检查接收到的数据的源头,然后决定是否处理。这样可以在应用层面进行控制。

示例代码:
在创建MyDataReaderListener 的时候将writerHandle传入进来。这里我的MyDataReaderListener 一个实例化对应一个主题。具体你还需要根据的场景进行修改。

class MyDataReaderListener : public virtual DDS::DataReaderListener {
public:MyDataReaderListener ( DDS::InstanceHandle_t writerHandle),m_dataWriterHandle{writerHandle}{}virtual void on_data_available(DDS::DataReader_ptr reader) {MyDataReader_var myReader = MyDataReader::_narrow(reader);if (!CORBA::is_nil(myReader.in())) {MyDataSeq dataSeq;DDS::SampleInfoSeq infoSeq;// 读取数据myReader->take(dataSeq, infoSeq, DDS::LENGTH_UNLIMITED, DDS::ANY_SAMPLE_STATE, DDS::ANY_VIEW_STATE, DDS::ANY_INSTANCE_STATE);for (DDS::ULong i = 0; i < dataSeq.length(); ++i) {// 检查数据源if (infoSeq[i].valid_data   && false == isFromLocalPublisher(info_seq[i])) {// 处理数据}}}}virtual bool isFromLocalPublisher(const DDS::SampleInfo& info) {// 这里可以根据其他属性来判断是否是本地 Publisher 发布的数据// 比较dataWriter 的句柄等return (info.publication_handle != DDS::HANDLE_NIL && info.publication_handle == m_dataWriterHandle);}private:DDS::InstanceHandle_t m_dataWriterHandle; // 本地 DataWriter 的实体ID
};// writerHandle 的获取方式
writerHandle = dataWriter->get_instance_handle();

3.2、使用 Partition 进行隔离

在 OpenDDS 中,可以使用 Partition 来实现数据的隔离,使得一组 DataReader 和 DataWriter 只能收到和发送特定 Partition 的数据。你可以为你的 DataReader 和 DataWriter 指定不同的 Partition,这样就能确保一个 DataReader 不会接收到自己发送的消息。

示例代码:

DDS::DataReaderQos readerQos;
DDS::PublisherQos publisherQos;// 设置 DataReader 和 DataWriter 的 Partition
readerQos.partition.name.length(1);
readerQos.partition.name[0] = "MyPartition1";publisherQos.partition.name.length(1);
publisherQos.partition.name[0] = "MyPartition2";

3.3、 使用不同的 Topic

如果你的应用场景允许,可以考虑使用不同的 Topic 来区分你发布和订阅的数据。这样即使你同时订阅和发布相同的 Topic,由于数据的内容属性不同,也可以区分出自己发送的消息和其他人发送的消息。

总结

以上是一些常见的方法,你可以根据你的实际需求和应用场景选择合适的方法来避免接收到自己发送的消息。无论选择哪种方法,都需要根据你的需求进行合适的配置和处理。

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

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

相关文章

Day10:基础入门-HTTP数据包Postman构造请求方法请求头修改状态码判断

目录 数据-方法&头部&状态码 案例-文件探针 案例-登录爆破 工具-Postman自构造使用 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗透命令&#xff1a;文件…

最新消息:英特尔宣布成立全新独立运营的FPGA公司——Altera

今天&#xff0c;英特尔宣布成立全新独立运营的FPGA公司——Altera&#xff08;2015年6月Intel以 167 亿美元的价格&#xff0c;收购FPGA厂商Altera&#xff09;。首席执行官Sandra Rivera和首席运营官Shannon Poulin分享展示其在超过550亿美元的市场中保持领先性的战略规划&am…

什么是端点安全以及如何保护端点

什么是端点安全 端点是指可以接收信号的任何设备&#xff0c;是员工使用的一种计算设备&#xff0c;用于保存公司数据或可以访问 Internet。端点的几个示例包括&#xff1a;服务器、工作站&#xff08;台式机和笔记本电脑&#xff09;、移动设备、虚拟机、平板电脑、物联网、可…

一【初识EMC】

在作为硬件行业相关从业者&#xff0c;经常接触到EMC相关问题&#xff0c;下面来简单介绍下EMC相关方面的知识 文章目录 前言一、生活中的EMC现象&#xff1f;二、EMC是什么三、EMC的三要素四、EMI与EMS的评估方式1.RE2.CE3.HAR4.FLICKER5.Rs6.CS7.ESD8.EFT9.DIP10.PMS11.surge…

Zookeeper3:客户端命令

文章目录 客户端命令连接服务端Zookeeper客户端内置命令 ls - 节点信息 客户端命令 连接服务端Zookeeper //客户端连接服务端zookeeper 默认连的本机2181端口的zookeeper cd /opt/module/zookeeper-3.9.1/bin && sh zkCli.sh//客户端连接远程服务端zookeeper cd /op…

【小尘送书-第十一期】编程的基石,开发的核心:《算法秘籍》

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

R语言简介|你对R语言了解多少?

R语言是一种专门用于统计计算和图形展示的开源编程语言&#xff0c;它在数据科学领域有着广泛的应用。下面对R语言的环境、基础语法及注释进行解释&#xff1a; R语言环境 安装与配置 安装R语言通常可以从官方站点下载对应操作系统的安装包&#xff0c;如Windows、Linux、ma…

lotus worker停止接单

worker停止接单 会做完当前的任务 lotus-worker set --enabledfalse# lotus-worker --worker-repo/worker01 set --enabledfalse DEPRECATED: This command will be removed in the future# lotus-worker --worker-repo/worker01 info Enabled: false参考 worker停止接单

如何使用GAP-Burp-Extension扫描潜在的参数和节点

关于GAP-Burp-Extension GAP-Burp-Extension是一款功能强大的Burp扩展&#xff0c;该工具在getAllParams扩展的基础上进行了升级&#xff0c;该工具不仅可以帮助广大研究人员在安全审计过程中扫描潜在的参数&#xff0c;而且还可以搜索潜在的链接并使用这些参数进行测试&#…

零基础如何快速入门伦敦金交易

伦敦金交易是金融市场中备受关注的一种投资方式。对于想要学习如何炒伦敦金并快速开始交易的人来说&#xff0c;本文将为您提供一份全面而详细的指南。无论您是初学者还是有经验的交易者&#xff0c;本文都将帮助您了解伦敦金交易的基本知识&#xff0c;并提供一些实用的技巧和…

安卓与鸿蒙的区别

安卓和鸿蒙是两个不同的操作系统。下面是它们的一些区别&#xff1a; 1. 公司&#xff1a;安卓是由谷歌开发的操作系统&#xff0c;而鸿蒙是由华为开发的操作系统。 2. 开放性&#xff1a;安卓是开放源代码的操作系统&#xff0c;可以由各种手机制造商进行定制和使用。鸿蒙也…

协议-http协议-基础概念03-http状态码-http特点-http性能-压缩和分块传输-范围请求

参考来源&#xff1a; 极客时间-透视HTTP协议(作者&#xff1a;罗剑锋)&#xff1b; 01-状态码分类 开头的 Version 部分是 HTTP 协议的版本号&#xff0c;通常是HTTP/1.1&#xff0c;用处不是很大。后面的 Reason 部分是原因短语&#xff0c;是状态码的简短文字描述&#xff…

04锁机制-分布式锁

一句话导读 分布式锁是一种在分布式系统中实现对共享资源的访问控制的锁机制&#xff0c;它可以确保在不同的节点上只有一个线程能够获取锁&#xff0c;从而避免了分布式环境下的并发访问问题 目录 一句话导读 一、什么是分布式锁 二、实现分布式锁的方式 1.基于数据库实现…

【Redis】高级特性 - 发布和订阅

文章目录 1. 发布/订阅模式概述2. 在Redis中使用发布/订阅模式2.1 发布消息2.2 订阅频道2.3 接收消息 3. 示例演练3.1 启动两个Redis客户端3.2 发布者发布消息3.3 订阅者接收消息 4. 取消订阅5. 发布/订阅模式的优势结语 在Redis的学习中&#xff0c;发布/订阅&#xff08;Pub/…

每周一算法:双向广搜

题目链接 字符串变换 题目描述 已知有两个字串 A , B A,B A,B&#xff0c;及一组字串变换的规则&#xff08;至多 6 6 6个规则&#xff09;: A 1 → B 1 A_1→B_1 A1​→B1​ A 2 → B 2 A_2→B_2 A2​→B2​ … 规则的含义为&#xff1a;在 A A A中的子串 A 1 A_1 A1​…

pytorch统计属性

目录 1.normal2. mean, sum, min, max, prod3.argmin, argmax4. topk kthvalue5. compare 1.normal torch.normal(mean, std, *, generatorNone, outNone) → Tensor返回一个张量&#xff0c;其中的每个元素随机来自独立的标准正态分布。这些分布具有给定的均值和标准差。 参数…

Linux 内核获取函数size

方式一&#xff1a;通过objdump -t直接从目标文件中获取函数size #objdump -t file_unread.o | grep hook 0000000000000030 l F .text 000000000000012f hook_vfs_read0000000000000030 l F .text 000000000000012f hook_vfs_read各个字段说明 0000000000000030&#x…

【cmu15445c++入门】(13)C++的std::promise

一、说明 std::promise 是C11并发编程中常用的一个类&#xff0c;常配合std::future使用。其作用是在一个线程t1中保存一个类型typename T的值&#xff0c;可供相绑定的std::future对象在另一线程t2中获取 二、代码 #include <chrono> #include <future> #includ…

Hive SQL 开发指南(二)使用(DDL、DML,DQL)

在大数据领域&#xff0c;Hive SQL 是一种常用的查询语言&#xff0c;用于在 Hadoop上进行数据分析和处理。为了确保代码的可读性、维护性和性能&#xff0c;制定一套规范化的 Hive SQL 开发规范至关重要。本文将介绍 Hive SQL 的基础知识&#xff0c;并提供一些规范化的开发指…

如何安装ProtoBuf环境

1 &#x1f351;下载 ProtoBuf&#x1f351; 下载 ProtoBuf 前⼀定要安装依赖库&#xff1a;autoconf automake libtool curl make g unzip 如未安装&#xff0c;安装命令如下&#xff1a; Ubuntu ⽤⼾选择&#xff1a; sudo apt-get install autoconf automake libtool cur…