使用 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。它应该也能工作,尽管它肯定需要更多的时间和爱。
我想在 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。它应该也能工作,尽管它肯定需要更多的时间和爱。