【问题标题】:how to pass any object using openDDS?如何使用 openDDS 传递任何对象?
【发布时间】:2014-11-06 10:50:41
【问题描述】:

我正在使用 openDDS pub/sun 中间件。我已经使用复杂的结构测试了 openDDS。

例如。

typedef struct DSMD
    {
          string a;           
          long b;

    } StandByModeData;

   struct DSMCD{        
    string SessionId;       
    DSMD Data;
  };

但现在我有不同的结构。这是通过 openDDS 传递的。

如何在idl结构中使用模板?

我需要这样的东西。

template <struct T> 
struct array { 
  T typr;
};

【问题讨论】:

    标签: idl data-distribution-service opensplice


    【解决方案1】:

    这是目前 OpenDDS 无法实现的。 IDL3+ 确实定义了类似于您的示例的模板化模块,但据我所知,OpenDDS 或任何其他 DDS 供应商都不支持。

    【讨论】:

    • 我可以传递至少包装的对象吗?这样我就可以传递任何类型的对象
    • 我需要传递任何类型的对象。如何定义 idl 呢?
    【解决方案2】:

    eProsima 的 Fast-RTPS 可以使用 DDS 支持多种数据类型,也就是动态类型构建器,一些示例动态构建器可以参考 here,github 存储库参考 https://github.com/eProsima/Fast-RTPS。恕我直言,当数据类型支持 std::string 类型时,它可以支持任何类型的数据类型,因为 std::string 是一种通用选择。对于不确定的数据类型,您可以将数据转换为 json 格式的字符串以通过 DDS。我一直在做这样的事情,以后会有进一步的进展。

    【讨论】:

      【解决方案3】:

      你可以做你自己的VMF(可变消息格式)消息类型。我现在正在编写的代码使用这个概念使用 eprosima FastDDS 在节点/参与者之间传递消息。相同的 idl 文件可用于 OpenDDS 和 FastDDS。在某些情况下,我们会同时使用这两种 DDS 实现。

      @topic
      struct VariableMessageType
      {
         /* Message id */
         long msg_id; 
      
         /* Number of bytes in the data vector */
         /* units: none */
         long num_bytes; 
      
         /* num_bytes sized array of bytes */
         /* units: none */
         sequence<octet> data; 
      };
      

      【讨论】:

        猜你喜欢
        • 2022-12-05
        • 2014-02-16
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2018-02-14
        • 1970-01-01
        相关资源
        最近更新 更多