1. 概述
Eclipse Cyclone DDS 采用基于 XML Schema (XSD) 的配置文件机制,允许用户在不修改源代码或重新编译的情况下,精细控制 DDS 运行时的网络行为、发现策略及性能参数。该机制遵循声明式配置原则,确保配置的一致性与合法性。
2. 配置文件加载机制
Cyclone DDS 在启动时按以下优先级顺序查找并加载配置文件:
2.1 环境变量 (最高优先级)
通过设置 CYCLONEDDS_URI 环境变量指定配置源:
本地文件路径:
bashexport CYCLONEDDS_URI=file://path/to/cyclonedds.xml # 或使用相对路径 export CYCLONEDDS_URI=file://./cyclonedds.xml网络资源 URL:
bashexport CYCLONEDDS_URI=https://example.com/configs/cyclonedds_prod.xml直接嵌入内容:
部分场景下可直接传入 XML 字符串(具体取决于实现版本)。
2.2 默认位置
若未设置环境变量,系统将尝试在标准路径查找名为 cyclonedds.xml 的文件。常见位置包括:
/etc/cyclonedds.xml- 用户主目录
2.3 代码指定 (C API)
在使用 C API 创建参与者 (dds_create_participant) 时,可通过参数字符串覆盖全局配置。
3. XML 结构规范
配置文件根元素为 <CycloneDDS>,需声明正确的命名空间及 Schema 位置以启用编辑器智能提示与校验。
<CycloneDDS xmlns="https://cdds.io/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain id="any">
<!-- 配置内容 -->
</Domain>
</CycloneDDS> 注:xsi:schemaLocation 指向官方 XSD 文件,用于验证语法正确性。
4. 核心配置模块详解
有关配置设置(以及每个参数的默认值)的完整列表,请参阅配置文件参考 。
4.1 通用行为控制 (<General>)
控制 DDS 的全局传输行为。
| 配置项 | 类型 | 说明 | 示例值 |
|---|---|---|---|
AllowMulticast | 布尔/枚举 | 控制是否允许 UDP 多播。设为 false 可强制单播,适用于受限网络。 | true, false, default |
MaxMessageSize | 整数+单位 | 单个 RTPS 消息最大大小,超出部分将分片。 | 65536B, 1MB |
MaxRecvMessageSize | 整数+单位 | 接收缓冲区的最大消息大小。通常应大于等于 MaxMessageSize。 | 1MB |
EnableUDPTransmission | 布尔 | 是否启用 UDP 传输协议。 | true, false |
EnableTCPPort | 整数 | 若使用 TCP 传输,指定监听端口。 | 7400 |
示例:
<General>
<AllowMulticast>false</AllowMulticast>
<MaxMessageSize>1MB</MaxMessageSize>
<EnableUDPTransmission>true</EnableUDPTransmission>
</General> 4.2 网络接口绑定 (<Network>)
指定绑定的网络接口,适用于多网卡环境。
autodetermine(布尔): 默认为true自动选择;设为false需手动指定。address(IP): 当自动检测关闭时,指定绑定的单播 IP。multicast(IP): 指定多播通信使用的接口 IP。
示例:
<Network>
<autodetermine>false</autodetermine>
<address>192.168.1.100</address>
</Network> 4.3 发现机制 (<Discovery>)
控制节点间的发现方式,是跨子网或禁用多播环境下的关键配置。
Peers: 显式指定对等节点 IP 列表,用于静态发现。ParticipantIndex: 固定内置端点 GUID 的索引。MaxAutoPeerIndex: 自动发现 Peer 的最大索引值。
示例(静态指定 Peer):
<Discovery>
<Peers>
<Peer Address="192.168.1.20"/>
<Peer Address="192.168.1.21"/>
</Peers>
</Discovery> 4.4 共享内存加速 (<SharedMemory>)
启用 Eclipse Iceoryx 以实现同机进程间零拷贝通信。
- 前提条件:系统已安装 Iceoryx 库,且 Cyclone DDS 编译时开启
-DENABLE_ICEORYX=ON。 Enable(布尔): 设为true启用。Locator(字符串): 定位策略,通常为auto(基于 MAC 地址生成标识)。
示例:
<SharedMemory>
<Enable>true</Enable>
<Locator>auto</Locator>
</SharedMemory> 4.5 日志与调试 (<Tracing>)
控制内部日志输出,用于故障排查。
OutputFile: 日志文件路径,默认为stderr。Verbosity: 详细程度等级。- 0: Fatal, 1: Error, 2: Warning, 3: Config, 4: Info, 5: Debug, 6: Trace.
示例:
<Tracing>
<OutputFile>/tmp/cyclonedds.log</OutputFile>
<Verbosity>debug</Verbosity>
</Tracing> 4.6 兼容性调整 (<Compatibility>)
用于解决与其他 DDS 实现(如 RTI Connext)的互操作问题。
AssumeRtiHasPmdEndpoints: 布尔值,假设对方拥有 PMD 端点。StandardsConformance: 控制对 DDS 标准的遵循严格度。
5. 综合配置示例
以下示例展示了一个生产环境的配置:禁用多播、使用静态发现、启用共享内存及详细日志。
文件名: cyclonedds_advanced.xml
<CycloneDDS xmlns="https://cdds.io/config"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain id="any">
<General>
<AllowMulticast>false</AllowMulticast>
<MaxMessageSize>2MB</MaxMessageSize>
<MaxRecvMessageSize>2MB</MaxRecvMessageSize>
</General>
<Network>
<address>192.168.10.50</address>
</Network>
<Discovery>
<Peers>
<Peer Address="192.168.10.51"/>
<Peer Address="192.168.10.52"/>
</Peers>
</Discovery>
<SharedMemory>
<Enable>true</Enable>
</SharedMemory>
<Tracing>
<OutputFile>/var/log/cyclonedds.log</OutputFile>
<Verbosity>info</Verbosity>
</Tracing>
</Domain>
</CycloneDDS> 加载方式:
export CYCLONEDDS_URI=file:///path/to/cyclonedds_advanced.xml
./your_dds_application 6. 调试与验证
6.1 语法验证
使用 xmllint 工具校验 XML 是否符合官方 XSD:
xmllint --noout --schema https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd cyclonedds.xml 若输出 cyclonedds.xml validates,则格式正确。
6.2 配置加载确认
- 将
<Tracing>、<Verbosity>设置为config(3) 或更高。 - 启动应用,检查日志开头。系统通常会打印当前加载的配置摘要(如多播状态、共享内存状态等)。
6.3 共享内存生效验证
- 日志检查:在
info或更高 verbosity 下,搜索 "Iceoryx" 或 "SHM" 关键字,确认出现初始化成功信息。 - 文件系统检查:运行
ls -la /dev/shm | grep iox,若存在iox_开头的文件,表明共享内存段已创建。 - 网络抓包:在同机运行发布/订阅者,使用
tcpdump监听端口。若共享内存生效,数据面流量应消失(仅保留少量发现流量)。
6.4 常见问题排查
- XML 解析失败:检查标签闭合、属性引号及命名空间声明。
- 配置不生效:确认
CYCLONEDDS_URI在进程启动前已导出。若在 ROS 2 环境中,需在source setup.bash后设置。 - 共享内存无法启用:
- 确认 Iceoryx 库已安装 (
ldd your_app | grep iceoryx)。 - 确认 Cyclone DDS 编译时启用了
ENABLE_ICEORYX。
- 确认 Iceoryx 库已安装 (
7. 总结
Cyclone DDS 的 XML 配置机制将网络拓扑、传输协议及性能参数从代码中解耦。通过合理配置,可实现:
- 环境适配:同一二进制文件适应开发(多播)、生产(单播+静态 Peer)等不同网络环境。
- 性能优化:灵活启用共享内存或调整缓冲区,无需重新编译。
- 维护便捷:集中管理分布式系统的通信策略。