【问题标题】:Can DDS protocol be used to communicate between devices connected to different networks?How?DDS协议可以用于连接到不同网络的设备之间进行通信吗?如何?
【发布时间】:2020-10-14 11:33:51
【问题描述】:

我正在尝试实现一个发布和订阅 hello world 程序,以便使用 eclipse cyclone DDS 协议在 2 个设备之间进行通信,当设备连接在同一个网络中但当设备在不同的网络中时,我可以做到这一点没有通信发生。据我了解,这是因为默认的 DDS 域,但我该如何更改呢? 我关注了https://github.com/eclipse-cyclonedds/cyclonedds 这里提到了使用 XML 文件,但我不明白如何使用它或在哪里使用该文件。 任何建议都会有很大帮助,谢谢!

【问题讨论】:

    标签: data-distribution-service


    【解决方案1】:

    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 多播在单个网络中以半神奇的方式工作。如果有多个网络,则中间有一个路由器,这些路由器通常配置为不路由多播流量。

    这意味着您基本上有两种选择:

    1. 将路由器配置为在网络之间路由多播流量(尤其是 DDS 默认使用的 239.255.0.1 地址)。如果可行,则一切就绪,无需在 Cyclone DDS 中进行任何配置。
    2. 禁用多播,而是在配置文件中列出要与之通信的机器的主机名/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”设置为自动强制它使用可预测的端口号,以便进程可以找到彼此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 2019-04-28
      相关资源
      最近更新 更多