我正在使用IDL为使用OpenDDS的应用程序定义数据。
我还想使用IDL来定义应用程序的接口,但是OpenDDS (以及大多数其他的DDS实现似乎)不支持IDL中的接口。
有没有可以从IDL接口生成简单存根的编译器?我需要它至少支持C++和Java。
所有的IDL编译器都是CORBA ORB的一部分,它们生成大量特定于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();
};
};发布于 2021-03-03 16:04:38
发布于 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,并忽略对它们的操作。
发布于 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示例:
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注解,我们的代码生成器将简单地生成一个类声明,我想您正在寻找的类声明如下所示:
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 );服务器应用程序可以扩展robot.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;
}https://stackoverflow.com/questions/66447744
复制相似问题