在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    瀏覽量

    16722
  • 服務端
    +關注

    關注

    0

    文章

    66

    瀏覽量

    7025
  • ROS
    ROS
    +關注

    關注

    1

    文章

    278

    瀏覽量

    17037
收藏 人收藏

    評論

    相關推薦

    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 ?1007次閱讀
    <b class='flag-5'>ROS</b>機器人操作系統的<b class='flag-5'>實現</b>原理(上)

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

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

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

    如何低成本搭建ARM+ROS的硬件載體?上文展示ROS部署前的籌備工作及步驟分解,本文將為大家演示ROS的移植及測試方法。
    的頭像 發表于 10-10 18:15 ?1272次閱讀
    <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 ?930次閱讀

    ROSXMLRPC是什么

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

    節點是如何調用XMLRPC

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

    ROS核心框架介紹

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

    ros的基本概念是什么

    基本概念: ROS是一個用于在不同進程間匿名的發布、訂閱、傳遞信息的中間件。 ROS2系統的核心部分是ROS網絡(ROS Graph)。 ROS
    的頭像 發表于 11-27 11:21 ?1845次閱讀
    主站蜘蛛池模板: 狠狠色狠狠色| aaa亚洲| 久久福利青草精品资源站免费| 成片一卡三卡四卡免费网站| 理论毛片| 最近高清在线视频观看免费| 欧美色欧美亚洲高清在线观看| 伊人久久大香线蕉观看| 亚洲第一网站| 久久国产香蕉一区精品| 久久观看视频| 国产视频一二区| 男女www视频在线看网站| 婷婷激情综合网| 久久久久国产一级毛片高清板| 免费视频在线观看1| 手机看片国产福利| 综合网自拍| 天天色天天做| 亚洲天天操| 免费午夜视频| 女bbbbxxxx毛片视频0| 天天黄色| 国产午夜剧场| 理论片午午伦夜理片影院99| 5566精品资源在线播放| 国产精品片| 黄字幕网| 国产精品久久久久久久免费| 欧美性猛交xxxx免费| 波多野吉衣一区二区三区在线观看| 久久久久久久影院| 久久xx| 在线国产高清| 最好看的2019中文字幕1| 男女视频在线观看免费高清观看| 亚洲一区在线视频观看| 91日本在线观看亚洲精品| 色yeye在线观看| 免费高清视频免费观看| aaaaa级毛片免费视频|