【问题标题】:Using pysnmp with asyncio as agent with delayed response使用带有 asyncio 的 pysnmp 作为延迟响应的代理
【发布时间】:2020-01-26 23:49:30
【问题描述】:

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

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

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

什么是正确的异步方法?

【问题讨论】:

  • 我不确定我是否理解你想要做什么,你能详细说明一下吗?
  • @AlexanderCécile 我想实现与某些 Modbus 设备通信的 SNMP 代理,可以使用特定命令重置。 SNMP Manager 向 Agent 发出这样的复位请求,但是 Agent 只能在 Modbus 设备确认(或不确认)复位命令后才响应 Manager。 PySNMP 是否支持这种情况以及如何支持?

标签: python pysnmp python-asyncio


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多