我正在使用SNMP4J来读取带有SNMP的设备信息。现在我发现一些代表系统名称的设备(OID iso.3.6.1.2.1.1.5.0)作为Hex-STRING而不是STRING。
要显示系统名称,请使用以下代码:
Variable var = response.getVariable(new OID(".1.3.6.1.2.1.1.5.0"));
System.out.println(var.toString());
其中response是PDU对象。
如果系统名称表示为STRING值,则按预期进行。当它表示为Hex-STRING时,它只打印Hex值。
例:
将系统名称命名为“SYSTEM NAME”
使用STRING打印“SYSTEM NAME”
使用Hex-STRING打印“53:59:53:54:45:4d:20:4e:41:4d:45”
现在在命令行中使用snmpwalk我可以使用-Oa标志。这使得所有Hex-STRING值显示为STRING。是否可以在SNMP4J中使用此标志或是否有类似的选项?
答案 0 :(得分:0)
我不知道你在哪里得到这个术语" Hex-STRING"从。 SNMP没有定义这样的数据类型。我建议你阅读相关的RFC文档,它们可以从IETF公开获得。 SNMP的维基百科文章(http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#References)有一个很好的参考列表,您可以从浏览标记为" STD"的那些开始。
在SNMP中,所有字符串都是OCTET-STRING的子类型(或不同的字,"限制"),这是一个不确定长度的字节字符串。它可能包含任何数据,甚至是不可打印的内容,代表jpeg图像或其他任何内容。
已定义了一些文本约定,它们将数据限制为某个特定的字节范围或长度。 DisplayString被定义为仅包含NVT ASCII字符集中的字节,因此用户可以信任它是可打印的。
实际上,sysName被定义为DisplayString,最大长度为255个字符。
sysName OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
由于良好的SNMP管理器知道RFC1213-MIB(定义了sysName和DisplayString),因此管理器应该假定接收的数据是可打印的ASCII字符。
当你说"当它表示为Hex-STRING"时,你的意思是什么? "代表"在代理商或Java代码中,或者在使用net-snmp" snmpwalk"命令?
var.toString()
调用应该将变量的内容转换为可以在终端中安全打印的内容,因此SNMP4j可能将任何二进制字符串转换为十六进制字符串。