2015-06-05 21 views
1

我想开发一个SNMP代理以获取/设置请求,这个请求可以与使用协议的复杂python程序“交谈”。pysnmp命令responder - 使用外部数据处理get/set请求(不是mib)

这是相当难以解释,所以我尽量做出了榜样:

SNMP接收PARAM X 它要求我的节目x 的当前值的GET请求它发送的答案,客户

我想提示一下,如何在一个可以制作decodeMsg-sendToPython-receiveFromPython-encodeMsg-sendToClient进程的单一方法中“拦截”get/set请求。

+0

还有......是什么问题?见http://stackoverflow.com/help/how-to-ask – kebs

+0

对不起,我忘了最重要的部分 –

回答

1

这样的应用程序的各种设计可能与pysnmp,都是基于CommandResponder类。也许最简单的方法是create your own MibInstrumentationController class将接收同步GET/SET/GETNEXT查询,并有望恢复响应​​变量绑定:

class EchoMibInstrumController(instrum.AbstractMibInstrumController): 
    def readVars(self, vars, acInfo=(None, None)): 
     return vars 
    def readNextVars(self, vars, acInfo=(None, None)): 
     return vars 
    def writeVars(self, vars, acInfo=(None, None)): 
     return vars 

另一种解决办法是编译MIB到pysnmp格式(与PySMI编译器)和specialize MIB variables(AKA管理对象实例),这样他们会通过某种协议,谈谈你的后端数据存储(程序)。

但是,两种方法都是同步工作的,这意味着您将阻止SNMP引擎,直到您从后端检索数据并从请求处理函数返回。如果您希望在高的并发负载和/或慢数据存储,您可能需要使用的异步运行CommandResponder类的低级别API。

也可以通过在SNMP消息处理代码的重要位置放置钩子集合tap on SNMP engine workflow。但该功能主要是为了从SNMP引擎内部获取非常具体的数据,而不是指导其操作。

+0

谢谢你,伊利亚,我想发展自己的定制MibInstrumentationController。这似乎是最简单的方式:) –