1

我一直致力于在 Volttron 中培养我的代理开发技能。我对该平台完全陌生,并试图了解如何创建发布和订阅 Volttron 总线的基本代理。在这个冒险中,我并不孤单,并从其他一些有经验的人那里得到帮助,但即使是他们也很难过。我们使用通过 GitHub 共享的相同代理文件,但代理在他们的计算机上工作,而不是在我的计算机上工作。

发布代理从与代理位于同一目录中的 CSV 文件中读取数据,并假设从该文件中发布信息。我一直小心地在我的源代码中映射文件目录以匹配我的设置。当我开始使用在 Linux Mint 18.1 Serena 上运行的 eclipse“mars”运行我的发布代理时,我收到以下消息:

2017-02-02 14:27:22,290 volttron.platform.agent.utils 调试:缺少文件 /home/edward/.volttron/keystores/f9d18589-d62b-42b7-bac8-3498a0c37220/keystore.json

2017-02-02 14:27:22,290 volttron.platform.agent.utils 信息:创建文件 /home/edward/.volttron/keystores/f9d18589-d62b-42b7-bac8-3498a0c37220/keystore.json

2017-02-02 14:27:22,292 volttron.platform.vip.agent.core 调试:地址:ipc://@/home/edward/.volttron/run/vip.socket

2017-02-02 14:27:22,292 volttron.platform.vip.agent.core 调试:身份:无

2017-02-02 14:27:22,292 volttron.platform.vip.agent.core 调试:agent_uuid:无

2017-02-02 14:27:22,292 volttron.platform.vip.agent.core 调试:severkey:无

2017-02-02 14:27:32,324 volttron.platform.vip.agent.core 错误:10 秒后没有响应 hello 消息。

2017-02-02 14:27:32,324 volttron.platform.vip.agent.core 错误:常见原因是 VIP 身份冲突。

2017-02-02 14:27:32,324 volttron.platform.vip.agent.core 错误:关闭代理。

2017-02-02 14:27:32,324 volttron.platform.vip.agent.core 错误:可能的冲突身份是:f9d18589-d62b-42b7-bac8-3498a0c37220

我做了以下事情:

  1. 创建了丢失的文件“/home/edward/.volttron/keystores/f9d18589-d62b-42b7-bac8-3498a0c37220/keystore.json”。当我再次运行代理时,唯一发生的事情是它给了我相同的调试消息,但文件名不同。

  2. 我查看了“volttron.platform.vip.agent.core”文件,不知道在那里做什么。我不想给自己制造更多的问题。

  3. 我一直在使用“Volttron 的文档”来尝试排除故障,但是当我尝试运行任何代理时,我总是会收到相同的消息。我在测试平台并通过终端运行“make-listener”时取得了成功,但仅此而已。

  4. 最近几天我一直在网上搜索并看到类似的问题,但是在尝试按照发布的建议来解决这种情况时,我没有运气。 错误:volttron.platform.web 信息:Web 服务器未启动

  5. 在我的虚拟机上重新安装 Volttron、Mint 和 Eclipse 几次以克服任何兼容性问题......

代理源代码如下:

#testcodeisforpublishingandprinting
import logging
import sys
#import json
from volttron.platform.vip.agent import Agent, Core, PubSub, compat
#from volttron.platform.vip.agent import *
#from volttron.platform.vip.agent import compat
from volttron.platform.agent import utils
from volttron.platform.messaging import headers as headers_mod
from datetime import datetime
#import numpy as NP
#from numpy import linalg as LA

import csv
outdata=open("/home/edward/volttron/testagent/Agent/PredictionfileP.csv","rb")    
Pdata=csv.DictReader(outdata)
Price=[]
for row in Pdata:
    Price.append(float(row['Price'])*0.01)

#from volttron.platform.agent import BaseAgent, PublishMixin, periodic, matching, utils
#from volttron.platform.agent import BaseAgent, PublishMixin, periodic

utils.setup_logging()
_log = logging.getLogger(__name__)

class testagent1(Agent):
    def __init__(self, config_path, **kwargs):
        self.config = utils.load_config(config_path)
        super(testagent1, self).__init__(**kwargs)
        self.step=0
        #print('TestAgent example agent start-up function')
    @Core.receiver('onsetup')
    def onsetup(self, sender, **kwargs):
        self._agent_id = self.config['agentid']
    @Core.receiver('onstart')
    def onstart(self, sender, **kwargs):
        pass       
    @Core.receiver('onstop')
    def onstop(self, sender, **kwargs):
        pass    
    @Core.receiver('onfinish')
    def onfinish(self, sender, **kwargs):
        pass
    @Core.periodic(5)
    def simulate(self):
        self.step=self.step+1#timestep increase
        print('Simulationrunning')
    
        now = datetime.utcnow().isoformat(' ')#time now
        headers = {
            'AgentID': self._agent_id,
            headers_mod.CONTENT_TYPE: headers_mod.CONTENT_TYPE.PLAIN_TEXT,
            headers_mod.DATE: now,
        }
        print(self.step)
        self.vip.pubsub.publish('pubsub', 'testcase1/Step', headers, self.step) 
        print('Simulationupdatingloopingindex')
def main(argv=sys.argv):
    '''Main method called by the eggsecutable.'''
    try:
        utils.vip_main(testagent1)
    except Exception as e:
        _log.exception('unhandled exception')


if __name__ == '__main__':
    # Entry point for script
    sys.exit(main())

我使用 2017 年 1 月发布的 3.5RC1 手册安装了我的 Volttron 版本。

4

1 回答 1

1

我假设您是从 Eclipse 运行它,而不是通过安装过程。代理的安装将指定一个身份,该身份将在代理的生命周期内保留。

剩下的答案是特定于在 eclipse 环境中运行的。

def main(argv=sys.argv):
    '''Main method called by the eggsecutable.'''
    try:
        # This is where the change is.
        utils.vip_main(testagent1, identity='Thisidentity')
    except Exception as e:
        _log.exception('unhandled exception')

您必须通过身份验证机制添加代理公钥,授权代理能够连接到消息总线。或者,您可以通过 volttron-ctl auth add 将通配符 /.*/ 添加到条目的凭据中。

谢谢你问这个问题。我们将更新文档以突出显示这一点。

您将需要在命令行中执行以下操作:

volttron-ctl auth add
domain []: 
address []: 
user_id []: 
capabilities (delimit multiple entries with comma) []: 
roles (delimit multiple entries with comma) []: 
groups (delimit multiple entries with comma) []: 
mechanism [CURVE]: 
credentials []: /.*/
comments []: 
enabled [True]: 
added entry domain=None, address=None, mechanism='CURVE', credentials=u'/.*/', user_id='ff6fea8e-53bd-4506-8237-fbb718aca70d'
于 2017-02-02T22:33:32.017 回答