我正在使用PySNMP通过以下基本代码(为保密起见,取出特定值)在设备上遍历一组OID:
|-- a: string (nullable = true)
|-- b: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- cNested: long (nullable = true)
| | |-- aNested: long (nullable = true)
| | |-- bNested: string (nullable = true)
|-- cDate: string(nullable = true)
让我陷入困境的是,这确实适用于许多设备-但是在某些设备上,我得到以下结果:
import base64
from pysnmp.hlapi import *
for (errorIndication,
errorStatus,
errorIndex,
varBinds) in nextCmd(SnmpEngine(),
CommunityData(community, mpModel=1),
UdpTransportTarget((device_name, 161)),
ContextData(),
ObjectType(ObjectIdentity(walking_oid)),
lexicographicMode=False,
ignoreIncreasingOids=True):
print(str(errorIndication))
for varBind in varBinds:
print(str(varBind))
这表示同时存在错误(SNMP超时)和varBinds值。我不确定空的varBind值的含义,也不确定为什么即使出现错误,为什么仍然会打印varBind(尽管是空的)。另外,当手动查询该设备以获取相同信息时,将获得实际值。假设所有输入信息(名称,社区,型号,端口等)均正确,是否还有其他可能导致此问题的原因?
答案 0 :(得分:0)
一旦errorIndication
的计算结果为True
,其余的收益应被忽略。如果没有响应,为什么要使用varBinds
?
由于返回errorIndication
(即作为元组)的方式,也有必要为varBinds
返回一些内容。
在SNMP中,请求中变量绑定的数量和顺序经常与响应中的匹配(可能是因为在许多情况下,error-index
参数用于指向麻烦的var-binds)。即使在超时的情况下,也只是为了保持一致性而将请求变量绑定放入响应中。这就是为什么它们不携带任何响应值,而只是OID的原因。
如果设备运行缓慢,是否可能会增加pysnmp中的响应超时?否则,启用pysnmp调试可能会揭示幕后情况。