我写了一个从串行接口返回值的脚本 根据要求
snmpwalk -v2c -c '公共' 10.11.10.11 1.3.6.1.4.1.318.1.1.1.4.2.1.0 我有
SNMPv2-SMI::enterprises.318.1.1.1.4.2.1.0 = 此 MIB 视图中没有更多变量(它已超过 MIB 树的末尾)
但是如果更改 var vbs,然后返回两个 snmp vars - 一切正常
为什么我不能只返回一个值?
vbs= [
snmp_agent.VariableBinding(
'1.3.6.1.4.1.318.1.1.1.4.2.2.0', snmp_agent.TimeTicks(100))
]
这是我的代码
import asyncio
import snmp_agent
import minimalmodbus
from pprint import pprint
minimalmodbus.BAUDRATE = 9600
minimalmodbus.TIMEOUT = 0.5
registers = {
"1.3.6.1.2.1.2.2.1.10.1": {'register':108, 'multiplier':1, 'unit':'', 'name':'Get the warning code'},
"1.3.6.1.2.1.2.2.1.11.1": {'register':186, 'multiplier':1, 'unit':'', 'name':'Device serial number'},
"1.3.6.1.2.1.2.2.1.12.1": {'register':201, 'multiplier':1, 'unit':'', 'name':'Work pattern'},
"1.3.6.1.4.1.318.1.1.1.2.1.1.1": {'register':202, 'multiplier':0.1, 'unit':'V', 'name':'Effective value of municipal electric voltage'},
"1.3.6.1.4.1.318.1.1.1.2.1.1.0": {'register':203, 'multiplier':0.01, 'unit':'Hz', 'name':'Power frequency'},
"1.3.6.1.4.1.318.1.1.1.4.2.1.0": {'register':210, 'multiplier':0.1, 'unit':'V', 'name':'Output voltage effective value'},
}
print('START')
class PowMr(minimalmodbus.Instrument):
"""
Communicates using the Modbus RTU protocol (via provided USB<->RS232 cable)
"""
def __init__(self, portname, slaveaddress):
minimalmodbus.Instrument.__init__(self, portname, slaveaddress)
async def handler(req: snmp_agent.SNMPRequest) -> snmp_agent.SNMPResponse:
if req.__class__ == snmp_agent.snmp.SNMPRequest:
vbs2 = [
snmp_agent.VariableBinding(
'1.3.6.1.4.1.318.1.1.1.4.2.2.0', snmp_agent.TimeTicks(100))
]
vbs = []
for item in req.variable_bindings:
if item.oid in registers:
register_key = int(registers[item.oid]['register'])
print(req.context)
print(item.oid)
print(register_key)
measurement = int(powmr.read_register(register_key))
print(str(measurement))
vbs.append(snmp_agent.VariableBinding(item.oid, snmp_agent.Counter32(measurement)))
else:
vbs.append(snmp_agent.VariableBinding(item.oid, snmp_agent.OctetString('No Such Object available on this agent at this OID')))
res_vbs = snmp_agent.utils.handle_request(req=req, vbs=vbs)
res = req.create_response(res_vbs)
return res
async def main():
sv = snmp_agent.Server(handler=handler, host='0.0.0.0', port=161)
await sv.start()
while True:
await asyncio.sleep(3600)
loop = asyncio.get_event_loop()
powmr = PowMr('/dev/ttyUSB0', 1)
loop.run_until_complete(main())
错误信息“No more variables left in this MIB View (It is pasted the end of the MIB tree)”表示SNMP请求已经到达MIB树的末尾,没有更多的变量可以检索。
在您的代码中,您正试图检索 OID“1.3.6.1.4.1.318.1.1.1.4.2.2.0”的值,它对应于“输出当前有效值”。然而,MIB树似乎结束于“1.3.6.1.4.1.318.1.1.1.4.2.1.0”,它对应于“输出电压有效值”。
因此,当您尝试检索“输出当前有效值”OID 的值时,SNMP 代理无法在 MIB 树中找到它并返回错误。
要解决这个问题,您可能需要检查您尝试查询的设备的 MIB 树,以查看您正在查询的 OID 是否实际可用。或者,您可以尝试查询 MIB 树中可用的不同 OID。
此外,您似乎正在使用 Modbus 协议从设备读取数据,但您使用的是 SNMP 来检索数据。如果您的设备支持 SNMP,您可能需要检查是否有特定的 OID 可用于您要检索的数据。