Python 使用pysnmp从MIB文本约定转换OID值对

Python 使用pysnmp从MIB文本约定转换OID值对,python,snmp,mib,pysnmp,Python,Snmp,Mib,Pysnmp,我试图编写一段代码,接受一个JSON对象,其中OID作为键,OID值作为值。例如: {".1.3.6.1.4.1.562.29.6.2.3": "Link Down", ... } 当接收到这个JSON对象时,我想使用PySNMP翻译OID和OID值,但我不知道如何根据相应MIB文件中定义的文本约定翻译OID值 示例MIB文件将定义: TruthValue ::= TEXTUAL-CONVENTION STATUS current DESCRIPTION

我试图编写一段代码,接受一个JSON对象,其中OID作为键,OID值作为值。例如:

{".1.3.6.1.4.1.562.29.6.2.3": "Link Down",
 ...
}
当接收到这个JSON对象时,我想使用PySNMP翻译OID和OID值,但我不知道如何根据相应MIB文件中定义的文本约定翻译OID值

示例MIB文件将定义:

TruthValue ::= TEXTUAL-CONVENTION
     STATUS       current
     DESCRIPTION
             "Represents a boolean value."
     SYNTAX       INTEGER { true(1), false(2) }
给定一个OID和一个遵循上述文本约定的OID值,我想翻译:

{“OID”:1,…}
转换为
{“OID”:true,…}


这在PySNMP中可能吗?

在PySNMP中可能:

from pysnmp.smi import builder

mibBuilder = builder.MibBuilder()
TruthValue, = mibBuilder.importSymbols('SNMPv2-TC', 'TruthValue')
print(TruthValue(1).prettyPrint()) # prints 'true'
但是,通常您必须以某种方式将OID映射到值类型(其中一些可能解析为文本约定)。这可以通过对应用程序中特定OID的OID->类型映射进行硬编码,以特殊方式完成,但更通用的解决方案是使用pysnmp MIB服务:

from pysnmp.smi import view, builder

mibViewController = view.MibViewController(builder.MibBuilder())
varName = mibvar.MibVariable('1.3.6.1.6.3.10.2.1.1.0').loadMibs('SNMP-FRAMEWORK-MIB').resolveWithMib(mibViewController)
print(varName.getMibNode().getSyntax().clone('12341234'))
上述示例将获取1.3.6.1.6.3.10.2.1.1.0的值类型,并将12341234值转换为关联类型

更新:


考虑使用自pysnmp 4.3以来提供的to MIB服务,谢谢您的回复。我尝试用一个MIB文件和遵循文本约定的OID来实现您的更通用的解决方案,我从pysnmp.entity.rfc3413.oneliner import mibvar中包括
,以便访问mibvar。print语句是否应该输出转换后的OID值?对我来说,
print(varName.getMibNode().getSyntax().clone('2'))的输出是未翻译的整数
2
。是,如果:1)您正在使用的OID具有关联的文本约定类型,2)您已经加载了定义了您正在使用的OID的MIB,3)您正在尝试转换的值(例如2)具有在其文本约定中定义的符号表示。我发现使用prettyPrint()类似这样:
print(varName.getMibNode().getSyntax().clone('12341234').prettyPrint())
从我的测试MIB打印了一个翻译,但我似乎对其他MIB和
resolveWithMIB
函数有问题。我得到的是
pysnmp.smi.error.smirerror:索引NnExtAlarmEventType()的缩写OID
。最好在另一个问题中问这个问题吗?请记住,如果OID用作表索引,它必须可以转换为索引值。但这是一个完全不同的问题。代码和MIB示例也会有帮助。谢谢您的帮助!我在这里发布了另一期: