【DDS】基于OpenDDS的DDS-RPC实现

连正信
2023-12-01

基于OpenDDS的DDS-RPC实现

DDS-RPC:

  • DDS指Data Distribution Service,是OMG(Object Management Group)提出的规范。DDS类似于总线的概念,用于数据交互。
  • RPC指Remote Procedure Calls,远过程调用。比方说,远程服务端提供一个了方法,客户端可以调用这个方法。

既然,DDS可以进行数据交互,那么理论上基于DDS便可以实现RPC机制。

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】DDS与OpenDDS
【DDS】DDS-RPC通信机制
【DDS】基于OpenDDS的DDS-RPC实现
【DDS】DDSI-RTPS规范

 类似资料: