How to use RPC with Volttron(如何将RPC与Volttron配合使用)
问题描述
我希望在我的Volttron应用程序中使用RPC调用,但我无法使任何调用工作。所有呼叫均失败,并显示"无路由至主机"错误
<stderr> ERROR: Unreachable: VIP error (113): No route to host: rpcserver.agent_1
本质上有两个代理,一个导出RPC过程的"服务器"代理,以及一个调用该过程的"客户端"代理。
在"服务器"代理中,我导出了代理类的一个方法,如下所示:
@RPC.export('setConfig')
def setConfig(self, config):
self.config = config
self.initialize_device()
客户端代理按如下方式调用导出的方法:
self.vip.rpc.call(sender, 'setConfig', self.config[sender]).get()
其中,"sender"是"服务器"代理的VIP标识(原来是"rpcserver.agent_1",对应于从rpcserver.agent接收发布订阅消息时的"sender"参数的值。我已在标识文件中将标识定义为rpcserver.agent_{n})。
我的问题是:
1.为了正确设置RPC子系统,我是否做了一些明显的错误或遗漏了某些步骤?
2.self.vip.rpc.call(peer, method, ...)
中的"Peer"参数是否预期为代理的身份?这在文档中不清楚(我尝试了其他选项,如代理名称或UUID,但都不起作用)
我在Ubuntu VM上运行的是volttron 5.1.0。
在这方面的任何帮助都将不胜感激。 致以最良好的问候
详细信息:
这适用于互连多个设备的控制应用程序。代理根据网络中的可用设备动态加载。我想尝试使用RPC,而不是只使用pubSub。到目前为止,我已经相当彻底地搜索了Volttron代码和文档,以获取有关RPC API的详细信息,但一无所获。
最小"服务器"类:
class rpcServerAgent(Agent):
def __init__(self, config, **kwargs):
super(rpcServerAgent, self).__init__(**kwargs)
self.config = config
@Core.receiver('onstart')
def onstart(self, sender, **kwargs):
self.vip.rpc.export(self.setConfig, name='setConfig') # Also tried online exporting
# Ask the client to call the exported procedure
myutils.publish(self, topic='rpc/test', message={}) # myutils.publish publishes the message on pubsub
@RPC.export('setConfig')
def setConfig(self, config):
self.config = config
self.initialize_device()
myutils.publish(self, topic='rpc/clientready')
def initialize_device(self):
pass
最小"客户端"类:
class rpcClientAgent(Agent):
def __init__(self, config, **kwargs):
super(rpcClientAgent, self).__init__(**kwargs)
self.config = {'rpcclient.agent_1': {'a': 0, 'b': 1}} # dummy config for rpcclient.agent
@Core.receiver('onstart')
def onstart(self, sender, **kwargs):
self.vip.pubsub.subscribe(peer='pubsub',
prefix='rpc',
callback=self.__handle_request__).get(timeout=5)
def call_RPC(self, sender):
sender = sender.strip() # volttron adds a newline at the end
self.vip.rpc.call(sender, 'setConfig', self.config[sender]).get() # assume that self.config[sender] is well-defined
@PubSub.subscribe('pubsub', 'rpc')
def __handle_request__(self, peer, sender, bus, topic, headers, message):
try:
msg = json.loads(message)
except:
raise ValueError("failed to decode message")
topics = topic.split('/')
if len(topics) > 1:
if topics[0] == 'rpc':
if topics[1] == 'test':
self.call_RPC(sender)
预期行为:调用导出的函数并发布主题为"RPC/ClientReady"的发布消息。
实际行为:RPC调用失败,错误为"Unreacable:VIP Error(113):No Routing to host:rpcclient.agent_1"
编辑 我最终发现问题在于Volttron内部的代理身份以‘’结尾 ‘性格。这是因为Gedit自动添加了它,显然,字符串没有被Volttron剥离。
rpc
关于如何创建一个推荐答案方法,我想说您已经正确地做了一些事情(尽管:
@RPC.export('setConfig')
可能是:
@RPC.export
因为您没有更改方法名称)。
就进行RPC调用而言,第一个参数实际上是代理标识或地址。
如果您想查看更多示例,请查看services/core/MasterDriverAgent/master_driver/interfaces.中的MODBUS或BACnet驱动程序其他几点注意事项:
配置存储可用于设置代理配置。这方面的例子可以在volttron/Platform/agent/base_weather.py(以及许多其他代理)中找到
虽然我不是很熟悉,但您尝试做的事情似乎可以通过利用主驱动程序的功能来实现。我相信Market Service代理可能与您正在尝试实现的目标具有相同的设计功能,它可以在Services/core/MarketServiceAgent中找到。
这篇关于如何将RPC与Volttron配合使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何将RPC与Volttron配合使用
- 基于多个一级列的子集多索引DataFrame 2022-09-22
- H5py:如何在HDF5组和数据集上使用key()循环 2022-09-21
- 获取多索引中某个级别的最后一个元素 2022-09-22
- 为什么切换屏幕在Kivy中不起作用? 2022-09-21
- 将文件从Azure文件加载到Azure数据库 2022-09-21
- 合并具有多个索引和列值的数据帧 2022-09-22
- 如何命名HDF5数据集中的列? 2022-09-21
- 如何防止Groupby超越指数? 2022-09-22
- 使用带有CROSS_VAL_SCORE的自定义估计器失败 2022-09-21
- 如何将属性添加到作为组存储在HDF5文件中的 pa 2022-09-21