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

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

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

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

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

節(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)通信。

而節(jié)點(diǎn)與master對(duì)話使用的就是XMLRPC。

從這一點(diǎn)來看,master叫節(jié)點(diǎn)管理器確實(shí)名副其實(shí),它是一個(gè)大管家,給剛出生的節(jié)點(diǎn)提供服務(wù)。

下面我們以兩個(gè)節(jié)點(diǎn):talker和listener為例,介紹其通過XMLRPC建立通信連接的過程,如下圖所示。

圖片

  1. talker注冊(cè)

假設(shè)我們先啟動(dòng)talker。啟動(dòng)后,它通過1234端口使用XMLRPC向master注冊(cè)自己的信息,包含所發(fā)布消息的話題名。master會(huì)將talker的注冊(cè)信息加入注冊(cè)列表中;

2.listener注冊(cè)

listener啟動(dòng)后,同樣通過XMLRPC向master注冊(cè)自己的信息,包含需要訂閱的話題名;

3.master進(jìn)行匹配

master根據(jù)listener的訂閱信息從注冊(cè)列表中查找,如果沒有找到匹配的發(fā)布者,則等待發(fā)布者的加入,如果找到匹配的發(fā)布者信息,則通過XMLRPC向listener發(fā)送talker的地址信息。

4.listener發(fā)送連接請(qǐng)求

listener接收到master發(fā)回的talker地址信息,嘗試通過XMLRPC向talker發(fā)送連接請(qǐng)求,傳輸訂閱的話題名、消息類型以及通信協(xié)議(TCP或者UDP);

5.talker確認(rèn)連接請(qǐng)求

talker接收到listener發(fā)送的連接請(qǐng)求后,繼續(xù)通過XMLRPC向listener確認(rèn)連接信息,其中包含自身的TCP地址信息;

6.listener嘗試與talker建立連接

listener接收到確認(rèn)信息后,使用TCP嘗試與talker建立網(wǎng)絡(luò)連接。

7.talker向listener發(fā)布消息

成功建立連接后,talker開始向listener發(fā)送話題消息數(shù)據(jù),master不再參與。

從上面的分析中可以發(fā)現(xiàn),前五個(gè)步驟使用的通信協(xié)議都是XMLRPC,最后發(fā)布數(shù)據(jù)的過程才使用到TCP。

master只在節(jié)點(diǎn)建立連接的過程中起作用,但是并不參與節(jié)點(diǎn)之間最終的數(shù)據(jù)傳輸。

節(jié)點(diǎn)在請(qǐng)求建立連接時(shí)會(huì)通過master.cpp文件中的execute()函數(shù)調(diào)用XMLRPC庫中的函數(shù)。

我們舉個(gè)例子,加入talker節(jié)點(diǎn)要發(fā)布消息,它會(huì)調(diào)用topic_manager.cpp中的TopicManager::advertise()函數(shù),在函數(shù)中會(huì)調(diào)用execute()函數(shù),該部分代碼如下。

XmlRpcValue args, result, payload;
  args[0] = this_node::getName();
  args[1] = ops.topic;
  args[2] = ops.datatype;
  args[3] = xmlrpc_manager_- >getServerURI();
  master::execute("registerPublisher", args, result, payload, true);

其中,registerPublisher就是一個(gè)遠(yuǎn)程過程調(diào)用的方法(或者叫函數(shù))。節(jié)點(diǎn)通過這個(gè)遠(yuǎn)程過程調(diào)用向master注冊(cè),表示自己要發(fā)布發(fā)消息了。

你可能會(huì)問,registerPublisher方法在哪里被執(zhí)行了呢?我們來到ros_comm-noetic-develtoolsrosmastersrcrosmaster路徑下,打開master_api.py文件,然后搜索registerPublisher這個(gè)方法,就會(huì)找到對(duì)應(yīng)的代碼,如下。

匆匆掃一眼就知道,它在通知所有訂閱這個(gè)消息的節(jié)點(diǎn),讓它們做好接收消息的準(zhǔn)備。

你可能注意到了,這個(gè)被調(diào)用的XMLRPC是用python語言實(shí)現(xiàn)的。

也就是說,XMLRPC通信時(shí)只要報(bào)文的格式是一致的,不管C++還是python語言,都可以實(shí)現(xiàn)遠(yuǎn)程調(diào)用的功能。

def registerPublisher(self, caller_id, topic, topic_type, caller_api):
        try:
            self.ps_lock.acquire()
            self.reg_manager.register_publisher(topic, caller_id, caller_api)
            # don't let '*' type squash valid typing
            if topic_type != rosgraph.names.ANYTYPE or not topic in self.topics_types:
                self.topics_types[topic] = topic_type
            pub_uris = self.publishers.get_apis(topic)
            sub_uris = self.subscribers.get_apis(topic)
            self._notify_topic_subscribers(topic, pub_uris, sub_uris)
            mloginfo("+PUB [%s] %s %s",topic, caller_id, caller_api)
            sub_uris = self.subscribers.get_apis(topic)            
        finally:
            self.ps_lock.release()
        return 1, "Registered [%s] as publisher of [%s]"%(caller_id, topic), s
聲明:本文內(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)投訴
  • 節(jié)點(diǎn)
    +關(guān)注

    關(guān)注

    0

    文章

    216

    瀏覽量

    24336
  • 管理器
    +關(guān)注

    關(guān)注

    0

    文章

    239

    瀏覽量

    18462
  • MASTER
    +關(guān)注

    關(guān)注

    0

    文章

    101

    瀏覽量

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

    關(guān)注

    1

    文章

    276

    瀏覽量

    16921
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    屬性節(jié)點(diǎn)調(diào)用節(jié)點(diǎn)的使用教程

    很多朋友對(duì)于屬性節(jié)點(diǎn)的使用表示有些不明白,但是其作用又是相當(dāng)強(qiáng)大的,所以必須明白怎么使用屬性節(jié)點(diǎn)以及如何調(diào)用的問題,下面就來為大家解迷。在獲得對(duì)象的reference之后,就可以使用屬性節(jié)點(diǎn)
    發(fā)表于 01-05 16:05

    調(diào)用庫函數(shù)節(jié)點(diǎn)

    如圖,調(diào)用出來后的庫函數(shù)節(jié)點(diǎn),怎樣配置其輸入輸出函數(shù)???
    發(fā)表于 05-13 16:35

    布爾控件觸發(fā)調(diào)用節(jié)點(diǎn)

    大神們,怎么用布爾控件觸發(fā)調(diào)用節(jié)點(diǎn)的重新初始化為默認(rèn)值?
    發(fā)表于 05-14 15:03

    通過vi調(diào)用節(jié)點(diǎn)調(diào)用vi的問題

    通過vi節(jié)點(diǎn),打開前面板,運(yùn)行vi等等。但是比如說我需要從用戶登錄界面,通過vi調(diào)用節(jié)點(diǎn),打開某個(gè)試驗(yàn)界面,同時(shí)希望是淡入淡出的效果,也就是通過設(shè)置透明度來實(shí)現(xiàn)??墒情_運(yùn)行到節(jié)點(diǎn)的時(shí)候
    發(fā)表于 08-23 21:41

    調(diào)用節(jié)點(diǎn)的求助

    調(diào)用節(jié)點(diǎn)調(diào)用方法的控件值的設(shè)置
    發(fā)表于 04-09 11:50

    屬性節(jié)點(diǎn)調(diào)用節(jié)點(diǎn)的區(qū)別?

    請(qǐng)問,屬性節(jié)點(diǎn)調(diào)用節(jié)點(diǎn)的區(qū)別?
    發(fā)表于 11-21 12:00

    調(diào)用庫函數(shù)節(jié)點(diǎn)

    調(diào)用庫函數(shù)節(jié)點(diǎn)有什么作用
    發(fā)表于 09-14 21:55

    labview 調(diào)用節(jié)點(diǎn)找不到

    請(qǐng)問,這些調(diào)用節(jié)點(diǎn)怎么找不到,好惱火
    發(fā)表于 02-22 20:29

    labview dll節(jié)點(diǎn)調(diào)用的問題

    調(diào)用節(jié)點(diǎn)的時(shí)候出現(xiàn)這種情況怎么解決?
    發(fā)表于 04-16 14:44

    labview的matlab節(jié)點(diǎn)能否調(diào)用互相調(diào)用的matlab程序

    labview的matlab節(jié)點(diǎn)能否調(diào)用互相調(diào)用的matlab程序
    發(fā)表于 07-09 19:54

    labview 調(diào)用DLL節(jié)點(diǎn)出錯(cuò)

    [問答] labview 調(diào)用DLL節(jié)點(diǎn)出錯(cuò)提示 錯(cuò)誤1517labview :(Hex 0x5ED)調(diào)用節(jié)點(diǎn)發(fā)生錯(cuò)誤不知道哪位大神能幫忙解決一下回
    發(fā)表于 11-12 18:39

    屬性節(jié)點(diǎn)調(diào)用節(jié)點(diǎn)的動(dòng)態(tài)引用問題

    本帖最后由 蕭獵 于 2021-9-10 16:27 編輯 各位大神: 目前關(guān)于屬性節(jié)點(diǎn)調(diào)用節(jié)點(diǎn)的引用問題,有靜態(tài)引用,即如下圖:也有先將各引用常量組織成數(shù)組,通過對(duì)數(shù)組的處理,動(dòng)態(tài)的按程序
    發(fā)表于 09-07 14:39

    ROS中XMLRPC是什么

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

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

    XMLRPC的C++代碼在下載后的ros_comm-noetic-develutilitiesxmlrpcpp路徑下。 還好,整個(gè)工程不算太大。XMLRPC分成客戶端和服務(wù)器端兩大部分。 咱們先看
    的頭像 發(fā)表于 09-14 17:45 ?653次閱讀

    ROS中節(jié)點(diǎn)管理器master是如何被啟動(dòng)的

    我們來看看節(jié)點(diǎn)管理器master是如何被啟動(dòng)的,再回到parent.pystart()函數(shù),如下。 我們發(fā)現(xiàn)它啟動(dòng)了XMLRPC服務(wù)器后,接下來就調(diào)用了_init_runner()函數(shù)。 def
    的頭像 發(fā)表于 09-14 18:03 ?1569次閱讀