基于OpenDDS的DDS-RPC实现
- 关于DDS-RPC的概念原理参考下文:
DDS-RPC通信机制
代码实现
OpenDDS没有实现RPC,但根据RPC over DDS给出的规范。可以利用OpenDDS实现 DDS-RPC。在实现上,主要包括以下几个部分。
- IDL定义:根据DDS-RPC规范,定义OpenDDS可以识别的IDL文件(主题)。
- 利用IDL文件,生成.h .cpp文件。
- 实现Publisher/Subscribe,DataWriter/DataReader。
- 实现Service端,实现Client端。
代码源码GitHub地址如下:
https://github.com/adver1991/DDS-Example/tree/dds-rpc
- 例:IDL文件
#ifdef INTERFACE
module robot {
@DDSService
interface RobotControl
{
float setSpeed(float speed);
float getSpeed();
};
}; //module robot
#endif // INTERFACE
#ifndef MY_BASIC
#define MY_BASIC
#include <rpc_types.idl>
module robot {
/***********************************************/
/* Request Types */
/***********************************************/
@nested
struct RobotControl_setSpeed_In
{
float speed;
};
@nested
struct RobotControl_getSpeed_In
{
DDS::RPC::UnusedMember dummy;
};
const long RobotControl_setSpeed_Hash = 1;
const long RobotControl_getSpeed_Hash = 2;
@nested
union RobotControl_Call switch(long)
{
default:
DDS::RPC::UnknownOperation unknownOp;
case RobotControl_setSpeed_Hash:
RobotControl_setSpeed_In setSpeed;
case RobotControl_getSpeed_Hash:
RobotControl_getSpeed_In getSpeed;
};
@topic
struct RobotControl_Request
{
DDS::RPC::RequestHeader header;
RobotControl_Call data;
};
/***********************************************/
/* Reply Types */
/***********************************************/
@nested
struct RobotControl_setSpeed_Out
{
float return_;
};
@nested
struct RobotControl_getSpeed_Out
{
float return_;
};
@nested
union RobotControl_setSpeed_Result switch(DDS::RPC::RemoteExceptionCode_t)
{
default:
DDS::RPC::UnknownException unknownEx;
case DDS::RPC::REMOTE_EX_OK:
RobotControl_setSpeed_Out result;
};
@nested
union RobotControl_getSpeed_Result switch(DDS::RPC::RemoteExceptionCode_t)
{
default:
DDS::RPC::UnknownException unknownEx;
case DDS::RPC::REMOTE_EX_OK:
RobotControl_getSpeed_Out result;
};
@nested
union RobotControl_Return switch(long)
{
default:
DDS::RPC::UnknownOperation unknownOp;
case RobotControl_setSpeed_Hash:
RobotControl_setSpeed_Result setSpeed;
case RobotControl_getSpeed_Hash:
RobotControl_getSpeed_Result getSpeed;
};
@topic
struct RobotControl_Reply
{
DDS::RPC::ReplyHeader header;
RobotControl_Return data;
};
}; // module robot
#endif /* MY_BASIC */