色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    瀏覽量

    16713
  • 服務端
    +關注

    關注

    0

    文章

    66

    瀏覽量

    7024
  • ROS
    ROS
    +關注

    關注

    1

    文章

    278

    瀏覽量

    17035
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

    ROSXMLRPC是什么

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

    節點是如何調用XMLRPC

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

    ROS核心框架介紹

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

    ros的基本概念是什么

    基本概念: ROS是一個用于在不同進程間匿名的發布、訂閱、傳遞信息的中間件。 ROS2系統的核心部分是ROS網絡(ROS Graph)。 ROS
    的頭像 發表于 11-27 11:21 ?1837次閱讀
    主站蜘蛛池模板: 99热这里有精品| 哺乳溢出羽月希中文字幕| 色综合久久88色综合天天提莫| 中国人泡妞xxxxxxxx19| 久久国产精品永久网站| 2017年伦理片免费观看| 青青草 久久久| 国产精品青青在线麻豆 | 国产欧美精品一区二区三区-老狼 国产欧美精品国产国产专区 | 九九热在线视频| 99久久香蕉国产线看观看| 无遮18禁在线永久免费观看挡| 姐姐不~不可以动漫在线观看| 6080伦理久久亚洲精品| 水蜜桃亚洲一二三四在线| 兰桂坊人成社区亚洲精品 | 亚洲大片免费看| 麻豆COMCN| 国产乱人视频在线观看| 在线观看国产亚洲| 色婷婷狠狠97成为人免费| 精品视频网站| 成人在线视频国产| 中文字幕一区二区视频| 无码射肉在线播放视频| 男人扒开添女人屁股| 国产亚洲精品久久久闺蜜| 97在线视频网站| 亚洲国产综合久久精品| 人妻少妇69式99偷拍| 精品久久久久久久久免费影院| 粉嫩国产14xxxxx0000| 最近中文字幕在线中文高清版| 乡村教师电影完整版在线观看| 免费视频不卡| 激情内射亚洲一区二区三区| 俄罗斯雏妓的BBB孩交| 91麻豆久久| 一天不停的插BB十几次| 亚洲va久久久久| 色姣姣狠狠撩综合网|