尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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
RELATED

相关推荐

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

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

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

📅 2026/10/28 14:56:37
POLARIS 背后的训练引擎 verl:HybridFlow 架构与 3D-HybridEngine 解析

POLARIS 背后的训练引擎 verl:HybridFlow 架构与 3D-HybridEngine 解析

POLARIS 背后的训练引擎 verl:HybridFlow 架构与 3D-HybridEngine 解析 【免费下载链接】POLARIS Scaling RL on advanced reasoning models 项目地址: https://gitcode.com/gh_mirrors/polaris34/POLARIS POLARIS 背后的训练引擎 verl:HybridFlo…

📅 2026/10/9 0:25:26
org-roam-server 三重视界完全指南:数据库网络、缓冲区网络与文件浏览器

org-roam-server 三重视界完全指南:数据库网络、缓冲区网络与文件浏览器

org-roam-server 三重视界完全指南:数据库网络、缓冲区网络与文件浏览器 【免费下载链接】org-roam-server A Web Application to Visualize the Org-Roam Database 项目地址: https://gitcode.com/gh_mirrors/or/org-roam-server 如果你正在用 Emacs 的 Org…

📅 2026/10/3 12:17:20
MORE NEWS

更多资讯

📰

51单片机红外遥控计算器:时序解码、状态机与动态扫描

简介:面向51单片机初学者、课程设计学生与红外通信入门者的红外遥控计算器程序文档,围绕TC9012遥控器解码、数码管动态显示与四则运算展开,可用于单片机课程实验、毕业小项目或遥控交互练习。压缩包仅含1个doc文件,约245KB&#x…

📰

MAI Gateway:制造业AI落地的协议穿透与实时调度中间件

1. 什么是MAI Gateway?它真能撬动制造业的AI落地瓶颈?“MAI Gateway”这个词最近在工业自动化圈子里被反复提起,但很多人第一次听到时,下意识反应是:“又一个带AI前缀的新概念?”——我去年在苏州一家做汽车…

📰

CH340在Ubuntu 22.04下的驱动配置与故障排查全指南

1. 为什么一块十几块钱的USB转串口板,能让老手也翻车手里有块CH340的USB转串口小板,插上Ubuntu 22.04的机器,ls /dev/ttyUSB*敲下去,什么都没有。这种场景我见过太多次了,不夸张地说,十个在Linux下折腾单片…

📰

ESP8266/ESP32远程控制实战:blinker库避坑与稳定性优化

远程控制这件事,说穿了就是把“开关”从手边挪到千里之外。早些年做物联网demo,大家习惯自己搭一套服务端、写一套协议、再配个App,光是打通链路就能耗掉一周。后来blinker这类国内物联网平台把接入层做薄了,ESP8266/ESP32这类模组…

📰

Superpowers:给AI编程装上“大脑”,让代码从能跑到可靠

最近AI编程圈子讨论最热的词,除了Codex、Claude Code这些工具本身,就是Superpowers了。我最早看到这个名字是在海外一些编程社区的分享帖里,很多人把它称作“给AI代理装上大脑”的提示词框架。实际用了一段时间之后,我的感受相当直…

📰

JDK 1.8 + Tomcat 7 外网访问配置全指南

简介:本资源是一份面向网页开发初学者与个人网站爱好者的实操指南,聚焦“如何让本地搭建的网站被外网访问”这一典型需求,解决开发测试、作品展示、远程协作等场景下的内网穿透难题。文档以Word格式(.doc)单文件呈现&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬