В VOLTTRON, как использовать VIP, чтобы агенты общались через удаленные экземпляры платформы?

Я пытаюсь заставить агентов общаться друг с другом через удаленные экземпляры платформы. Например, Агент1, работающий на машине1 (192.168.1.10), хочет связаться с Агентом2, работающим на машине2 (192.168.1.11) со средой VOLTTRON. Я думаю, что VOLTTRON Interconnect Protocol (VIP) может быть хорошим выбором для реализации этого, но как его настроить? Кто-нибудь может показать мне пример?

Благодарю.

1 ответ

Вы пытаетесь поговорить с двумя агентами напрямую, или цель состоит в том, чтобы опубликовать сообщения на удаленной шине, чтобы другой агент мог их увидеть? Если это последний, вы можете увидеть пример в ForwardHistorian: https://github.com/VOLTTRON/volttron/blob/develop/services/core/ForwardHistorian/forwarder/agent.py

По умолчанию агенты могут общаться со своей локальной шиной сообщений, для связи с удаленной им необходимо настроить это соединение (где "destination_vip" - это vip-адрес удаленного VOLTTRON, включая ключ сервера):

    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()

Используя эти методы, агенты могут публиковать и подписываться на удаленную шину сообщений и взаимодействовать с ней так же, как с локальной шиной.

Если вы ищете способ прямого вызова другого агента, то SchedulerExample, взаимодействующий с ActuatorAgent, предоставляет пример: https://github.com/VOLTTRON/volttron/blob/develop/examples/SchedulerExample/schedule_example/agent.py

Вызов аналогичен приведенному выше примеру pub / sub за исключением того, что он использует подсистему rpc. Вызывающий агент использует VIP-идентификатор целевого агента, метод, который он хочет вызвать, и параметры. ActuatorAgent имеет установленный идентификатор vip, облегчающий вызов, и имеет декоратор "@RPC.export" поверх метода "set_point".

            result =  self._target_platform.vip.rpc.call(
                                   'platform.actuator', 
                                   'set_point',
                                   agent_id, 
                                   'campus/building/unit3/some_point',
                                   '0.0').get(timeout=10)
Другие вопросы по тегам