当PySNMP的nextCmd()遍历我正在使用的表时,它按列而不是按行输出。在尝试将数据保存到对象中时,这已证明很困难。例如,在进入下一列之前,我将看到AlarmID列中的每个值。
到目前为止,我只创建了一个打印语句来输出并查看值的结构。我一直在尝试解决此问题的方法,但我的想法倾向于带我递归,但这是我尚未尝试实现的方法。
这是我正在使用的功能:
def query_alarm_table(device):
manufacturer = Manufacturer(device.manufacturer)
for (errorIndication, errorStatus, errorIndex, varBinds) in nextCmd(
SnmpEngine(),
CommunityData("public"),
UdpTransportTarget((device.ip_address, device.snmp_port_number)),
ContextData(),
ObjectType(ObjectIdentity(manufacturer.alarm_table)),
lexicographicMode=False,
):
if errorIndication:
print(errorIndication)
break
elif errorStatus:
print("%s at %s" % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or "?",))
break
else:
for oid, raw_value in varBinds:
print(f'oid: {oid} --- raw_value: {raw_value}')
上面的函数可以正确地遍历表。但是我不确定如何处理数据,就好像它是单行并将其放入数据库中的对象一样。
答案 0 :(得分:1)
也许最简单的解决方案是一次将您感兴趣的列全部传递到nextCmd
中:
nextCmd(
SnmpEngine(),
CommunityData("public"),
UdpTransportTarget((device.ip_address, device.snmp_port_number)),
ContextData(),
ObjectType(ObjectIdentity(manufacturer.alarm_table_column_1)),
ObjectType(ObjectIdentity(manufacturer.alarm_table_column_2)),
ObjectType(ObjectIdentity(manufacturer.alarm_table_column_3)),
...
)
在每次迭代中,您应该在varBinds
中的每一列(即行)中获得一个值。