此 MIB 视图中没有更多变量

问题描述 投票:0回答:1

我写了一个从串行接口返回值的脚本 根据要求

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())
python snmp
1个回答
0
投票

错误信息“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 可用于您要检索的数据。

© www.soinside.com 2019 - 2024. All rights reserved.