ROS_Xmlrpc++ 简单示例

根据 https://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/代码修改而来:
XmlRpc 简单代码示例


operations.h:
 #ifndef OPERATIONS
 #define OPERATIONS
 class operations {
 public:
  int add();
  operations(int i,int j);
 private :
  int op1;
  int op2;
 };
 #endif // OPERATIONS
 
operations.cpp :
 #include <iostream>
 #include "operations.h"
 int operations::add(){
  std::cout<< "Sum of " <<op1<<"+"<<op2<<"="<<op1+op2<<std::endl;
  return (op1+op2);
 }
 operations::operations(int i,int j){
  this->op1 = i;
  this->op2 = j;
 }

 

myxmlrpcserver.h:
 #ifndef MYXMLRPCSERVER
 #define MYXMLRPCSERVER
 #include <iostream>
 #include "myxmlrpcservermethods.h"
 #include "XmlRpc.h"

 class myXmlRpcServer
 {
 public:
  myXmlRpcServer() ;
  ~myXmlRpcServer();
  void run();
 private:
  void  pm_registerMethods();
  XmlRpc::XmlRpcServer pm_xmlRpcserver;
  std::list<myXmlRpcServerMethod*> pm_serverMethods;
 };

 #endif // MYXMLRPCSERVER

myxmlrpcserver.cpp  :
 #include "myxmlrpcserver.h"
 #include <iostream>

 myXmlRpcServer::myXmlRpcServer(){
    pm_registerMethods();
    int port = 8085;
    pm_xmlRpcserver.bindAndListen(port);
    std::cout<<"XmlRpcServer running  in port " << port<<std::endl;
 }
 myXmlRpcServer::~myXmlRpcServer(){
 }

 void myXmlRpcServer::pm_registerMethods(){
  Add* a = new Add(&pm_xmlRpcserver);
  myXmlRpcServerMethod *p=a;
  pm_serverMethods.push_back(p);
 }
 void myXmlRpcServer::run(){
  pm_xmlRpcserver.work(-1);
 }

myxmlrpcservermethods.h:
 #ifndef MYXMLRPCSERVERMETHODS
 #define MYXMLRPCSERVERMETHODS
 #include <iostream>
 #include <XmlRpc.h>
 #include "myxmlrpcserver.h"

 using namespace XmlRpc;
 class myXmlRpcServerMethod :  public XmlRpcServerMethod {
 public:
  myXmlRpcServerMethod(const char *name,XmlRpcServer *server):
  XmlRpcServerMethod(name,server){}
  virtual void execute(XmlRpcValue  &params,XmlRpcValue &result){ }
 };
 class Add:public myXmlRpcServerMethod{
 public:
  Add(XmlRpcServer *s);
  virtual void execute(XmlRpcValue &params,XmlRpcValue &result);
 };

#endif // MYXMLRPCSERVERMETHODS


myxmlrpcservermethods.cpp:
 #include <iostream>
 #include "myxmlrpcserver.h"
 #include <XmlRpc.h>
 #include "operations.h"
 using namespace std;
 using XmlRpc::XmlRpcException;
 Add::Add(XmlRpcServer*s) :myXmlRpcServerMethod("Add",s){}
 void Add::execute(XmlRpcValue &params, XmlRpcValue &result){
    operations a(10,12);
    try{
     cout<<"Inside Add::execute method\n";
     result = a.add();
    }catch(std::exception &stde){
     throw XmlRpcException(stde.what());
    }
 }
服务器端:

#include <iostream>
#include "myxmlrpcserver.h"
using std;
int main(int argc ,char *argv[]){

    myXmlRpcServer GeeBoomBaa;
    std::cout<<"About to run the server\n";
    GeeBoomBaa.run();
    return 0;

 
 
客户端:
#include <iostream>
#include "myxmlrpcserver.h"
using namespace XmlRpc;
int main(int argc, char* argv[])
{
        const char *server = "localhost";
        const int port = 8085;
        const char *uri = NULL;
        XmlRpcValue args, res;
        XmlRpcClient c( server, port, uri);
        c.execute("Add", args, res);
        std::cout<<"result is "<<res<<std::endl;
}

 

 

 

#include "ucar_solution.h" using namespace std; using namespace Eigen; //标准 namespace ucar_solution { Solution::Solution(ros::NodeHandle &nh) { ros::NodeHandle navi_nh(nh, "navigation"); //ros::NodeHandle speed_nh(nh, "speed"); mbf_client_ = std::make_unique<actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction>>("move_base", true); if (!mbf_client_->waitForServer(ros::Duration(10.0))) { ROS_INFO("Waiting for the move_base action server to come up"); } target_sub = nh.subscribe("/target_msg", 100, &Solution::solutionCallback, this); start_sub = nh.subscribe("/ucar/is_start", 100, &Solution::startCallback, this); cmd_pub = nh.advertise<geometry_msgs::Twist>("/cmd_vel", 50); scan_sub_ = nh.subscribe("/scan", 1000, &Solution::scanCallback, this); rpy_sub_ = nh.subscribe("/rpy_topic", 100, &Solution::rpyCallback, this); scan_mode_pub_ = nh.advertise<std_msgs::Int32>("/scan_mode", 10); scan_start_pub_ = nh.advertise<std_msgs::Bool>("/scan_start", 10); detect_start_pub_ = nh.advertise<std_msgs::Bool>("/detect_start", 10); follow_start_pub_ = nh.advertise<std_msgs::Bool>("/follow_start", 10); pidInit(0.01, 0.003, 0.005, 960,-0.3); XmlRpc::XmlRpcValue patrol_list; navi_nh.getParam("speed", MAX_LIMIT); navi_nh.getParam("goal_list", patrol_list); for (int i = 0; i < patrol_list.size(); ++i) { ROS_ASSERT(patrol_list[i].getType() == XmlRpc::XmlRpcValue::TypeArray); geometry_msgs::PoseStamped pose_stamped; pose_stamped.header.frame_id = "map"; ROS_ASSERT(patrol_list[i][0].getType() == XmlRpc::XmlRpcValue::TypeDouble and patrol_list[i][1].getType() == XmlRpc::XmlRpcValue::TypeDouble and patrol_list[i][2].getType() == XmlRpc::XmlRpcValue::TypeDouble); pose_stamped.pose.position
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值