我从代理中读取整数变量,如下所示:
ss = netsnmp.Session(Version=2, DestHost=ip, Community='public')
oid = '...'
vb = netsnmp.Varbind(oid, '0')
vl = netsnmp.VarList(vb)
int_val = ss.get(vl)
我将查询结果转换为整数类型:
return int(int_val[0])
一切正常。尝试对float做同样的事情:
ss = netsnmp.Session(Version=2, DestHost=ip, Community='public')
oid = '...'
vb = netsnmp.Varbind(oid, '0',None,'OPAQUE')
vl = netsnmp.VarList(vb)
float_val = ss.get(vl)
然后转换:
float(float_val[0])
然而,这行不通!抛出一个错误:
translate_asn_type: unhandled asn type (120)
当试图转换一个空值时,程序会中断:
float(float_val[0])
ValueError: could not convert string to float:
问题:如何正确读/写浮点值?
- Linux Ubuntu 16.04
- 蟒蛇 3.5
- NetSNMP 是该站点的最新版本。
我认为我的经验——“大错之子”可能对其他人有用。所以我自己回答。
我尝试了五个使用 SNMP 的 Python 库:
在尝试读取浮点值时,只有其中一个没有使 pysnmp 崩溃。但是,返回的值看起来不是很好:字符串 (!!!) '0x9f780441703344'。
我很快意识到这只不过是一个 TLV 结构:
对于这样的类型: 9f 是代码大于 31 的复杂类型的符号。 78 是代码 120 的十六进制表示法,这是库诅咒的。
好吧,长度很清楚 - 浮动字的 4 个字节。
但价值本身不得不修补。最后转换成这样:
power = (snmp_get_next(community, ip_address, port_snmp, OID_power))
bar = bytes.fromhex(power[8:])
print('Power = ', struct.unpack('>f', bar) )
那些。我从 STRING 中取出所有字节,从第 8 个字节开始,将它们从字符十六进制表示转换为 4 个字节,将字节解压缩为大端格式的浮点数。
之后,我仔细研究了 PySNMP 库。该库具有以下功能:
总之,我认为是最好的图书馆。