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))) )
正在尝试使用 pysnmp 传输真正的 snmp。
如果我的主机是 Xerox 或 HP 打印机,我的代码可以正常工作,并且我可以访问变量 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
)
但是当我尝试访问 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))) )