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

基于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规范

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值