0

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

Traceback(最近一次调用最后一次):文件“sniff.py”,第 373 行,在 sys.exit(main()) 文件“sniff.py”,第 342 行,在 main utils.vip_main(sniffer, version= version ) 文件中"/home/jenny/workspace/volttron/volttron/platform/agent/utils.py",

第 314 行,在 vip_main version=version,**kwargs) 文件“sniff.py”,第 336 行,在嗅探器中 Sniffer(**kwargs) 文件“sniff.py”,第 138 行,在init 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”,第 706 行,在 _save_parameters 事件 = self.core().schedule(end_time, self._cancel_event, result_id)
文件“/home/jenny/workspace/volttron/volttron/platform/vip/agent/core.py”,第 409 行,在计划中 self._schedule_callback(deadline ,事件)文件“/home/jenny/workspace/volttron/volttron/platform/vip/agent/core.py”,第417行,在_schedule_callback self._schedule_event.set()

AttributeError:“NoneType”对象没有属性“设置”

我找到的最接近解决方案的是RPC crash 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 创建和连接套接字。

4

1 回答 1

0

您正试图在非预期的上下文中使用 vip 模块。在触发启动代理或配置事件之前,代理的生命周期不会真正开始执行。尝试将发布放在这些上下文中。

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

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

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

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


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

于 2019-08-27T01:22:36.973 回答