DDS IDL Compiler



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

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

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

作为CORBA orb一部分的所有IDL编译器都会生成大量CORBA特定的代码和样板文件。我想要的东西,做一个简单的映射从IDL到c++/Java/等。例如,如果我有这样的IDL:

module sample_module {
interface sample_interface {
attribute char sample_field;
boolean sample_func();
};
};

我希望编译器在c++中生成这样的文件:

namespace sample_module {
class sample_interface {
char sample_field;
boolean sample_func();
};
};

您可以使用local interface支持,这将导致使用纯虚方法实现c++基类。例如,LwCCM使用它来定义组件,参见AXCIOMA,在那里我们使用本地接口与IDL中定义的数据相结合。更多信息请参阅我们的文章。

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

有一个OMG标准,称为DDS上的远程过程调用(RPC over DDS),它定义了如何将IDL接口映射到代码(它属于DDS标准家族)。CoreDX DDS在一些目标语言(包括c++、Java和c#)中支持这个标准。

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

下面是一些IDL示例:

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'注释通知感知的IDL编译器为接口生成基于DDS支持的RPC。

如果没有@DDSService注释,我们的代码生成器将简单地生成一个类声明[我认为你正在寻找],看起来像这样:

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)。有了它,您的客户端应用程序可以简单地这样做:

RobotControlClient robotClient = new RobotControlClient( client_params );
robotClient.setSped( 10 );

服务器应用程序可以扩展机器人。RobotControlService,并实现服务调用,像这样:

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;
}

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

对于其他DDS实现,我不能像OpenDDS那样多说,但我知道Connext的支持页面说他们也不支持接口。它确实说他们支持valuetype,这有点像interface,但他们把它当作struct,忽略了对它们的操作。

最新更新