我正在尝试让代理通过远程平台实例相互通信。例如,在machine1(192.168.1.10)上运行的Agent1想要与使用VOLTTRON环境的machine2(192.168.1.11)上运行的Agent2通信。我认为VOLTTRON互连协议(VIP)可能是实现它的不错选择,但是如何设置呢?有人能告诉我一个例子吗?
感谢。
答案 0 :(得分:0)
您是否正在尝试让两个座席直接对话,或者他们的目标是将消息发布到远程总线以供其他座席查看?如果是后者,您可以在ForwardHistorian中看到一个示例:https://github.com/VOLTTRON/volttron/blob/develop/services/core/ForwardHistorian/forwarder/agent.py
默认情况下,代理可以与其本地消息总线通信,以便与需要设置此连接的远程通信对话(其中“destination_vip”是远程VOLTTRON的vip地址,包括serverkey):
agent = Agent(address=destination_vip)
event = gevent.event.Event()
agent.core.onstart.connect(lambda *a, **kw: event.set(), event)
gevent.spawn(agent.core.run)
event.wait()
然后他们可以使用它来发布或订阅该总线:
self._target_platform.vip.pubsub.publish(peer='pubsub',
topic="MyTopic",
message="Some message").get()
使用这些方法,代理可以发布和订阅远程消息总线,并以与本地总线相同的方式与其进行交互。
如果您正在寻找如何直接调用其他代理,那么与ActuatorAgent交互的SchedulerExample提供了一个示例:https://github.com/VOLTTRON/volttron/blob/develop/examples/SchedulerExample/schedule_example/agent.py
该调用类似于上面的pub / sub示例,只是它使用了rpc子系统。呼叫代理使用目标代理的VIP标识,要调用的方法以及参数。 ActuatorAgent具有set vip标识,使其更容易调用,并且在“set_point”方法上具有“@ RPC.export”装饰器。
result = self._target_platform.vip.rpc.call(
'platform.actuator',
'set_point',
agent_id,
'campus/building/unit3/some_point',
'0.0').get(timeout=10)