flowchart TB
subgraph "应用层"
DP[DomainParticipant<br/>域管理容器]
PUB[Publisher<br/>发布者分组]
SUB[Subscriber<br/>订阅者分组]
DW[DataWriter<br/>数据写入]
DR[DataReader<br/>数据读取]
TOP[Topic<br/>通信主题]
DP -->|持有| PUB
DP -->|持有| SUB
DP -->|持有| TOP
PUB -->|持有| DW
SUB -->|持有| DR
DW -.->|关联| TOP
DR -.->|关联| TOP
end
subgraph "DDS层"
DDS_API[DDS标准API实现]
DCPS[DCPS模型<br/>数据为中心]
QOS[QoS策略管理<br/>22+种策略]
DP -.->|使用| DDS_API
DW -.->|配置| QOS
DR -.->|配置| QOS
end
subgraph "RTPS层"
RTPS[RTPS协议实现]
WH[WriterHistory<br/>发送缓存]
RH[ReaderHistory<br/>接收缓存]
PDP[PDP<br/>参与者发现]
EDP[EDP<br/>端点发现]
TA[传输抽象接口]
DW -.->|调用| RTPS
DR -.->|调用| RTPS
RTPS --> WH
RTPS --> RH
RTPS --> PDP
RTPS --> EDP
RTPS --> TA
end
subgraph "传输层"
UDP[UDP传输]
TCP[TCP传输]
SHM[共享内存SHM]
ZC[零拷贝传输]
TA --> UDP
TA --> TCP
TA --> SHM
TA --> ZC
end
subgraph "安全层<br/>可选"
AUTH[身份认证]
AC[访问控制]
ENC[数据加密]
RTPS -.->|插件化| AUTH
RTPS -.->|插件化| AC
RTPS -.->|插件化| ENC
end
分层功能说明(5层)
| 层级 | 核心职责 | 关键组成 |
|---|
| 应用层 | 管理DDS实体生命周期,提供应用编程接口 | DomainParticipant持有Publisher/Subscriber/Topic;Publisher持有DataWriter;Subscriber持有DataReader;DataWriter/DataReader关联Topic |
| DDS层 | 实现OMG DDS标准规范,提供数据为中心通信能力和服务质量策略 | DDS标准API封装、DCPS发布订阅模型、22+种QoS策略配置与管理 |
| RTPS层 | 实现RTPS有线协议,处理数据序列化、历史缓存管理和节点自动发现 | RTPS协议核心实现、WriterHistory/ReaderHistory缓存机制、PDP参与者发现协议、EDP端点发现协议、传输层抽象接口 |
| 传输层 | 提供底层网络通信能力,支持多种传输协议适配 | UDPv4/v6传输、TCPv4/v6传输、共享内存SHM传输、零拷贝传输优化 |
| 安全层 | 基于DDS-Security规范提供安全机制,可选插件化加载 | 身份认证插件、访问控制插件、数据加密插件、安全审计日志 |
Day1 学习目标:环境就绪 + 基础Pub/Sub + 理解分层架构
1. 快速自检清单
| 检验项 | 通过标准 | 状态 |
|---|
| 能画出架构图 | 不看书能画出5层结构及关系 | ⬜ |
| 能定位代码 | 给定一个功能,知道在哪层找代码 | ⬜ |
| 能解释数据流 | 从write()到网卡,能说出经过哪些层 | ⬜ |
| 能处理错误 | 通信失败时,知道从哪层开始排查 | ⬜ |
2. 分层理解深度自测
Level 1 - 知道有什么(基础达标)
应用层 → DDS层 → RTPS层 → 传输层 → 安全层
Level 2 - 知道怎么用(验证点)
| 场景 | 你该知道 |
|---|
| 创建Participant | 调用DomainParticipantFactory,内部初始化RTPSParticipant |
| 设置QoS | 修改DDS层策略,最终影响RTPS层行为(如Reliable→StatefulWriter) |
| 选择传输协议 | 修改RTPS层Transport配置,底层切换UDP/TCP/SHM |
| 启用安全 | 加载安全插件,RTPS层在发送前加密数据 |
Level 3 - 知道为什么(进阶验证)
DomainParticipant* dp = DomainParticipantFactory::create_participant(...);
DataWriter* writer = publisher->create_datawriter(topic, qos);
## 3. Day2 实战验证任务
### 3.1 验证1:断点跟踪数据流
在pub代码里`write()`处打断点,逐层进入:
```mermaid
DataWriter::write()
→ DDS层序列化
→ RTPSWriter::new_change()
→ HistoryCache::add_change()
→ Transport::send()
3.2 验证2:修改配置观察行为
| 修改配置 | 预期观察 | 验证理解 |
|---|
QoS改为BEST_EFFORT | Wireshark抓包看是否无ACK | 理解Reliability在RTPS层实现 |
| 改用SHM传输 | /dev/shm下出现共享内存文件 | 理解传输层可替换 |
| 增大History深度 | 进程内存占用增加 | 理解HistoryCache作用 |
3.3 验证3:故意制造错误
五、理解标准总结
真理解 = 能正向构建 + 能反向排查 + 能横向扩展
| 能力 | 说明 |
|---|
| 正向构建 | 给我需求,知道从哪层开始写代码 |
| 反向排查 | 给我bug,知道从哪层开始调试 |
| 横向扩展 | 给我新协议/新需求,知道改动哪层不影响其他 |