0

我试图让代理跨远程平台实例相互交谈。例如,运行在 machine1 (192.168.1.10) 上的 Agent1 想要与运行在 machine2 (192.168.1.11) 上的具有 VOLTTRON 环境的 Agent2 通信。我认为 VOLTTRON 互连协议 (VIP) 可能是一个不错的选择来实现它,但是如何设置呢?谁能给我一个例子?

谢谢。

4

1 回答 1

0

您是想让两个代理直接交谈还是让他们将消息发布到远程总线以供另一个代理查看?如果是后者,可以在 ForwardHistorian 中看到一个例子:https ://github.com/VOLTTRON/volttron/blob/develop/services/core/ForwardHistorian/forwarder/agent.py

默认情况下,代理可以与他们的本地消息总线通信,以便与他们需要设置此连接的远程通信总线通信(其中“destination_vip”是远程 VOLTTRON 的 vip 地址,包括服务器密钥):

    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 具有设置的 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)
于 2016-08-30T14:32:21.850 回答