开发者社区 问答 正文

snmpGet和snmpWalk获得不同的值

对于相同的snmp oid,walk和getNext方法获取OctetString类型的数据,而get方法获取Integer类型的数据,这是不正确的。

这两种类型的数据值不同

为什么会有不同类型的数据?

如何使用get方法获取此OctetString类型的数据?

展开
收起
垚tutu 2019-12-04 16:35:49 1043 分享 版权
阿里云 AI 助理回答

根据您描述的问题,涉及到SNMP(简单网络管理协议)中使用不同的方法(walkgetNextget)获取相同OID(对象标识符)时返回数据类型不一致的情况。具体来说,通过walkgetNext方法得到的是OctetString类型的数据,而get方法却返回了Integer类型的数据。这种差异可能是由以下几个原因造成的:

  1. MIB(管理信息库)定义不明确或实现差异:MIB定义了每个OID的数据类型,但不同设备或实现可能对相同OID有不同的解释或处理方式。如果MIB没有严格指定数据类型,或者实现方未严格按照MIB规范执行,就可能导致数据类型不一致。

  2. SNMP代理行为:SNMP代理负责响应管理站的查询请求。某些代理可能根据请求的方法(如getwalk)对数据进行不同的格式化或转换。例如,它可能将内部存储为整数的数据在响应get请求时直接以Integer形式提供,而在响应序列请求(如walkgetNext)时,为了保持数据的原始字节流完整性,选择以OctetString形式返回。

  3. 数据编码差异:某些情况下,数据可能以一种可变长度的编码(如BER编码,在SNMP中使用)存储,这使得同样的数值既可被解释为整数也可作为字节串。不同的检索方法可能会导致代理以不同的方式解码这些数据。

如何解决

  • 查阅MIB文档:首先,确认MIB文档中该OID的确切数据类型定义。这是理解预期行为的基础。

  • 统一访问方法:如果可能,尝试统一使用同一种方法(如始终使用getwalk)来获取特定OID的数据,并在客户端代码中做相应的类型转换处理。确保你的SNMP客户端库支持灵活的数据类型处理。

  • 类型转换处理:在你的应用程序中,针对已知存在类型差异的OID,编写逻辑判断和类型转换代码。例如,当从get方法意外获得Integer类型数据,而期望为OctetString时,可以尝试将整数值转换为等效的字节表示,反之亦然。

  • 咨询设备供应商:如果问题依然不解,考虑联系设备的供应商或制造商,询问关于该OID数据类型的具体实现细节,看是否有特定配置或更新可以解决类型不一致的问题。

综上所述,遇到此类问题需要从MIB定义、SNMP代理行为及数据编码等多个角度综合分析,并在应用层做适当的数据处理以保证一致性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: