使用 pysnmp 和 asyncio 作为具有延迟响应的代理

Using pysnmp with asyncio as agent with delayed response

我想在 Python 3.x 下使用 PySNMP 作为代理和 asyncio。管理器请求值,从连接的设备(想想 Modbus)获得响应需要时间。因此,作为对经理的回应,我想在我的 MibScalarInstance 中使用这样的东西:

def getValue(self, name, idx):
 result = await func_to_get_value(name, idx)
 return result

当然,这是行不通的,因为 getValue 不是异步的。

什么是正确的 asyncio 方法?

遗憾的是,当前发布的 pysnmp 不支持 SMI/MIB 端的任何异步操作。所以,我能想到的唯一解决方案是继承并覆盖 [CommandResponder.handleMgmtOperation](https://github.com/etingof/pysnmp/blob/release-4.4.13/pysnmp/entity/rfc3413/cmdrsp.py#L255,然后如果 readVars-like 函数变慢,则从那里产生。

但是,下一个(尚未发布)pysnmp 5(GitHub master)does support 异步 SMI 对象。虽然 asyncio 绑定还没有编码到 SMI 对象中,但我认为这不应该阻止你屈服。

考虑到缺少文档,here 是一个 Jinja 模板,可以从 SNMP MIB 生成 pysnmp5 MIB 实例 类。手动创建的代码(对于 pysnmp 5)可能看起来类似,但它可以从任何存根方法中产生。

还有一个更大的努力来制作一个通用的和可扩展的SNMP command responder。它应该也能工作,尽管它肯定需要更多的时间和爱。