节点是如何调用XMLRPC的

发布时间:2023-09-14  

节点间通过XMLRPC建立连接

在一个节点刚启动的时候,它并不知道其它节点的存在,更不知道它们在交谈什么,当然也就谈不上。

所以,它要先与master对话查询其它节点的状态,然后再与其它节点通信。

而节点与master对话使用的就是XMLRPC。

从这一点来看,master叫节点管理器确实名副其实,它是一个大管家,给刚出生的节点提供服务。

下面我们以两个节点:talker和listener为例,介绍其通过XMLRPC建立通信连接的过程,如下图所示。

  1. talker注册

假设我们先启动talker。启动后,它通过1234使用XMLRPC向master注册自己的信息,包含所发布消息的名。master会将talker的注册信息加入注册列表中;

2.listener注册

listener启动后,同样通过XMLRPC向master注册自己的信息,包含需要订阅的话题名;

3.master进行匹配

master根据listener的订阅信息从注册列表中查找,如果没有找到匹配的发布者,则等待发布者的加入,如果找到匹配的发布者信息,则通过XMLRPC向listener发送talker的地址信息。

4.listener发送连接请求

listener接收到master发回的talker地址信息,尝试通过XMLRPC向talker发送连接请求,传输订阅的话题名、消息类型以及通信协议(TCP或者UDP);

5.talker确认连接请求

talker接收到listener发送的连接请求后,继续通过XMLRPC向listener确认连接信息,其中包含自身的TCP地址信息;

6.listener尝试与talker建立连接

listener接收到确认信息后,使用TCP尝试与talker建立连接。

7.talker向listener发布消息

成功建立连接后,talker开始向listener发送话题消息数据,master不再参与。

从上面的分析中可以发现,前五个步骤使用的通信协议都是XMLRPC,最后发布数据的过程才使用到TCP。

master只在节点建立连接的过程中起作用,但是并不参与节点之间最终的数据传输。

节点在请求建立连接时会通过masr.cpp文件中的execute()函数调用XMLRPC库中的函数。

我们举个例子,加入talker节点要发布消息,它会调用toc_manager.cpp中的TopicManager::verse()函数,在函数中会调用execute()函数,该部分代码如下。

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就是一个远程过程调用的方法(或者叫函数)。节点通过这个远程过程调用向master注册,表示自己要发布发消息了。

你可能会问,registerPublisher方法在哪里被执行了呢?我们来到_comm-noet-develtoolsrosmastercrosmaster路径下,打开master_api.py文件,然后搜索registerPublisher这个方法,就会找到对应的代码,如下。

匆匆扫一眼就知道,它在通知所有订阅这个消息的节点,让它们做好接收消息的准备。

你可能注意到了,这个被调用的XMLRPC是用语言实现的。

也就是说,XMLRPC通信时只要报文的格式是一致的,不管还是python语言,都可以实现远程调用的功能。

def registerPublisher(self, caller_id, topic, topic_type, caller_api):
        try:
            self.ps_lock.quire()
            self.reg_manager.register_publisher(topic, caller_id, caller_api)
            # don't let '*' type squash valid typing
            if topic_type != rosgraph.names.ANYTYPE  not topic in self.topics_types:
                self.topics_types[topic] = topic_type
            pub_uris = self.publishers.get_apis(topic)
            _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
文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>