DDS协议可以用于连接到不同网络的设备之间的通信吗?如何?
Can DDS protocol be used to communicate between devices connected to different networks?How?
我正在尝试使用 eclipse cyclone DDS 协议实现发布和订阅 hello world 程序,以便在 2 个设备之间进行通信,当设备连接在同一网络中但设备位于不同网络时,我能够做到这一点没有沟通发生。据我了解,这是因为默认的 DDS 域,但我该如何更改它?
我关注了 https://github.com/eclipse-cyclonedds/cyclonedds
这里提到使用 XML 文件,但我不明白如何使用它或在哪里使用该文件。
任何建议都会有很大帮助,谢谢!
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 多播在单个网络中工作 semi-magically。如果有多个网络,中间有一个路由器,这些路由器通常配置为不路由多播流量。
这意味着您基本上有两个选择:
- 配置路由器以在网络之间路由多播流量(尤其是 DDS 默认使用的 239.255.0.1 地址)。如果可行,那么您就已经准备就绪,无需在 Cyclone DDS 中进行任何配置。
- 禁用多播,而是在配置文件中列出要与之通信的机器的 hostnames/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. 替换为正确的 addresses/hostnames)。将“AllowMulticast”设置为 false 只会禁用对多播的所有使用。如果多播不能在所有节点上可靠地工作,假设它工作可以使系统崩溃。所以在这个阶段,不使用它肯定更容易。
“ParticipantIndex”与其使用的UDP端口号有关。使用多播,一台机器上的多个进程都可以使用相同的 UDP 端口号来接收发现数据包,因此有这个 agreed-upon 端口号用于发现,无需任何配置即可使一切正常工作(域端口号 7400编号 0)。这反过来又允许它使用随机端口号来接收单播流量。
然而,对于单播,每个进程都需要有自己唯一的端口号,这反过来意味着 其他 进程需要知道将数据发送到哪个端口号到。将“ParticipantIndex”设置为自动强制它使用可预测的端口号,以便进程可以找到彼此。
我正在尝试使用 eclipse cyclone DDS 协议实现发布和订阅 hello world 程序,以便在 2 个设备之间进行通信,当设备连接在同一网络中但设备位于不同网络时,我能够做到这一点没有沟通发生。据我了解,这是因为默认的 DDS 域,但我该如何更改它? 我关注了 https://github.com/eclipse-cyclonedds/cyclonedds 这里提到使用 XML 文件,但我不明白如何使用它或在哪里使用该文件。 任何建议都会有很大帮助,谢谢!
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 多播在单个网络中工作 semi-magically。如果有多个网络,中间有一个路由器,这些路由器通常配置为不路由多播流量。
这意味着您基本上有两个选择:
- 配置路由器以在网络之间路由多播流量(尤其是 DDS 默认使用的 239.255.0.1 地址)。如果可行,那么您就已经准备就绪,无需在 Cyclone DDS 中进行任何配置。
- 禁用多播,而是在配置文件中列出要与之通信的机器的 hostnames/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. 替换为正确的 addresses/hostnames)。将“AllowMulticast”设置为 false 只会禁用对多播的所有使用。如果多播不能在所有节点上可靠地工作,假设它工作可以使系统崩溃。所以在这个阶段,不使用它肯定更容易。
“ParticipantIndex”与其使用的UDP端口号有关。使用多播,一台机器上的多个进程都可以使用相同的 UDP 端口号来接收发现数据包,因此有这个 agreed-upon 端口号用于发现,无需任何配置即可使一切正常工作(域端口号 7400编号 0)。这反过来又允许它使用随机端口号来接收单播流量。
然而,对于单播,每个进程都需要有自己唯一的端口号,这反过来意味着 其他 进程需要知道将数据发送到哪个端口号到。将“ParticipantIndex”设置为自动强制它使用可预测的端口号,以便进程可以找到彼此。