文章目录
- [安装 DDS Router](#安装 DDS Router)
-
- [DDS Router 的真实依赖关系(关键)](#DDS Router 的真实依赖关系(关键))
- 安装必要系统依赖(一次性)
- [获取 DDS Router 源码(不走 Release)](#获取 DDS Router 源码(不走 Release))
-
-
- [1️⃣ 克隆源码(走 git,不走 tar.gz)](#1️⃣ 克隆源码(走 git,不走 tar.gz))
- [2️⃣ 切到 **稳定版本 2.1.x**](#2️⃣ 切到 稳定版本 2.1.x)
- 构建DDSRouter
- [方案:手动 clone + 本地安装 cmake_utils](#方案:手动 clone + 本地安装 cmake_utils)
- [在服务器创建 YAML 文件](#在服务器创建 YAML 文件)
-
- [1️⃣ 选择存放目录(推荐)](#1️⃣ 选择存放目录(推荐))
- [2️⃣ 创建 YAML 文件](#2️⃣ 创建 YAML 文件)
- [3️⃣ 粘贴以下 **完整可用示例**](#3️⃣ 粘贴以下 完整可用示例)
- [4️⃣ 保存并退出 vim](#4️⃣ 保存并退出 vim)
- 先把事实说清楚(现在不是操作问题)
- 关键认知纠正(非常重要)
-
- [Fast DDS 本身就支持 **跨网段数据通信**](#Fast DDS 本身就支持 跨网段数据通信)
- 现在唯一可行、工业上也常用的方案(重点)
- [方案:**Fast DDS 原生 TCP + Static Peers(无 Discovery Server、无 DDS Router)**](#方案:Fast DDS 原生 TCP + Static Peers(无 Discovery Server、无 DDS Router))
- 四、为什么这个方案在你这里是"唯一解"
- [**三台节点的 XML(可直接用)**](#三台节点的 XML(可直接用))
- [1️⃣ 服务器节点(只做 TCP 接入点)](#1️⃣ 服务器节点(只做 TCP 接入点))
- [2️⃣ 发送端](#2️⃣ 发送端)
- [3️⃣ 接收端](#3️⃣ 接收端)
-
相关文档:
FastDDS------DDSRouter安装和使用
我选择放弃了,无法使用fastdds进行跨网段通信,部署成本太高,条件不允许,资源有限,还是转为mqtt转发了,组网内使用fastdds吧,哎!
安装 DDS Router
不依赖 Docker、不依赖 GitHub Release、完全源码编译 DDS Router 的方案,严格针对:Alibaba Cloud Linux 3 / x86_64。
DDS Router 的真实依赖关系(关键)
DDS Router ≠ Fast DDS 工具
它是一个独立工程,但依赖:
Fast DDS (已经编成功)
Fast CDR
foonathan_memory
yaml-cpp
👉 前 3 个系统里已经有了
👉 现在只需要:yaml-cpp + DDS Router 源码
安装必要系统依赖(一次性)
bash
dnf install -y \
git \
cmake \
gcc-c++ \
make \
yaml-cpp-devel \
openssl-devel \
libatomic
确认 yaml-cpp:
bash
rpm -qa | grep yaml-cpp

获取 DDS Router 源码(不走 Release)
1️⃣ 克隆源码(走 git,不走 tar.gz)
bash
cd /opt
git clone https://github.com/eProsima/DDS-Router.git
cd DDS-Router
如果 GitHub 访问慢,可用镜像(备用):
bash
git clone https://hub.fastgit.org/eProsima/DDS-Router.git
2️⃣ 切到 稳定版本 2.1.x
bash
git checkout v2.1.0

构建DDSRouter
安装 colcon + vcs(你系统里默认没有)
bash
dnf install -y python3-pip
pip3 install -U colcon-common-extensions vcstool

方案:手动 clone + 本地安装 cmake_utils
单独 clone dev-utils(只拉这一个)
bash
cd /opt
git clone https://github.com/eProsima/dev-utils.git
切换到对应版本(非常重要)
DDS Router v2.1.0 对应 dev-utils v1.4.x
bash
cd /opt/dev-utils
git checkout v1.4.0

进入 cmake_utils 子项目
bash
cd /opt/dev-utils/cmake_utils
确认能看到文件
bash
ls CMakeLists.txt
创建构建目录并执行 cmake(关键)
bash
mkdir -p build
cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local

编译并安装
bash
make -j$(nproc)
make install

验证是否安装成功
bash
ls /usr/local/share/cmake_utils/cmake

在服务器创建 YAML 文件
1️⃣ 选择存放目录(推荐)
bash
mkdir -p /opt/dds_router
cd /opt/dds_router
2️⃣ 创建 YAML 文件
bash
vi dds_router.yaml
3️⃣ 粘贴以下 完整可用示例
适用于你当前三台节点
- 服务器:00.00.00.00
- 发送端:000.000.00.00
- 接收端:0000.00.00.000
yaml
version: v3.0
participants:
- name: router_server
kind: local
domain: 0
transport:
kind: udp
listening-addresses:
- ip: 0.0.0.0
port: 11811
whitelist:
- 00.00.00.00
- 00.00.00.00
routes:
- from: router_server
to: router_server
topics:
- name: "*"
logging:
verbosity: info
⚠️ 注意
- YAML 对缩进极其敏感,只能用空格
- 不要使用 Tab
4️⃣ 保存并退出 vim
text
Esc
:wq
Enter
先把事实说清楚(现在不是操作问题)
现在遇到的是 三重封锁叠加:
-
Docker Hub 被墙 / 限速
-
阿里云镜像仓库里
eProsima/ddsrouter是私有仓库requested access to the resource is denied是权限问题
-
DDS Router 源码链条已断(cpp_utils 不存在)
👉 结论:
在当前网络 / 系统条件下,DDS Router 无论"二进制 / docker / 源码"全部不可行
是 环境 + 官方发布策略共同导致的死路。
关键认知纠正(非常重要)
❌「跨网段 DDS = 一定要 DDS Router」
✅ 这是错误认知
Fast DDS 本身就支持 跨网段数据通信
前提 :
你必须 关闭 multicast + 使用 TCP/UDP 单播 + 手工指定 peer
也就是说:
Discovery Server / DDS Router 都不是"跨网段的唯一解"
现在唯一可行、工业上也常用的方案(重点)
方案:Fast DDS 原生 TCP + Static Peers(无 Discovery Server、无 DDS Router)
架构图(文字版)
发送端
|
| TCP 单播
v
服务器 / 中转机
|
| TCP 单播
v
接收端
- 不依赖 multicast
- 不依赖 discovery server
- 不依赖 dds router
- 100% 可控、可部署、可调试
四、为什么这个方案在你这里是"唯一解"
| 能力 | Discovery Server | DDS Router | Fast DDS TCP |
|---|---|---|---|
| 跨网段 | ❌ | ✅ | ✅ |
| 依赖外部组件 | 高 | 极高 | 无 |
| 受网络封锁影响 | 中 | 致命 | 无 |
| 可控性 | 低 | 高 | 中 |
| 你当前能跑 | ❌ | ❌ | ✅ |
三台节点的 XML(可直接用)
约定
- 服务器 IP:
00.00.00.00 - TCP 端口:
11811 - Domain:
0
1️⃣ 服务器节点(只做 TCP 接入点)
server.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<profiles>
<transport_descriptors>
<transport_descriptor>
<transport_id>tcp_server</transport_id>
<type>TCPv4</type>
<listening_ports>
<port>11811</port>
</listening_ports>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="server_participant" is_default_profile="true">
<rtps>
<useBuiltinTransports>false</useBuiltinTransports>
<userTransports>
<transport_id>tcp_server</transport_id>
</userTransports>
</rtps>
</participant>
</profiles>
</dds>
启动方式(你已有 Fast DDS):
bash
export FASTDDS_DEFAULT_PROFILES_FILE=/opt/fastdds/server.xml
./your_dds_server_app
2️⃣ 发送端
sender.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<profiles>
<transport_descriptors>
<transport_descriptor>
<transport_id>tcp_client</transport_id>
<type>TCPv4</type>
<remote_servers>
<RemoteServer>
<ip>00.00.00.00</ip>
<port>11811</port>
</RemoteServer>
</remote_servers>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="sender_participant" is_default_profile="true">
<rtps>
<useBuiltinTransports>false</useBuiltinTransports>
<userTransports>
<transport_id>tcp_client</transport_id>
</userTransports>
<builtin>
<avoid_builtin_multicast>true</avoid_builtin_multicast>
</builtin>
</rtps>
</participant>
</profiles>
</dds>
3️⃣ 接收端
receiver.xml(与 sender 完全一致,只改文件名即可)
xml
<?xml version="1.0" encoding="UTF-8"?>
<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<profiles>
<transport_descriptors>
<transport_descriptor>
<transport_id>tcp_client</transport_id>
<type>TCPv4</type>
<remote_servers>
<RemoteServer>
<ip>00.00.00.00</ip>
<port>11811</port>
</RemoteServer>
</remote_servers>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="receiver_participant" is_default_profile="true">
<rtps>
<useBuiltinTransports>false</useBuiltinTransports>
<userTransports>
<transport_id>tcp_client</transport_id>
</userTransports>
<builtin>
<avoid_builtin_multicast>true</avoid_builtin_multicast>
</builtin>
</rtps>
</participant>
</profiles>
</dds>