尝试发布时,Volttron引发属性错误

时间:2019-08-26 21:53:13

标签: volttron

我正在将Scapy与Volttron结合使用,当一个数据包进入并具有某些功能时,我想发布一个主题。但是,我一直遇到此错误:

  

回溯(最近一次通话最后一次):文件“ sniff.py”,行373,在          sys.exit(main())文件“ sniff.py”,位于主行中的第342行   utils.vip_main(sniffer,version = 版本)文件“ /home/jenny/workspace/volttron/volttron/platform/agent/utils.py”,

     

第314行,在vip_main中       version = version,** kwargs)嗅探器中的文件“ sniff.py”,第336行       嗅探器(** kwargs)文件“ sniff.py”,第138行,位于初始中       self.vip.pubsub.publish('pubsub',“ some / topic”,message =“ blah”)
  文件“ /home/jenny/workspace/volttron/volttron/platform/vip/agent/subsystems/pubsub.py”,

     

第602行,已发布       self._save_parameters(result.ident,** kwargs)
  文件“ /home/jenny/workspace/volttron/volttron/platform/vip/agent/subsystems/pubsub.py”,   _save_parameters中的第706行       event = self.core()。schedule(end_time,self._cancel_event,result_id)
  文件“ /home/jenny/workspace/volttron/volttron/platform/vip/agent/core.py”,   时间表中的第409行       self._schedule_callback(截止日期,事件)文件“ /home/jenny/workspace/volttron/volttron/platform/vip/agent/core.py”,   _schedule_callback中的第417行       self._schedule_event.set()

     

AttributeError:'NoneType'对象没有属性'set'

最接近我找到的解决方案的地方是RPC crashes with AttributeError: 'NoneType' object has no attribute 'call'。但是,我注意到它们不是完全相同的问题,因此当我尝试那里提供的解决方案时,并没有太大的惊喜,但对我而言它不起作用。

我的代码如下:

def sniffer(config_path, **kwargs):

    ''' Initializations '''
    global pkt_counter
    global IP_counter
    # Defined other parameters here

    class Sniffer(Agent):
        def __init__(self, **kwargs):
            super(Sniffer, self).__init__(**kwargs)
            # I am just testing the publish function here
            self.vip.pubsub.publish('pubsub', "some/topic", message="blah")
            sniff(count=0, iface=conf.iface, prn = self.pkt_action, store=0)


        def pkt_action(self, pkt):
            #Process every packet, updates values and rises and alert if necessary 
            # some checks are run here and later a publish is called

有人可以让我知道我在做什么错吗?

编辑:我没有添加我要运行此脚本的方法,就像在终端上运行一个简单的python脚本(例如python somescript.py):没有安装。我尝试执行此操作的原因是,在安装代理并启动它时出现错误。该平台不允许Scapy创建并连接到套接字。

1 个答案:

答案 0 :(得分:0)

您正试图在意想不到的环境中使用vip模块。直到启动启动代理或配置事件,代理的生命周期才真正开始执行。尝试将发布放在这些上下文中。

以下摘录来自VOLTTRON readthedocs网站:https://volttron.readthedocs.io/en/develop/devguides/agent_development/Agent-Development-Cheatsheet.html#agent-lifecycle-events

  

核心代理功能   这些工具volttron.platform.vip.agent模块。尝试导入

     

代理生命周期事件   每个代理都有四个在其生命的不同阶段触发的事件。这些>是启动,启动,停止和完成。注册这些事件的回调在代理开发中很常见,其中onstart是最常用的。

     

注册回调的最简单方法是使用函数装饰器:


@Core.receiver('onstart')
def function(self, sender, **kwargs):
    function_body