Cyclone DDS 查看CYCLONEDDS_URI 环境变量的值以找到其配置文件。您可以做的是在计算机上的某个位置创建一个 XML 文件,并将其路径放入该环境变量中。例如,在 Linux 上:
export CYCLONEDDS_URI=/path/to/cdds.xml
或在Windows上(“cmd”,我不知道如何在powershell中执行):
set "CYCLONEDDS_URI=c:/path/to/cdds.xml"
Windows 的引号有点棘手,这似乎工作正常。然后,当您启动应用程序时,Cyclone DDS 将读取该文件并应用其中的设置。当然你也需要知道放什么。
为此,了解一些有关您正在使用的网络的信息会很有用。在一个网络中,这一切都无需任何配置即可工作,因为 UDP/IP 多播在单个网络中以半神奇的方式工作。如果有多个网络,则中间有一个路由器,这些路由器通常配置为不路由多播流量。
这意味着您基本上有两种选择:
- 将路由器配置为在网络之间路由多播流量(尤其是 DDS 默认使用的 239.255.0.1 地址)。如果可行,则一切就绪,无需在 Cyclone DDS 中进行任何配置。
- 禁用多播,而是在配置文件中列出要与之通信的机器的主机名/IP 地址。您仍然需要一个愿意将流量从一个网络路由到另一个网络的路由器,但这通常不是单播数据包的问题。 (例如,如果您可以 ping 它或远程登录它,那很好。)
对于 (2),类似:
<CycloneDDS>
<Domain>
<General>
<AllowMulticast>false</AllowMulticast>
</General>
<Discovery>
<ParticipantIndex>auto</ParticipantIndex>
<Peers>
<Peer Address="ip-of-node-1" />
<Peer Address="ip-of-node-2" />
<Peer Address="ip-of-node-3" />
/Peers>
</Discovery>
</Domain>
</CycloneDDS>
应该可以工作(显然用 ip-of-node-1 &c. 替换为正确的地址/主机名)。将“AllowMulticast”设置为 false 只会禁用所有多播的使用。如果多播不能在所有节点上可靠地工作,假设它工作可能会导致系统损坏。所以在这个阶段,不使用它肯定更容易。
“ParticipantIndex”与它使用的 UDP 端口号有关。使用多播,一台机器上的多个进程都可以使用相同的 UDP 端口号来接收发现数据包,因此有这个商定的端口号用于发现,无需任何配置即可使一切正常工作(域 id 0 的端口号 7400 )。这反过来又允许它使用随机端口号来接收单播流量。
然而,使用单播,每个进程都需要有自己唯一的端口号,这反过来意味着其他进程需要知道将数据发送到哪个端口号。将“ParticipantIndex”设置为自动强制它使用可预测的端口号,以便进程可以找到彼此。