pysnmp: 打印机 Canon returns 错误 "No SNMP response received before timeout" (Xerox 和 HP 都可以)

pysnmp: printer Canon returns error "No SNMP response received before timeout" (Xerox and HP are ok)

正在尝试使用 pysnmp 传输真正的 snmp。 如果我的主机是 Xerox 或 HP 打印机,我的代码可以正常工作,并且我可以访问变量 varBinds[0][1]:

中的 oid 值
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
    )

但是当我尝试访问 Canon 打印机的 OID 值时,errorIndication = No SNMP response received before timeout。另一方面,当我将 snmpwalk 与佳能的 IP 和相同的 iod 一起使用时,我可以收到一个值。

我的平台是 Windows 10 x64.

如何解决问题 "No SNMP response received before timeout"?

更新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 的版本?

确保您:

  • 为您的佳能打印机使用正确的 IP、SNMP 社区名称和 SNMP 版本(1 对 2c)
  • 您的 Canon 打印机提供您尝试获取的 OID (1.3.6.1.2.1.25.3.2.1.3.1)
  • 您没有某种基于主机的防火墙专门阻止来自您的脚本的流量 %-)

如果一切正常,请尝试启用 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),
...

根据文档,这是一个解决方法: http://snmplabs.com/pysnmp/examples/hlapi/asyncore/sync/manager/cmdgen/snmp-versions.html

from pysnmp.hlapi import *
errorIndication, errorStatus, errorIndex, varBinds = next(
    getCmd(SnmpEngine(),
           CommunityData('public', mpModel=0),
           UdpTransportTarget((hostname, 161)),
           ContextData(),
           ObjectType(ObjectIdentity(modeliod))) )