【DDS】基於OpenDDS的DDS-RPC實現

基於OpenDDS的DDS-RPC實現

代碼實現

OpenDDS沒有實現RPC,但根據RPC over DDS給出的規範。可以利用OpenDDS實現 DDS-RPC。在實現上,主要包括以下幾個部分。

  1. IDL定義:根據DDS-RPC規範,定義OpenDDS可以識別的IDL文件(主題)。
  2. 利用IDL文件,生成.h .cpp文件。
  3. 實現Publisher/Subscribe,DataWriter/DataReader。
  4. 實現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 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章