0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ROS是如何实现XMLRPC的

麦辣鸡腿堡 来源:古月居 作者:古月居 2023-09-14 17:45 次阅读

XMLRPC的C++代码在下载后的ros_comm-noetic-develutilitiesxmlrpcpp路径下。

还好,整个工程不算太大。XMLRPC分成客户端和服务器端两大部分。

咱们先看客户端,主要代码在XmlRpcClient.cpp文件里。

擒贼先擒王,XmlRpcClient.cpp文件中最核心的函数就是execute,用于执行远程调用,代码如下。

// Execute the named procedure on the remote server.
// Params should be an array of the arguments for the method.
// Returns true if the request was sent and a result received (although the result might be a fault).
bool XmlRpcClient::execute(const char* method, XmlRpcValue const& params, XmlRpcValue& result)
{
  XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s (_connectionState %s).", method, connectionStateStr(_connectionState));


  // This is not a thread-safe operation, if you want to do multithreading, use separate
  // clients for each thread. If you want to protect yourself from multiple threads
  // accessing the same client, replace this code with a real mutex.
  if (_executing)
    return false;


  _executing = true;
  ClearFlagOnExit cf(_executing);


  _sendAttempts = 0;
  _isFault = false;


  if ( ! setupConnection())
    return false;


  if ( ! generateRequest(method, params))
    return false;


  result.clear();
  double msTime = -1.0;   // Process until exit is called
  _disp.work(msTime);


  if (_connectionState != IDLE || ! parseResponse(result)) {
    _header = "";
    return false;
  }


  // close() if server does not supports HTTP1.1
  // otherwise, reusing the socket to write leads to a SIGPIPE because
  // the remote server could shut down the corresponding socket.
  if (_header.find("HTTP/1.1 200 OK", 0, 15) != 0) {
    close();
  }


  XmlRpcUtil::log(1, "XmlRpcClient::execute: method %s completed.", method);
  _header = "";
  _response = "";
  return true;
}

它首先调用setupConnection()函数与服务器端建立连接。

连接成功后,调用generateRequest()函数生成发送请求报文。

XMLRPC请求报文的头部又交给generateHeader()函数做了,代码如下。

// Prepend http headers
std::string XmlRpcClient::generateHeader(size_t length) const
{
  std::string header = 
    "POST " + _uri + " HTTP/1.1rn"
    "User-Agent: ";
  header += XMLRPC_VERSION;
  header += "rnHost: ";
  header += _host;


  char buff[40];
  std::snprintf(buff,40,":%drn", _port);


  header += buff;
  header += "Content-Type: text/xmlrnContent-length: ";


  std::snprintf(buff,40,"%zurnrn", length);
  return header + buff;
}

主体部分则先将远程调用的方法和参数变成XML格式,generateRequest()函数再将头部和主体组合成完整的报文,如下:

std::string header = generateHeader(body.length());
_request = header + body;

把报文发给服务器后,就开始静静地等待。

一旦接收到服务器返回的报文后,就调用parseResponse函数解析报文数据,也就是把XML格式变成纯净的数据格式。

我们发现,XMLRPC使用了socket功能实现客户端和服务器通信

我们搜索socket这个单词,发现它原始的意思是插座。这非常形象,建立连接实现通信就像把插头插入插座。

虽说XMLRPC也是ROS的一部分,但它毕竟只是一个基础功能,我们会用即可,暂时不去探究其实现细节,

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 客户端
    +关注

    关注

    1

    文章

    282

    浏览量

    16354
  • 服务端
    +关注

    关注

    0

    文章

    62

    浏览量

    6874
  • ROS
    ROS
    +关注

    关注

    1

    文章

    272

    浏览量

    16696
收藏 人收藏

    评论

    相关推荐

    ROS与STM32之间的联系

    ROS与STM32之间的联系简介ROS主要实现的功能STM32主要实现的功能两者之间的关系两者之间的通信简介1、如何实现
    发表于 06-28 07:49

    ROS与STM32是如何进行通信的

    角速度、实际线速度STM32端ROS端之前运行的ROS项目都是在终端编译,用vim或者gedit修改代码,很不方便,函数跳转查看都没办法实现。所以今天先安装一个IDE试试ROS官网上有
    发表于 08-11 07:25

    ROS_Arduino_bridge实现两路PID控制

    官方提供的ROS_arduino_bridge是利用一套PID控制两个马达,但是由于马达问题,机器人不能走直线,因此就需要对两个马达进行单独的PID控制,本文修改ROS
    发表于 09-01 07:02

    如何实现ROS小车电机驱动?

    如何实现ROS小车电机驱动?
    发表于 10-08 07:28

    什么是ROS?如何学习ROS

    什么是ROS?如何学习ROS
    发表于 11-11 07:21

    什么是ROSROS产生、发展和壮大的原因和意义

    机器人操作系统(ROS)入门(嵌入式系统应用开发)一、ROS 基本问题1. 什么是 ROS2. ROS 产生、发展和壮大的原因和意义二、安装 ROS
    发表于 12-17 06:08

    如何实现一个ROS服务端呢

    如何实现一个ROS服务端呢?有哪些实现步骤?
    发表于 02-14 06:16

    搭建ARM+ROS的硬件载体之ROS的移植及测试方法

    started with ROS and Docker》,结合我司的HDG2L-IoT评估套件实现ROS方案完全搭建流程  2. 选择ROS镜像  目前docker官网提供了搭建好的
    发表于 03-09 13:55

    ROS与STM32通信

    角速度、实际线速度STM32端ROS端之前运行的ROS项目都是在终端编译,用vim或者gedit修改代码,很不方便,函数跳转查看都没办法实现。所以今天先安装一个IDE试试ROS官网上有
    发表于 12-24 19:00 11次下载
    <b class='flag-5'>ROS</b>与STM32通信

    ROS机器人操作系统的实现原理(上)

    本文介绍ROS机器人操作系统(Robot Operating System)的实现原理,从最底层分析ROS代码是如何实现的。 **1、序列化** 把通信的内容(也就是消息m
    的头像 发表于 05-19 17:41 784次阅读
    <b class='flag-5'>ROS</b>机器人操作系统的<b class='flag-5'>实现</b>原理(上)

    ROS机器人操作系统的实现原理(下)

    本文介绍ROS机器人操作系统(Robot Operating System)的实现原理,从最底层分析ROS代码是如何实现的。 **1、序列化** 把通信的内容(也就是消息m
    的头像 发表于 05-19 17:42 875次阅读

    ROS中的序列化实现

    理解了序列化,再回到ROS。我们发现,ROS没有采用第三方的序列化工具,而是选择自己实现,代码在roscpp_core项目下的roscpp_serialization中,见下图。这个功能涉及的代码
    的头像 发表于 09-14 17:26 602次阅读

    ROSXMLRPC是什么

    XMLRPC是什么? 关于ROS节点建立连接的技术细节,官方文档说的非常简单,在这里ROS Technical Overview。没有基础的同学看这个介绍必然还是不懂。 在ROS中,节
    的头像 发表于 09-14 17:40 700次阅读

    节点是如何调用XMLRPC

    节点间通过XMLRPC建立连接 在一个节点刚启动的时候,它并不知道其它节点的存在,更不知道它们在交谈什么,当然也就谈不上通信。 所以,它要先与master对话查询其它节点的状态,然后再与其它节点通信
    的头像 发表于 09-14 17:52 558次阅读
    节点是如何调用<b class='flag-5'>XMLRPC</b>的

    ROS核心框架介绍

    ROS核心框架 对于第一个问题,我也没仔细研究过源码,核心代码基本由python和C++组成,运用了xmlrpc机制,每个运行的节点可以理解成一个进程。进程间通讯有些是共享内存的方式(比如
    的头像 发表于 11-21 18:07 495次阅读
    <b class='flag-5'>ROS</b>核心框架介绍