fastdds同一个服务器下Discovery Server环境部署
文章目录
- 第一步:安装fastdds
- 1. 更新系统并安装基础依赖
- 2. 下载并安装 FastDDS (二进制安装)
- 第一步:编译 foonathan_memory (内存分配器)
- 第二步:编译 Fast-CDR (序列化层)
- 第三步:编译 Fast-RTPS (即 Fast-DDS 核心)
- 第四步:环境变量与验证
- 3. 验证安装是否成功
- 第二步:配置阿里云安全组(关键)
- 第三步:编写服务器配置文件 (`server_config.xml`)
- 第四步:启动发现服务器
- 方式 A:使用 XML 配置文件启动(推荐)
- 方式 B:直接使用命令行参数(快速测试)
- 第五步:客户端(跨网段节点)如何连接?
- 1. 通过环境变量(最简单,适用于 ROS 2)
- 2. 通过客户端配置文件 (`client_config.xml`)
- 验证通信
- Discovery Server到底是什么
- 一、Discovery Server 的作用(明确)
- 二、为什么你会误以为它可以跨网段传输
- 三、DDS Router 的作用
- 关键点
- 四、是否需要重新配置
- 五、简单示意
- 六、结论
第一步:安装fastdds
首先得保证买了云服务器,推荐阿里云或者腾讯云
通过cat /etc/os-release查询服务器版本,根据对应版本询问chatai如何安装fastdds作为Discovery Server节点,以阿里云为例,使用的是Alibaba Cloud Linux(阿里云默认操作系统),输入上述指令后给出如下信息

这类系统使用的包管理器是 yum 或 dnf,而不是 apt。
请按照以下适配 CentOS/Aliyun Linux 的步骤重新操作:
1. 更新系统并安装基础依赖
在 CentOS 环境下,你需要先安装开发工具包和 CMake。
# 更新系统软件包列表
sudo yum update -y
# 安装开发工具(包括 gcc, g++, make 等)
sudo yum groupinstall "Development Tools" -y
# 安装 FastDDS 编译和运行所需的依赖
sudo yum install -y cmake3 python3 wget openssl-devel
注意:如果
cmake版本太低,可能需要使用cmake3命令。你可以通过cmake --version检查。
执行sudo yum update -y

执行sudo yum update -y成功

执行sudo yum groupinstall “Development Tools” -y

执行sudo yum groupinstall “Development Tools” -y成功

执行sudo yum install -y cmake3 python3 wget openssl-devel成功

2. 下载并安装 FastDDS (二进制安装)
由于 CentOS 官方库里通常没有 FastDDS,我们直接下载官方编译好的二进制包。
# 1. 下载二进制安装包(以 v2.14.4 为例)
wget https://github.com/eProsima/Fast-DDS/releases/download/v2.14.0/Fast-DDS-v2.14.0-Linux.tar.gz
# 2. 解压
tar -xzf eProsima_Fast-DDS-v2.14.4-Linux.tgz
# 3. 执行安装脚本
sudo ./install.sh
执行结果
1.下载二进制安装包(以 v2.14.0 为例)
执行下载二进制包失败,无法连接到git服务器,在当前可联网设备下载好之后(下载链接为:https://www.eprosima.com/component/ars/items/eprosima-fast-dds-2-14?Itemid=0&category_id=7),拷贝到服务器上scp C:UsersAMEDownloadseProsima_Fast-DDS-v2.14.4-Linux.tgz root@00.00.00.00:/root/

查看是否拷入成功ls /root/

2. 解压完成后目录如下

3.安装执行sudo ./install.sh失败,因为官方的 .tgz 包里并没有直接提供编译好的二进制文件(没有 bin 或 lib 目录),而是只提供了 src (源码)。
安装编译所需的依赖
CentOS 需要这些工具才能处理源码:
sudo yum install -y cmake3 gcc-c++ asio-devel tinyxml2-devel openssl-devel python3-devel

在 FastDDS 的旧版本或者某些发行包中,fastrtps 文件夹就是 FastDDS 的核心源码目录(因为 FastDDS 的前身叫 Fast-RTPS)。
fastddsgen 是用来通过 IDL 生成代码的工具(Java 编写),不是我们要编译的 C++ 核心库。
请按照以下顺序,严格执行这三部的编译安装。我们先搞定内存管理,再搞定序列化,最后编译 DDS 核心。
第一步:编译 foonathan_memory (内存分配器)
这是 FastDDS 必须的底层依赖。
cd /root/fastdds_setup/src/foonathan_memory_vendor
mkdir build && cd build
cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j2
sudo make install
第二步:编译 Fast-CDR (序列化层)
cd /root/fastdds_setup/src/fastcdr
mkdir build && cd build
cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local
make -j2
sudo make install
第三步:编译 Fast-RTPS (即 Fast-DDS 核心)
这是最关键的一步,也就是你找了很久的那个目录。
cd /root/fastdds_setup/src/fastrtps
mkdir build && cd build
# 这里的 -DCOMPILE_TOOLS=ON 会生成我们要用的 fastdds 命令行工具
cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCOMPILE_TOOLS=ON
make -j2
sudo make install
第四步:环境变量与验证
编译完成后,执行以下操作让系统识别:
# 刷新动态库
sudo ldconfig
# 验证命令是否可用
fastdds --version
前两步都没问题,执行到第三步make -j2的时候报错,原因是Asio 版本不兼容 问题。
解决方案:发现好像和前两步都没多大关系,只要rtps编过就行,主要还是系统中asio版本问题,困扰我好几天,试了好多方法,最后只能改系统的asio版本,下载之后拷贝到指定路径下再改变环境变量
下载新版的asio wget https://github.com/chriskohlhoff/asio/archive/refs/tags/asio-1-24-0.tar.gz

拷贝到指定路径下并验证是否设置成功,看到102400就是成功了同时看到"/usr/local/include"路径在最上方
cp -r asio-asio-1-24-0/asio/include/asio /usr/local/include/
cp asio-asio-1-24-0/asio/include/asio.hpp /usr/local/include/
grep -R "ASIO_VERSION" -n /usr/local/include/asio/version.hpp
echo | g++ -E -x c++ - -v 2>&1 | grep include

成功后再回去编译
cd /root/fastdds_setup/src/fastrtps
rm -rf build
mkdir build
cd build
cmake ..
> -DCMAKE_BUILD_TYPE=Release
> -DBUILD_SHARED_LIBS=ON
> -DBUILD_TESTS=OFF
> -DBUILD_DOCUMENTATION=OFF
make -j$(nproc)

3. 验证安装是否成功
安装完成后,在build目录下执行以下命令:
./tools/fds/fast-discovery-server-1.0.1 --help
如果能看到版本号输出(例如 fast-discovery-server-1.0.1),说明安装成功!

运行 测试指令验证服务是否可以正常使用
./tools/fds/fast-discovery-server-1.0.1
--server-id=0
--ip-address=0.0.0.0
--port=11811

第二步:配置阿里云安全组(关键)
由于 Discovery Server 默认使用 UDP 协议 和 11811 端口,你必须在阿里云控制台开放权限:
- 登录阿里云 ECS 管理控制台。
- 找到该实例,进入“安全组”配置。
- 添加“入方向”规则:
- 协议类型:UDP(如果配置为 TCP 发现则选 TCP)。
- 端口范围:
11811/11811。 - 授权对象:
0.0.0.0/0(或指定客户端所在的公网 IP 以增强安全性)。
我用的是别人借来的服务器,让他帮忙配置了一下白名单端口号11811没买没法截图哈哈
第三步:编写服务器配置文件 (server_config.xml)
虽然可以通过命令行直接启动,但使用配置文件可以更精确地控制行为(如多网卡绑定)。
在服务器上创建文件 fastdds_server.xml:
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
<participant profile_name="server_profile">
<rtps>
<builtin>
<discovery_config>
<discoveryProtocol>SERVERdiscoveryProtocol>
discovery_config>
<metatrafficUnicastLocatorList>
<locator>
<udpv4>
<address>0.0.0.0address>
<port>11811port>
udpv4>
locator>
metatrafficUnicastLocatorList>
builtin>
<prefix>44.53.00.5f.45.50.52.4f.53.49.4d.41prefix>
rtps>
participant>
profiles>
第四步:启动发现服务器
在阿里云服务器终端执行:
方式 A:使用 XML 配置文件启动(推荐)
# -i 指定 Server ID (0-255),-c 指定配置文件
fastdds discovery -i 0 -c fastdds_server.xml
方式 B:直接使用命令行参数(快速测试)
如果你不想写 XML,可以直接运行:
# 监听 0.0.0.0 端口 11811
fastdds discovery -i 0 -l 0.0.0.0 -p 11811
后台运行建议:
使用 nohup 或 screen 保证关闭终端后服务不停止:
nohup fastdds discovery -i 0 -l 0.0.0.0 -p 11811 > dds_server.log 2>&1 &
第五步:客户端(跨网段节点)如何连接?
在你的本地机器或其他网段的节点上,你只需要告诉它服务器的公网 IP 00.00.00.00。
1. 通过环境变量(最简单,适用于 ROS 2)
export ROS_DISCOVERY_SERVER=00.00.00.00:11811
# 然后启动你的程序
ros2 run demo_nodes_cpp talker
2. 通过客户端配置文件 (client_config.xml)
如果是纯 FastDDS 应用,配置如下:
<discovery_config>
<discoveryProtocol>CLIENTdiscoveryProtocol>
<discoveryServerList>
<RemoteServer locator_registration_indicator="true">
<metatrafficUnicastLocatorList>
<locator>
<udpv4>
<address>00.00.00.00address> <port>11811port>
udpv4>
locator>
metatrafficUnicastLocatorList>
RemoteServer>
discoveryServerList>
discovery_config>
验证通信
在阿里云服务器上,你可以观察 fastdds discovery 的输出日志。当客户端连接成功时,控制台通常会打印出新加入的 Participant 信息。
注意点:
- NAT 穿透:如果你的客户端在公司内网,通常不需要额外设置,因为客户端是主动向外访问公网 IP 建立的连接(Outbound)。
- 防火墙:除了阿里云安全组,也要检查服务器内部的
iptables或ufw是否允许了 11811 端口。
Discovery Server到底是什么
一、Discovery Server 的作用(明确)
-
功能:Discovery Server 只负责发现。
- 让不同网段、不同子网的 DDS Participant 互相知道对方存在。
- 解决的是 Discovery 阶段跨网段的问题,尤其是广播/多播在 WAN/云环境不可达时。
-
不做的事情:
- 不转发用户数据(Topic 数据)
- 不做访问控制或带宽控制
- 不提供消息监控
所以你启动了 Discovery Server,客户端可以“发现对方”,但是 实际消息(发布/订阅的数据)仍然走点对点连接。如果发送端和接收端的 UDP/TCP 不能直连,消息就发不通。
✅ 简单类比:
- Discovery Server = “门牌识别服务”,告诉各方“我是谁、在哪”,但不搬东西。
- 数据还要走各自的网络路径,Discovery Server 不管。
二、为什么你会误以为它可以跨网段传输
- DDS 默认使用 UDP 多播做发现和数据
- 在同一个子网内,多播可以直接到达其他节点
- 跨网段:Discovery Server 解决了“发现不到对方”的问题
- 但用户数据仍然需要 点对点 UDP/TCP
- 如果网络阻塞/防火墙不通,你的数据会丢
所以你感觉“跨网段”,只是 Discovery 阶段跨网段发现了,而真正数据 还没穿过服务器。
三、DDS Router 的作用
-
DDS Router = 真正的中继/转发节点
-
功能:
- 接收一个网段的 DDS 数据,转发到另一个网段
- 可以限制哪些 Topic / Participant 可以通过
- 可以监控数据流、带宽、在线客户端
-
本质是 数据代理,Discovery Server 无法替代
关键点
| 项目 | Discovery Server | DDS Router |
|---|---|---|
| 跨网段发现 | ✅ | ✅ |
| 数据转发 | ❌ | ✅ |
| Topic/Participant 控制 | ❌ | ✅ |
| 消息流监控 | ❌ | ✅ |
四、是否需要重新配置
-
如果你 只用 Discovery Server:
- 不用改客户端,只能发现对方
- 不能保证数据通信
- 不能控制谁可通谁不可
-
如果你 使用 DDS Router:
- 服务器端需要安装 Router 并配置 YAML 文件
- 客户端需要改成连接 Router 的 IP(而不是直接 P2P 或 Discovery Server)
- 你可以实现跨网段传输 + 访问控制 + 监控
五、简单示意
发送端
|
| 发现消息 -> Discovery Server
|
v
接收端
实际数据:
- 如果 P2P 可达 → 数据直接发给对方
- 如果 P2P 不可达 → 数据丢失
使用 DDS Router:
发送端 → Router → 接收端
Router:
- 代理所有 Topic
- 可以限制哪些 Topic / IP 可通
- 可以监控消息流量
六、结论
-
Discovery Server 解决发现问题,不是数据中继
-
跨网段传输 + 控制 + 监控 必须使用 DDS Router
-
使用 Router 需要:
- 服务器端运行 Router 并配置 YAML
- 客户端指向 Router(而不是直接 P2P 或只连接 Discovery Server)









