1

我正在使用 SNMP4J 读取带有 SNMP 的设备信息。现在我发现了一些将系统名称(OID iso.3.6.1.2.1.1.5.0)表示为十六进制字符串而不是字符串的设备。

要显示系统名称,我使用以下代码:

Variable var = response.getVariable(new OID(".1.3.6.1.2.1.1.5.0"));
System.out.println(var.toString());

其中 response 是一个 PDU 对象。

如果系统名称表示为 STRING 值,则符合我的预期。当它表示为十六进制字符串时,它只打印十六进制值。

示例:
取系统名称为“SYSTEM NAME”。
使用 STRING,它会打印“系统名称”。
使用 Hex-STRING 打印“53:59:53:54:45:4d:20:4e:41:4d:45”

现在在命令行中使用 snmpwalk 我可以使用 -Oa 标志。这使得所有 Hex-STRING 值都显示为 STRING。是否可以在 SNMP4J 中使用此标志,或者是否有类似的选项?

4

1 回答 1

0

我不确定你从哪里得到“Hex-STRING”这个词。SNMP 没有定义这样的数据类型。我建议您阅读相关的 RFC 文档,它们可从 IETF 公开获得。SNMP 的维基百科文章 ( http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#References ) 有一个很好的参考列表,您可以从浏览标记为“STD”的那些开始。

在 SNMP 中,所有字符串都是 OCTET-STRING 的子类型(或者用不同的词,“限制”),OCTET-STRING 是一个不确定长度的字节串。它可能包含任何数据,甚至是不可打印的东西,代表 jpeg 图像或其他任何东西。

已经定义了一些文本约定,将数据限制在某个特定的字节范围或长度。DisplayString 被定义为仅包含 NVT ASCII 字符集中的字节,因此用户可以相信它是可打印的。

事实上,sysName 被定义为一个最大长度为 255 个字符的 DisplayString。

sysName OBJECT-TYPE
              SYNTAX  DisplayString (SIZE (0..255))

因为一个好的 SNMP 管理器知道 RFC1213-MIB,它定义了 sysName 和 DisplayString,管理器应该假设接收到的数据是可打印的 ASCII 字符。

当您说“当它表示为十六进制字符串时”,您是什么意思?“代表”在哪里、在代理上、在您的 Java 代码中或在使用 net-snmp “snmpwalk”命令时?

var.toString()调用应该将变量的内容转换为可以在终端中安全打印的内容,因此 SNMP4j 可能会将任何二进制字符串转换为十六进制字符串。

于 2014-03-21T13:46:46.073 回答