我有平台 A 和平台 B,我想从平台 B 调用平台 A 上的 RPC 方法。注意我已经读过这个问题: 在 VOLTTRON,如何使用 VIP 让代理跨远程平台实例进行通信? 我觉得这可能已经过时了,因为它没有提到任何关于已知主机文件和新的 volttron-ctl auth add 接口的信息。另外,我是否还必须将评论中提到的大量 url 与 serverkey、secretkey 参数一起包含在内?我还阅读了 SimpleForwarder 源代码: https ://github.com/VOLTTRON/volttron/blob/5cc71e9982338e242bf801da372aa66ed14abbd9/examples/SimpleForwarder/simpleforwarder/simpleforwarder.py 此示例中 vip 连接的 url 是:“destination-vip”:“ipc://@/tmp/v4home/run/vip.socket”,但这与堆栈溢出问题中提供的答案不匹配。 http://volttron.readthedocs.io/en/4.1/core_services/messagebus/VIP/VIP-Authentication.html 文档中的这一部分提供了一些关于如何通过 vip 进行身份验证的信息,但是需要哪些步骤才能调用另一个平台上的代理中的 RPC?有人可以澄清一下更新的方法(对于volttron 4.1),希望能一步一步吗?
1 回答
在远程代理上调用 RPC 调用与在另一个平台上执行 pub/sub 非常相似。对于一个工作示例,您可以参考DataMover代理,该代理在远程历史数据库上调用 RPC 方法。
首先,如果它在已知的主机文件中,它会获取目标的服务器密钥:
hosts = KnownHostsStore()
serverkey = hosts.serverkey(destination_vip)
如果没有,它将从代理配置文件中获取。
然后,它的 historian_setup 方法使用vip agent utils中的 building_agent 方法通过传入地址、serverkey、public 和 secret 密钥来创建到另一个平台的链接,这样您就不必构造 URL。
self._target_platform = build_agent(address=self.destination_vip,
serverkey=self.destination_serverkey,
publickey=self.core.publickey,
secretkey=self.core.secretkey,
enable_store=False)
然后,当它进行发布时,它会调用:
self._target_platform.vip.rpc.call(
self.destination_historian_identity, 'insert',
to_send).get(timeout=10)
此过程的步骤是:
- 在 TargetAgent 运行的情况下启动 PlatformA。
- 使用以下命令检索 PlatformA 的服务器密钥:
vctl auth serverkey
- 启动平台B
将 PlatformA 添加到 PlatformB 上的已知主机:
vctl add-known-host --host tcp://tcp://xxx.xxx.xxx.xxx:YYYY --serverkey SERVERKEY_FOR_A
或使用步骤 2 中的 serverkey 配置 PlatformB 上的 SendingAgent,PlatformA 的目标 VIP 地址 (tcp://xxx.xxx.xxx.xxx:YYYY)在 PlatformB 上安装 SendingAgent
- 使用以下命令检索 SendingAgent 的公钥:
vctl auth publickey
- 使用以下命令将 SendingAgent 的凭据添加到 PlatformA:
vctl auth add
SendingAgent 现在应该能够调用 TargetAgent 上的 RPC 方法