DDS RTPS

张开发
2026/4/20 15:01:53 15 分钟阅读

分享文章

DDS RTPS
1 发现阶段1.1 基础概念1.1.1 RTPS 的层级结构Domain域└── Participant参与者├── DataWriter写端点├── DataWriter├── DataReader读端点└── DataReader三层各司其职Domain域- 逻辑隔离单元用一个整数 domainId 标识比如 0、1、2- 相同 domainId 的 Participant 才能互相通信不同域完全隔离- 它本身不是实体只是一个分组规则Participant参与者- 一个应用进程里的 DDS 实体容器是网络上可寻址的单位- 拥有全局唯一的 GuidPrefixGUID 的前 12 字节- 持有自己的单播/多播地址Locator- 管理它下面所有的 EndpointEndpoint端点 DataWriter / DataReader- 真正收发用户数据的实体- 每个 Endpoint 有自己的 EntityIdGUID 的后 4 字节- 完整 GUID Participant 的 GuidPrefix Endpoint 的 EntityIdGUID GuidPrefix EntityId- Writer 和 Reader 通过 Topic 类型 QoS 进行匹配1.1.2 发现阶段谁在哪一步做什么发现分两个阶段严格有先后顺序阶段一SPDP — 发现 ParticipantParticipant A Participant B| ||-- DATA(p) -- 多播地址 (周期性) ---------||------------- 多播地址 (周期性) -- DATA(p)-|| || 双方各自记录对方的 GuidPrefix、 || 单播地址、租约时长等 || |- 谁发 Participant- 发什么 DATA(p)内容是 SPDPdiscoveredParticipantData- 发给谁 预定义的多播地址同一 Domain 内所有 Participant 都监听- 怎么发 周期性发送间隔可配置- 目的 让大家知道网络上有哪些 Participant它们的地址在哪- 使用的内置端点 SPDPbuiltinParticipantWriter / SPDPbuiltinParticipantReader阶段二SEDP — 发现 EndpointParticipant A Participant B|--- DATA(w) -- 单播给 B: 我有 Writer1 --||--- DATA(r) -- 单播给 B: 我有 Reader1 --|| ||-- DATA(w) --- 单播给 A: 我有 Writer2 ---||-- DATA(r) --- 单播给 A: 我有 Reader3 ---|| || 双方各自比对 Topic、类型、QoS || → Writer1 和 Reader3 匹配成功 || |- 谁发 还是 Participant但代表的是它下面的各个 Endpoint- 发什么 DATA(w) 通告 WriterDATA(r) 通告 Reader- 发给谁 SPDP 阶段已发现的 Participant 的单播地址不再是多播- 什么时候发 SPDP 发现新 Participant 后触发之后每次本地新增/删除 Endpoint 也会发- 目的 交换端点信息让双方知道对面有哪些 Writer/Reader进而做匹配- 使用的内置端点- SEDPbuiltinPublicationsWriter/Reader — 交换 Writer 信息- SEDPbuiltinSubscriptionsWriter/Reader — 交换 Reader 信息三、总结对照层级 发现协议 发的消息 传输方式 做的事─────────────────────────────────────────────────────────Domain 无 无 无 只是隔离边界Participant SPDP DATA(p) 多播 我在这里地址是xxxEndpoint SEDP DATA(w/r) 单播 我有这些读写端点Topic和QoS是xxx─────────────────────────────────────────────────────────↓匹配成功 → 建立通信★ Insight ─────────────────────────────────────- 为什么要分两阶段 因为多播开销大。SPDP用多播只解决谁在网上这一个问题剩下的端点细节全走单播减少网络负担- SPDP 是持续的 即使发现完成DATA(p) 也会周期性发送用来维持租约lease。如果超过leaseDuration 没收到对方的 DATA(p)就认为对方掉线- SEDP 是事件驱动的 发现新 Participant 时触发一次全量交换之后只在 Endpoint 增删时增量通告─────────────────────────────────────────────────在 RTPS 协议中DATA(p) 是一种特殊的 DATA 子消息Submessage其中 (p) 代表 Participant。1.1.3 DATA子消息1.1.3.1| 子消息 | 含义 | 用途 ||--------|------|------|| **DATA(p)** | Participant Data | SPDP简单参与者发现协议中广播参与者信息 || **DATA(w)** | Writer Data | SEDP简单端点发现协议中通告 DataWriter 端点 || **DATA(r)** | Reader Data | SEDP 中通告 DataReader 端点 || **DATA** | User Data | 传输用户层的实际业务数据 |1.1.3.2 DATA(p)是 SPDPbuiltinParticipantWriter 发的对端由 SPDPbuiltinParticipantReader 接收。每个 DDS Participant 启动后会通过 SPDP 周期性地向预定义的多播地址发送 DATA(p) 消息内容是 SPDPdiscoveredParticipantData包含参与者的 GUID、协议版本、Vendor ID、默认单播/多播Locator、租约时长leaseDuration等其他参与者收到后就能发现该参与者的存在进而触发 SEDP 阶段的端点匹配一、 步骤1. 每个 Participant 上线后周期性组播SPDP DATA(p)初始阶段: 短间隔快发 (尽快被发现)之后: 长间隔慢发 (维护存在 供后来者发现)切换依据: 时间与匹配无关持续整个生命周期直到退出2. 收到新的远端 DATA(p) 后:单播回发自己的 DATA(p) (快速完成双向发现)从对端 DATA(p) 中提取: locator builtinEndpointSet3. 双方互知后无条件进入 SEDP:交换各自的 DataWriter / DataReader 端点信息通过 HEARTBEAT / ACKNACK / DATA 可靠传输4. SEDP 信息收齐后本地执行匹配 (Matching):Topic 名称相同Type 名称兼容QoS 策略兼容(如 Reliability, Durability 等)三者全部满足 → 建立 Writer↔Reader 关联任一不满足 → 不关联但 SEDP 信息仍保留5. 匹配成功后用户数据传输开始二、 简单理解整个发现流程Participant A Participant B|--- DATA(p) 多播广播 ---------| (SPDP: 我在这里!)|-------- DATA(p) 多播广播 ----| (SPDP: 我也在这里!)|--- DATA(w) / DATA(r) -------| (SEDP: 我有这些端点)|-- DATA(w) / DATA(r) --------| (SEDP: 我也有这些端点)| 匹配成功开始通信 | (DATA: 业务数据交换)三、例子组播一上线快速发几包然后进入周期发送INFO_TS: Timestampt子消息时间戳0x09 DATA0x15现在分析DATA的内容

更多文章