chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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ā)送請求報(bào)文。

XMLRPC請求報(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ǔ)功能,我們會用即可,暫時(shí)不去探究其實(shí)現(xiàn)細(xì)節(jié),

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

    關(guān)注

    1

    文章

    304

    瀏覽量

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

    關(guān)注

    0

    文章

    68

    瀏覽量

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

    關(guān)注

    1

    文章

    290

    瀏覽量

    18261
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

    ROS與STM32之間的聯(lián)系簡介ROS主要實(shí)現(xiàn)的功能STM32主要實(shí)現(xiàn)的功能兩者之間的關(guā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ū)動?

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

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

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

    什么是ROSROS產(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 ?12次下載
    <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 ?1351次閱讀
    <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 ?1599次閱讀

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

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

    ROSXMLRPC是什么

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

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

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

    ROS核心框架介紹

    ROS核心框架 對于第一個(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 ?1584次閱讀
    <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 ?2528次閱讀