有一个名为Remote Procedure Call over DDS(RPC over DDS)的 OMG 标准定义了 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 编译器为接口生成 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;
}