У меня есть платформа A и платформа B, и я хочу вызвать метод RPC на платформе A с платформы B. Обратите внимание, что я уже читал этот вопрос: Как в VOLTTRON использовать VIP, чтобы заставить агентов разговаривать между удаленными экземплярами платформы? Мне кажется, что это может быть устаревшим, поскольку в нем ничего не упоминается о файле известных хостов и новом интерфейсе добавления аутентификации volttron-ctl. Также мне все еще нужно включать этот массивный URL-адрес, упомянутый в комментариях, с параметрами serverkey, secretkey? Я также прочитал исходный код SimpleForwarder: https://github.com/VOLTTRON/volttron/blob/5cc71e9982338e242bf801da372aa66ed14abbd9/examples/SimpleForwarder/simpleforwarder/simpleforwarder.py URL-адрес для подключения VIP в этом примере: "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), надеюсь, шаг за шагом?
Вызов метода @RPC на удаленной платформе
Ответы (1)
Вызов вызова RPC на удаленном агенте очень похож на выполнение публикации/подписки на другой платформе. Рабочий пример можно найти в DataMover, который вызывает метод RPC на удаленном архиваторе.
Сначала он получает ключ сервера для пункта назначения, если он находится в файле известных хостов:
hosts = KnownHostsStore()
serverkey = hosts.serverkey(destination_vip)
Если нет, он получит его из файла конфигурации агента.
Затем его метод history_setup использует метод building_agent в заголовке утилиты агента vip для создания ссылки на другую платформу путем передачи адреса, ключа сервера, открытого и секретного ключа, поэтому вам не нужно создавать 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)
Шаги для этого процесса:
- Запустите PlatformA с запущенным TargetAgent.
- Получить ключ сервера для PlatformA с помощью:
vctl auth serverkey
- Стартовая платформаB
Добавьте платформу A к известным хостам на платформе B:
vctl add-known-host --host tcp://tcp://xxx.xxx.xxx.xxx:YYYY --serverkey SERVERKEY_FOR_A
или настройте агент отправки на платформе B с ключом сервера из шага 2, виртуальный IP-адрес назначения для платформы A (tcp://xxx.xxx.xxx.xxx:YYYY)Установите SendingAgent на платформе B
- Получите открытый ключ для SendingAgent с помощью:
vctl auth publickey
- Добавьте учетные данные SendingAgent в PlatformA с помощью:
vctl auth add
SendingAgent теперь должен иметь возможность вызывать методы RPC для TargetAgent.