其实连接方法有很多种,但不论是在整体架构上,部署难度上,都是构建虚拟局域网(VPN)形式比较方便。
## 准备服务器
首先当然你得有一台Linux服务器,并且拥有公网ip以及入网的控制权
在入网位置,配置ssh访问权限(0.0.0.0/0 所有位置 或者你自己的ip位置/32 <--推荐方式!安全)
然后安装WireGuard
```
sudo apt update
sudo apt install wireguard
```
并且使用一键安装脚本来快速配置:
```
wget https://git.io/wireguard -O wireguard-install.sh
sudo bash wireguard-install.sh
```
一般默认会帮你写好公网ip不过你要确认一下
端口建议不要使用默认的,容易被黑客程序扫接口,写一个比如52222 并且在你的服务器安全组放行 **UDP协议的52222**
Wiredguard协议主要通过udp实现。
还会让你输入以下这个目标设备的名称 随意按照你使用的需求命名
一般 你有几台设备就要跑几次这个脚本,来生成多份 `xxx.conf` 文件
这里注意 要把 `[Peer]`下面的`AllowedIPs` 这里后面改成上方 `[Interface]`当中`Address`的相同ip的网关
比如
```
[Interface] PrivateKey = <一串乱码,别动它>
Address = 10.7.0.2/24 # <--- 这是你的客户端一会的ip
DNS = 1.1.1.1 # (这行有没有无所谓,但如果有,确保格式对)
[Peer] PublicKey = <服务器的公钥>
Endpoint = <服务器公网IP>:51820
AllowedIPs = 10.7.0.0/24 # <--- 这是你应该寻找的网关地址 意义为允许10.7.0.0下全网段的访问
PersistentKeepalive = 25
```
在这个例子中这台服务器会在一会组成的局域网中位于10.7.0.1的位置
### (可选)多设备路由转发
一般这么配置后还差一步允许除了公网服务器以外的其他设备的互相通信输入以下指令
临时开启
```
sudo sysctl -w net.ipv4.ip_forward=1
```
永久开启
```
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
```
## 本地设备的准备
安装WireGuard
```
sudo apt install wireguard openresolv
```
把刚才配置得到的 `xxx.conf`文件中的内容 复制到你所需走公网联通的相应设备的 `/etc/wireguard/wg0.conf`当中 记得要修改`AllowedIPs`字段来确保这个虚拟局域网不和你本机局域网冲突
启动虚拟网卡
```
sudo wg-quick up wg
```
之后用 `ip a` 或者 `sudo wg` 来看连接情况是否连接上了
在你要连接的B设备上也如上走一遍 记得要用刚才生成的另一份文件,保证他们不是同一个虚拟局域网IP
## 连接!
在公网服务器输入(在公网配置不需要完整的ros2 只需要base即可)
```
fastdds discovery -i 0 -l 10.7.0.1
```
其他设备输入
```
export ROS_DISCOVERY_SERVER=10.7.0.1:11811
```
然后正常运行就可以了 下面各设备之间现在不仅可以利用ros2互相发送数据,因为现在他们在一个局域网下面,理论上互联网协议的其他形式数据传输方式也没问题
这个方式是Discovery Server 是配置起来最简单的方式了
经过测试,在服务器与本地延迟50ms的条件下 这个方式和公网服务器连接的延迟在59ms左右
也就是说理论上两台设备使用这个方式传送ros2消息的延迟在120ms左右 不过因为测试使用的aws香港的服务器,找一台延迟更低的本地服务器甚至ipv6服务器能做到更低的延迟。