0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ROS是如何實(shí)現(xiàn)XMLRPC的

麥辣雞腿堡 ? 來源:古月居 ? 作者:古月居 ? 2023-09-14 17:45 ? 次閱讀

XMLRPC的C++代碼在下載后的ros_comm-noetic-develutilitiesxmlrpcpp路徑下。

還好,整個(gè)工程不算太大。XMLRPC分成客戶端和服務(wù)器端兩大部分。

咱們先看客戶端,主要代碼在XmlRpcClient.cpp文件里。

擒賊先擒王,XmlRpcClient.cpp文件中最核心的函數(shù)就是execute,用于執(zhí)行遠(yuǎn)程調(diào)用,代碼如下。

// 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;
}

它首先調(diào)用setupConnection()函數(shù)與服務(wù)器端建立連接。

連接成功后,調(diào)用generateRequest()函數(shù)生成發(fā)送請(qǐng)求報(bào)文。

XMLRPC請(qǐng)求報(bào)文的頭部又交給generateHeader()函數(shù)做了,代碼如下。

// 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;
}

主體部分則先將遠(yuǎn)程調(diào)用的方法和參數(shù)變成XML格式,generateRequest()函數(shù)再將頭部和主體組合成完整的報(bào)文,如下:

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

把報(bào)文發(fā)給服務(wù)器后,就開始靜靜地等待。

一旦接收到服務(wù)器返回的報(bào)文后,就調(diào)用parseResponse函數(shù)解析報(bào)文數(shù)據(jù),也就是把XML格式變成純凈的數(shù)據(jù)格式。

我們發(fā)現(xiàn),XMLRPC使用了socket功能實(shí)現(xiàn)客戶端和服務(wù)器通信

我們搜索socket這個(gè)單詞,發(fā)現(xiàn)它原始的意思是插座。這非常形象,建立連接實(shí)現(xiàn)通信就像把插頭插入插座。

雖說XMLRPC也是ROS的一部分,但它畢竟只是一個(gè)基礎(chǔ)功能,我們會(huì)用即可,暫時(shí)不去探究其實(shí)現(xiàn)細(xì)節(jié),

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 客戶端
    +關(guān)注

    關(guān)注

    1

    文章

    287

    瀏覽量

    16627
  • 服務(wù)端
    +關(guān)注

    關(guān)注

    0

    文章

    66

    瀏覽量

    6959
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16921
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ROS與STM32之間的聯(lián)系

    ROS與STM32之間的聯(lián)系簡(jiǎn)介ROS主要實(shí)現(xiàn)的功能STM32主要實(shí)現(xiàn)的功能兩者之間的關(guān)系兩者之間的通信簡(jiǎn)介1、如何實(shí)現(xiàn)
    發(fā)表于 06-28 07:49

    ROS與STM32是如何進(jìn)行通信的

    角速度、實(shí)際線速度STM32端ROS端之前運(yùn)行的ROS項(xiàng)目都是在終端編譯,用vim或者gedit修改代碼,很不方便,函數(shù)跳轉(zhuǎn)查看都沒辦法實(shí)現(xiàn)。所以今天先安裝一個(gè)IDE試試ROS官網(wǎng)上有
    發(fā)表于 08-11 07:25

    如何實(shí)現(xiàn)ROS小車電機(jī)驅(qū)動(dòng)?

    如何實(shí)現(xiàn)ROS小車電機(jī)驅(qū)動(dòng)?
    發(fā)表于 10-08 07:28

    什么是ROS?如何學(xué)習(xí)ROS?

    什么是ROS?如何學(xué)習(xí)ROS
    發(fā)表于 11-11 07:21

    什么是ROS?ROS產(chǎn)生、發(fā)展和壯大的原因和意義

    機(jī)器人操作系統(tǒng)(ROS)入門(嵌入式系統(tǒng)應(yīng)用開發(fā))一、ROS 基本問題1. 什么是 ROS2. ROS 產(chǎn)生、發(fā)展和壯大的原因和意義二、安裝 ROS
    發(fā)表于 12-17 06:08

    如何實(shí)現(xiàn)一個(gè)ROS服務(wù)端呢

    如何實(shí)現(xiàn)一個(gè)ROS服務(wù)端呢?有哪些實(shí)現(xiàn)步驟?
    發(fā)表于 02-14 06:16

    ROS與STM32通信

    角速度、實(shí)際線速度STM32端ROS端之前運(yùn)行的ROS項(xiàng)目都是在終端編譯,用vim或者gedit修改代碼,很不方便,函數(shù)跳轉(zhuǎn)查看都沒辦法實(shí)現(xiàn)。所以今天先安裝一個(gè)IDE試試ROS官網(wǎng)上有
    發(fā)表于 12-24 19:00 ?11次下載
    <b class='flag-5'>ROS</b>與STM32通信

    ROS機(jī)器人操作系統(tǒng)的實(shí)現(xiàn)原理(上)

    本文介紹ROS機(jī)器人操作系統(tǒng)(Robot Operating System)的實(shí)現(xiàn)原理,從最底層分析ROS代碼是如何實(shí)現(xiàn)的。 **1、序列化** 把通信的內(nèi)容(也就是消息m
    的頭像 發(fā)表于 05-19 17:41 ?943次閱讀
    <b class='flag-5'>ROS</b>機(jī)器人操作系統(tǒng)的<b class='flag-5'>實(shí)現(xiàn)</b>原理(上)

    ROS機(jī)器人操作系統(tǒng)的實(shí)現(xiàn)原理(下)

    本文介紹ROS機(jī)器人操作系統(tǒng)(Robot Operating System)的實(shí)現(xiàn)原理,從最底層分析ROS代碼是如何實(shí)現(xiàn)的。 **1、序列化** 把通信的內(nèi)容(也就是消息m
    的頭像 發(fā)表于 05-19 17:42 ?1091次閱讀

    實(shí)現(xiàn)ARM+ROS(機(jī)器人操作系統(tǒng))之運(yùn)行ROS!

    如何低成本搭建ARM+ROS的硬件載體?上文展示ROS部署前的籌備工作及步驟分解,本文將為大家演示ROS的移植及測(cè)試方法。
    的頭像 發(fā)表于 10-10 18:15 ?1178次閱讀
    <b class='flag-5'>實(shí)現(xiàn)</b>ARM+<b class='flag-5'>ROS</b>(機(jī)器人操作系統(tǒng))之運(yùn)行<b class='flag-5'>ROS</b>!

    ROS中的序列化實(shí)現(xiàn)

    理解了序列化,再回到ROS。我們發(fā)現(xiàn),ROS沒有采用第三方的序列化工具,而是選擇自己實(shí)現(xiàn),代碼在roscpp_core項(xiàng)目下的roscpp_serialization中,見下圖。這個(gè)功能涉及的代碼量
    的頭像 發(fā)表于 09-14 17:26 ?850次閱讀

    ROSXMLRPC是什么

    XMLRPC是什么? 關(guān)于ROS節(jié)點(diǎn)建立連接的技術(shù)細(xì)節(jié),官方文檔說的非常簡(jiǎn)單,在這里ROS Technical Overview。沒有基礎(chǔ)的同學(xué)看這個(gè)介紹必然還是不懂。 在ROS中,節(jié)
    的頭像 發(fā)表于 09-14 17:40 ?897次閱讀

    節(jié)點(diǎn)是如何調(diào)用XMLRPC

    節(jié)點(diǎn)間通過XMLRPC建立連接 在一個(gè)節(jié)點(diǎn)剛啟動(dòng)的時(shí)候,它并不知道其它節(jié)點(diǎn)的存在,更不知道它們?cè)诮徽勈裁矗?dāng)然也就談不上通信。 所以,它要先與master對(duì)話查詢其它節(jié)點(diǎn)的狀態(tài),然后再與其它節(jié)點(diǎn)通信
    的頭像 發(fā)表于 09-14 17:52 ?723次閱讀
    節(jié)點(diǎn)是如何調(diào)用<b class='flag-5'>XMLRPC</b>的

    ROS核心框架介紹

    ROS核心框架 對(duì)于第一個(gè)問題,我也沒仔細(xì)研究過源碼,核心代碼基本由python和C++組成,運(yùn)用了xmlrpc機(jī)制,每個(gè)運(yùn)行的節(jié)點(diǎn)可以理解成一個(gè)進(jìn)程。進(jìn)程間通訊有些是共享內(nèi)存的方式(比如
    的頭像 發(fā)表于 11-21 18:07 ?887次閱讀
    <b class='flag-5'>ROS</b>核心框架介紹

    ros的基本概念是什么

    基本概念: ROS是一個(gè)用于在不同進(jìn)程間匿名的發(fā)布、訂閱、傳遞信息的中間件。 ROS2系統(tǒng)的核心部分是ROS網(wǎng)絡(luò)(ROS Graph)。 ROS
    的頭像 發(fā)表于 11-27 11:21 ?1670次閱讀