尝试使用 pysnmp 传输真正的 snmp。 如果我的主机是 Xerox 或 HP 打印机,我的代码可以正常工作,并且我可以访问变量中的 oid 值
varBinds[0][1]
:
from pysnmp.entity.rfc3413.oneliner import cmdgen # snmp requests
cmdGen = cmdgen.CommandGenerator()
modeliod = ".1.3.6.1.2.1.25.3.2.1.3.1"
hostname = "192.168.1.100"
errorIndication, errorStatus, errorIndex, varBinds = cmdGen.getCmd(
cmdgen.CommunityData('public'),
cmdgen.UdpTransportTarget((hostname, 161)),
modeliod
)
但是当我尝试访问佳能打印机的OID值时,比
errorIndication
=No SNMP response received before timeout
。另一方面,当我使用 snmpwalk
与佳能的 IP 和相同的 iod 时,我可以收到一个值。
我的平台是 Windows 10 x64。
如何解决“超时前未收到 SNMP 响应”问题?
更新1
除线:
from pysnmp import debug
debug.setLogger(debug.Debug('io', 'msgproc', 'secmod'))
调试输出很大,所以我将其粘贴在这里:https://pastebin.com/Lpyqm9NK
更新2
这似乎是 SNMP get 请求版本中的问题:当我将
snmpwalk
请求中的版本更改为 2c
时,我收到相同的错误:%Failed to get value of SNMP variable. Timeout.
所以,第二个问题是
如何更改我的代码中的 snmp 版本?
根据文档,这是一个解决方法:
from pysnmp.hlapi import *
errorIndication, errorStatus, errorIndex, varBinds = next(
getCmd(SnmpEngine(),
CommunityData('public', mpModel=0),
UdpTransportTarget((hostname, 161)),
ContextData(),
ObjectType(ObjectIdentity(modeliod))) )
确保您:
如果一切正常,请尝试启用 pysnmp 调试以查看发出的内容、进入的内容(如果有)以及佳能打印机从哪个 IP 地址进行响应。如果它从与您查询的 IP 不同的 IP 进行响应,pysnmp 将丢弃此类响应。
要启用 pysnmp 调试,请在脚本开头添加以下代码段:
from pysnmp import debug
debug.setLogger(debug.Debug('io', 'msgproc', 'secmod'))
更新:
默认使用SNMPv2c。要更改 v1 的 SNMP 版本,请将
mpModel
设置为零:
...
CommunityData('public', mpModel=0),
...