吴忠躺衫网络科技有限公司

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

    文章

    290

    瀏覽量

    16766
  • 服務端
    +關注

    關注

    0

    文章

    66

    瀏覽量

    7057
  • ROS
    ROS
    +關注

    關注

    1

    文章

    280

    瀏覽量

    17100
收藏 人收藏

    評論

    相關推薦

    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小車電機驅動?

    如何實現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

    ROS與STM32通信

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

    ROS機器人操作系統的實現原理(上)

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

    ROS機器人操作系統的實現原理(下)

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

    實現ARM+ROS(機器人操作系統)之運行ROS

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

    ROS中的序列化實現

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

    ROSXMLRPC是什么

    XMLRPC是什么? 關于ROS節點建立連接的技術細節,官方文檔說的非常簡單,在這里ROS Technical Overview。沒有基礎的同學看這個介紹必然還是不懂。 在ROS中,節
    的頭像 發表于 09-14 17:40 ?1048次閱讀

    節點是如何調用XMLRPC

    節點間通過XMLRPC建立連接 在一個節點剛啟動的時候,它并不知道其它節點的存在,更不知道它們在交談什么,當然也就談不上通信。 所以,它要先與master對話查詢其它節點的狀態,然后再與其它節點通信
    的頭像 發表于 09-14 17:52 ?805次閱讀
    節點是如何調用<b class='flag-5'>XMLRPC</b>的

    ROS核心框架介紹

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

    ros的基本概念是什么

    基本概念: ROS是一個用于在不同進程間匿名的發布、訂閱、傳遞信息的中間件。 ROS2系統的核心部分是ROS網絡(ROS Graph)。 ROS
    的頭像 發表于 11-27 11:21 ?1889次閱讀
    澳门百家乐娱乐城送体验金| 全讯网3344666| 明升网站| 金博士百家乐官网的玩法技巧和规则 | 百家乐吹| 大发888 代充| 百家乐官网最全打法| 真人百家乐海立方| 百家乐蓝盾在线现| 六合彩聊天室| 乐宝百家乐官网娱乐城| 百家乐官网规则以及玩法| 百家乐微乐| 永善县| 黄金城百家乐官网手机用户| 百家乐画面方法| 风水24山子怎么读| 清远市| 百家乐天上人间| 澳门赌场图片| 百家乐最新庄闲投注法| 定襄县| 百家乐如何制| 澳门赌百家乐官网心法| 百家乐黏土筹码| 大发888客户端| 迪威百家乐官网娱乐场| 大发888下载地址| 富民县| 专业百家乐软件| 百家乐官网赌场破解| 网上百家乐新利| 乐百家百家乐官网游戏| 战神百家乐的玩法技巧和规则 | 大发888备用网址大发娱乐城| 名仕百家乐官网的玩法技巧和规则 | 百家乐21点游戏| 去澳门百家乐官网娱乐城| 大发888下载 df888| 澳门百家乐娱乐场| 博彩百家乐官网网址|