DDS服务发现
DDS服务发现概述预制模块SPDPSEDPLiveness参考文档概述DDS的服务发现协议让网络中(同一个domain)的节点能够相互发现。有了服务发现机制各个应用能够快速发现远程的新加入的节点同时也能将自己告知其他节点。DDS服务发现分为两个部分Participant Discovery Protocol (PDP)PDP用于Participant 之间的相互发现Endpoint Discovery Protocol (EDP)EDP用于Endpoint一个reader或者writer都是一个Endpoint之间的相互发现根据DDS的规范各协议栈可以实现自己定义的PDP和EDP但是都必须实现Simple Participant Discovery Protocol (SPDP)和Simple Endpoint Discovery Protocol (SEDP)DDS的服务发现还分为静态服务发现和动态服务发现。其中静态服务发现只用SPDP而动态服务发现会用到SPDP和SEDP本文会结合fastdds官方用例HelloWorldExample和StaticHelloWorldExample的网络报包来进行说明网络包地址https://blog.csdn.net/ouyang035/article/details/147978578。wireshark过滤器((ip.src198.18.7.22 (ip.dst198.18.7.101||ip.dst239.255.0.1))|| (ip.src198.18.7.101 (ip.dst198.18.7.22||ip.dst239.255.0.1)))!ssh!tcp预制模块SPDP和SEDP主要是通过build-in endpoint和build-in topic来进行通信从而实现信息的交换完成相互发现。build-in endpointSPDPbuiltinParticipantWriterSPDPbuiltinParticipantReaderSEDPbuiltinPublicationsWriterSEDPbuiltinPublicationsReaderSEDPbuiltinSubscriptionWriterSEDPbuiltinSubscriptionReaderSEDPbuiltinTopicsWriter抓包中未出该消息SEDPbuiltinTopicsReader抓包中未出该消息BuiltinParticipantMessageReaderBuiltinParticipantMessageWriterbuild-in topic有四个预定义的TopicDCPSParticipantDCPSPublicationDCPSSubscriptionDCPSTopic抓包中未出该消息BuiltinParticipantMessageReader和BuiltinParticipantMessageWriter是实现writer liveliness机制所需要的。每一个participant都可以通过设置使能/禁止wirter liveness机制相应的使能或禁止这两个endpoint。pqos.wire_protocol().builtin.use_WriterLivelinessProtocol false // fastdds 默认是trueSPDPPDP的目的是发现网络上其他的participant的存在及其属性。SPDPbuiltinParticipantWriter是一个RTPS 的Best-EffortStatelessWriter。它会定期像预配置地locators列表发送SPDPdiscoveredParticipantData,通常来说是往组播地址(默认239.255.0.1)发送。它的HistoryCache包含一个SPDPdiscoveredParticipantData类型的数据对象这个数据对象的内容是由participant的属性信息确定例如domain id participant支持什么EDP协议 单播和组播地址和端口。SPDPdiscoveredParticipantData的属性SPDPbuiltinParticipantReader的HistoryCache中包含了所有活跃的participants的信息key用来识别每个不同的participant通过participant GUID。每当SPDPbuiltinParticipantReader接收到关于participant的信息时SPDP会检查HistoryCache寻找一个与participant GUID匹配的key的内容。如果没有找到匹配的key的条目就会以参与者的GUID为key添加新的条目。SPDP会周期性检查SPDPbuiltinParticipantReader的historycache寻找旧的条目这些条目被定义为那些超过leaseDuration没有收到消息的条目。然后删除它们。availableBuiltinEndpoints提供了预制endpoints的信息参考下面第三张图片。包括PUBLICATIONS_DETECTORSEDPbuiltinPublicationReaderPUBLICATIONS_ANNOUNCERSEDPbuiltinPublicationWriterSUBSCRIPTIONS_DETECTORSEDPbuiltinSubscriptionReaderSUBSCRIPTIONS_ANNOUNCERSEDPbuiltinSubscriptionWriterTOPICS_DETECTORSEDPbuiltinTopicsReaderTOPICS_ANNOUNCERSEDPbuiltinTopicsWriterPARTICIPANT_MESSAGE_READERBuiltinParticipantMessageReaderPARTICIPANT_MESSAGE_WRITERBuiltinParticipantMessageWriter红框内都是SPDP消息SEDPSEDP协议的目标是Participant间能发现彼此的writer和reader。用于SEDP的built-in Entities的QoS设置成reliable上图是DDSHelloWorldExample_first_pub.cap的消息流其中2个蓝色方框内的是SEDP消息红色线条标识的是A的publication信息发给B的过程绿色色线条标识的是B的subscription信息发给A的过程但是在第一个框框内HelloWorldTopic相关的reader和writer就完成了匹配。A的publication发给B的具体流程如下红色线条A的SEDPbuiltinPublicationsWriter发送heartbeat给B的SEDPbuiltinPublicationsReader告知它的history cache中有sample1firstAvaliableSeqNumber为1lastSeqNumber为1所以最新的sample的sequence number为1B收到heartbeat解析后发现A最新的change是sample1它没有收到过sample 1所以发送acknack 告知丢失了sample1bitmapBase1 numBits1 表示sample 1丢失A发送sample1给B告知它有一个针对HelloWorldTopic的publisher, 到这一步后A的publisher信息已经发送给到了B。由于A已经得到了B的subscriber消息所以A user_writer就可以开始往B发送心跳了。A发送heartbeat 告知最新的change为sample1B发送acknack告知期望sample2bitmapBase2 numBits0 表示sample 2丢失0次那就是说收到的最新的heartbeat的change为sample1 收到的最新的data也是sample1。 也就是expecting example2B的subscription发送给B的具体流程如下绿色线条B的SEDPbuiltinSubscriptionWriter发送heartbeat给A的SEDPbuiltinSubscriptionReader告知它的history cache中有sample1firstAvaliableSeqNumber为1lastSeqNumber为1所以最新的sample的sequence number为1A收到heartbeat解析后发现B最新的change是sample1它没有收到过sample 1所以发送acknack 告知丢失了sample1bitmapBase1 numBits1 表示sample 1丢失B发送sample1给A告知它有一个针对HelloWorldTopic的subscriberB发送heartbeat 告知最新的change为sample1A发送acknack告知期望sample2bitmapBase2 numBits0 表示sample 2丢失0次那就是说收到的最新的heartbeat的change为sample1 收到的最新的data也是sample1。 也就是expecting example2由于B只有一个用户定义的reader至此B的subscription发现流程完成。LivenessBuiltinParticipantMessageWriter发送的心跳消息如下。其作用暂时不清楚#静态发现采用静态服务发现的话SPDP过程是一样的但是不需要SEDP过程了取而代之的是通过在xml文件来配置对端的节点信息。publisherpqos.name(HelloWorldPublisher);pqos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocolfalse;pqos.wire_protocol().builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocoltrue;pqos.wire_protocol().builtin.discovery_config.static_edp_xml_config(file://HelloWorldSubscriber_static_disc.xml);participant_DomainParticipantFactory::get_instance()-create_participant(0,pqos);发送方需要用到配置的接收方的信息如下HelloWorldSubscriber_static_disc.xmlstaticdiscovery participant nameHelloWorldSubscriber/name reader userId3/userId entityId4/entityId topicNameHelloWorldTopic/topicName topicDataTypeHelloWorld/topicDataType topicKindNO_KEY/topicKind reliabilityQosRELIABLE_RELIABILITY_QOS/reliabilityQos /reader /participant /staticdiscovery运行./DDSStaticHelloWorldExample publishersubscriberpqos.name(HelloWorldSubscriber);pqos.wire_protocol().builtin.discovery_config.use_SIMPLE_EndpointDiscoveryProtocolfalse;pqos.wire_protocol().builtin.discovery_config.use_STATIC_EndpointDiscoveryProtocoltrue;pqos.wire_protocol().builtin.discovery_config.static_edp_xml_config(file://HelloWorldPublisher_static_disc.xml);participant_DomainParticipantFactory::get_instance()-create_participant(0,pqos);发送方需要用到配置的接收方的信息如下HelloWorldPublisher_static_disc.xmlstaticdiscovery participant nameHelloWorldPublisher/name writer userId1/userId entityId2/entityId topicNameHelloWorldTopic/topicName topicDataTypeHelloWorld/topicDataType topicKindNO_KEY/topicKind reliabilityQosRELIABLE_RELIABILITY_QOS/reliabilityQos /writer /participant /staticdiscovery运行./DDSStaticHelloWorldExample subscriberwireshark抓包分析没能看到没有SEDP消息了参考文档https://zhuanlan.zhihu.com/p/12663878689

相关新闻

APP逆向实战:从零解析视频流URL获取逻辑与安全协议分析

APP逆向实战:从零解析视频流URL获取逻辑与安全协议分析

最近在技术社区和开发者群里,经常看到有人讨论“APP逆向”能带来多少“收益”,甚至有些标题直接指向“拿下小单”。作为一个在移动安全领域摸爬滚打多年的开发者,我必须先泼一盆冷水:“APP逆向”的核心价值,从来不是“…

2026/8/20 21:49:06 阅读更多 →
mtproto-core 实战:10 行代码打造自动发送消息的 Telegram 机器人

mtproto-core 实战:10 行代码打造自动发送消息的 Telegram 机器人

mtproto-core 实战:10 行代码打造自动发送消息的 Telegram 机器人 【免费下载链接】mtproto-core Telegram API JS (MTProto) client library for Node.js and browser 项目地址: https://gitcode.com/gh_mirrors/mt/mtproto-core mtproto-core 是一个开源的…

2026/8/20 21:49:06 阅读更多 →
org-roam-server 文件服务与内联图片:如何在知识图谱中嵌入 PDF、视频与图像(终极指南)

org-roam-server 文件服务与内联图片:如何在知识图谱中嵌入 PDF、视频与图像(终极指南)

org-roam-server 文件服务与内联图片:如何在知识图谱中嵌入 PDF、视频与图像(终极指南) 【免费下载链接】org-roam-server A Web Application to Visualize the Org-Roam Database 项目地址: https://gitcode.com/gh_mirrors/or/org-roam-s…

2026/8/22 0:55:30 阅读更多 →

最新新闻

SAP MM采购申请筛选条件全解析:从基础字段到高级查询实战

SAP MM采购申请筛选条件全解析:从基础字段到高级查询实战

1. 项目概述:为什么需要深入理解采购申请的选择条件?在SAP MM模块的日常操作中,采购申请(Purchase Requisition)是物料需求计划(MRP)或用户手工创建的需求源头,它驱动着后续的采购订…

2026/8/23 2:27:57 阅读更多 →
数学建模竞赛:微分方程模型从入门到实战全解析

数学建模竞赛:微分方程模型从入门到实战全解析

1. 项目概述:微分方程在数学建模中的核心地位 如果你参加过数学建模竞赛,或者接触过任何需要描述动态变化过程的实际问题,那么“微分方程”这个词对你来说一定不陌生。它绝不仅仅是高等数学课本里一堆抽象的符号和复杂的解法,而是…

2026/8/23 2:27:57 阅读更多 →
CTR预估校准:从原理到工业实践,解决模型高估/低估问题

CTR预估校准:从原理到工业实践,解决模型高估/低估问题

1. 从一次线上事故说起:为什么CTR不准会“要命”去年我们团队上线了一个新的推荐策略,离线AUC指标涨了0.5个点,大家都很兴奋,觉得稳了。结果灰度放量不到10%,运营和产品经理的电话就快被打爆了:用户投诉首页…

2026/8/23 2:27:57 阅读更多 →
数据分析实战:AHP、K-means、SVM与熵权法四大算法核心解析与应用

数据分析实战:AHP、K-means、SVM与熵权法四大算法核心解析与应用

1. 从“拍脑袋”到“算出来”:为什么我们需要这些算法?干了这么多年数据分析,我见过太多项目在决策环节“翻车”。最常见的场景就是:一堆指标摆在面前,领导问“哪个方案最好?”,团队就开始各抒己…

2026/8/23 2:27:57 阅读更多 →
Java面试核心语法与实战要点解析

Java面试核心语法与实战要点解析

1. Java语法面试核心要点解析Java作为企业级开发的主流语言,其语法特性在面试中占据重要地位。根据近三年一线大厂面试统计,基础语法相关问题的出现频率高达78%,远超框架和算法类问题。掌握这些核心语法点不仅能通过面试,更能为实…

2026/8/23 2:27:57 阅读更多 →
C语言实现循环队列:从结构体设计到判空判满的完整指南

C语言实现循环队列:从结构体设计到判空判满的完整指南

最近在辅导几位刚入门数据结构的同学时,发现大家对“队列”这个基础但至关重要的数据结构,普遍存在理解上的断层。很多教程要么只讲抽象概念,要么代码片段零散,导致同学们自己动手实现时,总是卡在“结构体怎么设计”、…

2026/8/23 2:26:57 阅读更多 →

日新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/23 0:00:50 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/23 0:00:50 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/23 0:00:50 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/22 18:08:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/22 7:31:03 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →