首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DDS IDL编译器

DDS IDL编译器
EN

Stack Overflow用户
提问于 2021-03-03 05:56:51
回答 3查看 226关注 0票数 1

我正在使用IDL为使用OpenDDS的应用程序定义数据。

我还想使用IDL来定义应用程序的接口,但是OpenDDS (以及大多数其他的DDS实现似乎)不支持IDL中的接口。

有没有可以从IDL接口生成简单存根的编译器?我需要它至少支持C++和Java。

所有的IDL编译器都是CORBA ORB的一部分,它们生成大量特定于CORBA的代码和样板。我想要一个从IDL到C++/Java/等的简单映射。例如,如果我有这样的IDL:

代码语言:javascript
复制
module sample_module {
  interface sample_interface {
    attribute char sample_field;
    boolean sample_func();
  };
};

我希望编译器在C++中生成如下所示的文件:

代码语言:javascript
复制
namespace sample_module {
  class sample_interface {
    char sample_field;
    boolean sample_func();
  };
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-03 16:04:38

您可以使用local interface支持,这会产生一个具有纯虚方法的C++基类来实现。例如,这是LwCCM用来定义组件的示例,参见示例AXCIOMA,在那里我们使用本地接口与在IDL中定义的数据相结合。有关更多信息,请参阅我们的articles

作为替代方案,您也可以基于IDL创建自己的自定义生成,在我们使用RIDLTAOX11/AXCIOMA/R2CORBA中,您可以创建自定义后端来生成一些特定于接口的代码

票数 2
EN

Stack Overflow用户

发布于 2021-03-03 11:53:43

据我所知,在DDS规范的IDL中的接口之外,DDS本身并没有接口的用途。它总是将自己的IDL限制在CORBA子集上,因此除了使用tao_idl已经提供的支持之外,OpenDDS不支持用户定义的接口。可以由opendds_idl生成的可选CORBA映射没有您想要的所有C++11样板,但目前它不支持接口。我认为Java映射只支持OpenDDS特定的基于JNI的情况。即使在使用TAO映射时,OpenDDS也不支持将interface类型用作C++主题类型或内部主题类型。

我不能像对OpenDDS那样多地谈论其他的DDS实现,但我知道this support page for Connext说它们也不支持接口。它确实说他们支持valuetype,这有点像interface,但他们将其视为struct,并忽略对它们的操作。

票数 1
EN

Stack Overflow用户

发布于 2021-03-03 23:53:58

有一个称为Remote Procedure Call over DDS (RPC over DDS)的OMG标准,它定义了如何将IDL接口映射到代码(它属于DDS标准家族)。对于几种目标语言(包括C++、Java和C#),CoreDX DDS确实支持该标准。

除了简单地将接口映射到目标语言之外,RPC over DDS标准还提供了一种使用DDS作为RPC操作的底层传输的方法。它提供了低级接口(即,手动发送接收请求)和高级(调用“接口”方法)API。在这两种情况下,进程间通信都是通过DDS以可互操作的方式处理的。在我看来,这是一种非常强大的方法。

下面是一些IDL示例:

代码语言:javascript
复制
module robot {
  exception TooFast {};
  enum Command { START_COMMAND, STOP_COMMAND, TERMINATE_COMMAND };
  struct Status 
  {
    string msg;
  };
  @DDSService
  interface RobotControl 
   {
     void  command(Command com);
     float setSpeed(float speed) raises (TooFast);
     float getSpeed();
     void  getStatus(out Status status); 
  };
}; 

注意:“@DDSService”注解通知aware IDL编译器为接口生成RPC over DDS支持。

如果没有@DDSService注解,我们的代码生成器将简单地生成一个类声明,我想您正在寻找的类声明如下所示:

代码语言:javascript
复制
class RobotControl {
  public:
    RobotControl();
    ~RobotControl();

  public:
    virtual void                 command (
                                 /* IN    */  const enum robot::Command   com ) = 0;
    virtual float                setSpeed (
                                 /* IN    */  const float  speed ) = 0;
    virtual float                getSpeed ( ) = 0;
    virtual void                 getStatus (
                                 /* OUT   */  struct robot::Status & status ) = 0;

};

有了@DDSService注解,就可以生成更多的代码来提供完整的客户端实现(robot.RobotControlClient)和抽象的服务器端准备实现(robot.RobotControlService)。这样,您的客户端应用程序就可以简单地执行以下操作:

代码语言:javascript
复制
RobotControlClient robotClient = new RobotControlClient( client_params );
robotClient.setSped( 10 );

服务器应用程序可以扩展robot.RobotControlService,并实现服务调用,如下所示:

代码语言:javascript
复制
public class MyRobotControlService  extends RobotControlService {
   ....
   private static final float MAX_SPEED = (float)20.0;

   public float                       
   setSpeed ( /* in    */ float speed ) throws TooFast
   {
     float retval = (float)0.0;
     if (speed < MAX_SPEED)
       {
         current_speed = speed;
         retval = this.current_speed;
       }
     else
       {
         /* EXCEPTION: */
         throw new robot.TooFast();
         /* not reached... */
       }
     return retval;
   }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66447744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档