既然,DDS可以进行数据交互,那么理论上基于DDS便可以实现RPC机制。
OpenDDS没有实现RPC,但根据RPC over DDS给出的规范。可以利用OpenDDS实现 DDS-RPC。在实现上,主要包括以下几个部分:
IDL定义
根据DDS-RPC规范,定义OpenDDS可以识别的IDL文件(主题)。
主题文件生成
根据上一步,定义的IDL文件,利用OpenDDS提供的工具生成主体文件(.h/.cpp)
Publisher/Subscribe
服务端和客户端,相当于两个Participation。每个Participation需要包含一个P端,一个S端。
DataWriter/DataReader。
DateWriter负责写入请求数据,DataReader负责读取订阅的数据。
本地实现
当服务器端的DataReader接收到请求端的数据时,根据调用的方法,调用具体的本地实现。方法调用后,将返回值通过DataWriter告知客户端。
当客户端的DataReader接收到数据后,调用相应的本地实现,告知其返回结果。
代码源码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 */
【DDS】DDS与OpenDDS
【DDS】DDS-RPC通信机制
【DDS】基于OpenDDS的DDS-RPC实现
【DDS】DDSI-RTPS规范