在SNMP4J中操作SNMP协议最重要的一点就是向PDU增加OID,我们可以一次性增加N个OID,如果是GET操作,那么增加一个OID的方式是这样的:
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.9999.23.0.0.1.0")));
我这里有一个需求,要使用一个约定好的OID作为参数,传递一些参数值过去,那么在进行GET操作时我至少就要传递两个OID到PDU中,一个是没有参数的,一个是有值的!
我这里要用一个约定的OID传递一个整型的值过去,我看到网上千篇一律的传递的都是这样的:
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.9999.23.0.0.1.0"),new OctetString("cuisuqiang")));
可是这是一个字符串,要传递整型恐怕不是这样的,于是我看了一下源码,OctetString的构造方法,发现:
/** * Appends a single byte to this octet string. * @param b * a byte value. */ public void append(byte b) { byte[] newValue = new byte[value.length+1]; System.arraycopy(value, 0, newValue, 0, value.length); newValue[value.length] = b; value = newValue; } /** * Appends an array of bytes to this octet string. * @param bytes * an array of bytes. */ public void append(byte[] bytes) { byte[] newValue = new byte[value.length + bytes.length]; System.arraycopy(value, 0, newValue, 0, value.length); System.arraycopy(bytes, 0, newValue, value.length, bytes.length); value = newValue; }
也就是说可以传递字节数组,那么我把整型转为Byte数组再传递到该对象中是否可以呢?
我按照自己的想法去做:
byte[] carNo = new byte[]{22}; pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new OctetString(carNo)));
当Agent拦截到我发送的内容时发现:
[12:56:33] 87 bytes, Received udp msg from 192.168.0.69:4502 via SNMP: 0 30 55 02 01 00 04 04 4E 55 4C 4C A3 4A 02 04 7A 0U.....NULL.J..z 16 0C B0 20 02 01 00 02 01 00 30 3C 30 1A 06 0C 2B .. ......0<0...+ 32 06 01 04 01 CE 0F 17 00 00 01 00 04 0A 63 75 69 .............cui 48 73 75 71 69 61 6E 67 30 0E 06 08 2B 06 01 02 01 suqiang0...+.... 64 01 06 00 04 02 00 16 30 0E 06 08 2B 06 01 02 01 .......0...+.... 80 01 02 00 04 02 00 58
其中 64那行的第四个位置标识为我传递的参数的类型,04代表为字符串,也就是说虽然我传递了字节数组过去但是网络中的含义仍然是字符串。
然后我又看了一下PDU增加的那个对象到底是什么,看了下源码发现:
/** * Creates a variable binding with the supplied OID and value. * @param oid * the OID for the new variable binding (must not be <code>null</code>). * @param variable * the value for the new variable binding (must not be <code>null</code>). */ public VariableBinding(OID oid, Variable variable) { setOid(oid); setVariable(variable); }
他是一个Variable接口,而不是说必须要使用OctetString。然后我又看了一下这个接口的实现类:
他是有一个Integer32的实现的,于是马上改写自己的代码:
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new Integer32(22)));
这样,我的整形的参数值才正确的传递了过去!
其实许多时候我们看别人怎么写,那只能给个参考或入个门,真正应用或根据业务如果写,要自己去研究源码才行!
请您到ITEYE看我的原创:http://cuisuqiang.iteye.com
或支持我的个人博客,地址:http://www.javacui.com
相关推荐
除了直接获取所有OID,还可以使用Snmp4j提供的`SnmpUtilites`类,这个类包含了各种实用工具方法,如解析OID树、获取MIB信息等。例如,你可以使用`SnmpUtilites.printMib()`方法来打印本地MIB的信息,这对于理解网络...
在Java中,利用`Snmp4j`库可以方便地实现SNMP的GET操作,用于获取网络设备上特定OID的值。以下是对代码示例的详细解析: 1. **初始化环境** - 定义了版本号、协议类型、端口号等基础参数。 - 引入必要的包,包括`...
"SNMP_WALK"是利用SNMP协议进行数据查询的一个功能,它能够遍历设备的MIB(Management Information Base)树,获取指定OID(Object Identifier,对象标识符)的所有子节点信息。 SNMP_WALK工具通常是一个命令行实用...
对于Java环境,可以使用如`snmp4j`这样的库来编写SNMP查询代码。 5. **解析响应**:收到SNMP响应后,解析返回的OID值,转换成可读的内存和硬盘使用情况。例如,内存总量可能是以字节为单位的,需要进行转换成人类可...
jar/SNMP4J.jar jar/snmp4jclt-1.2.1.zip jar/snmp.jar 基于java的Oid获取软件.rar Java进行SNMP通信的指南SnmpProgrammingGuideViaJava.doc Java实现snmp的get和walk代码示例.doc snmp4j.chm snmp.chm SnmpMain....
通过 SNMP 采集 BIG-IP 的性能参数可以使用 MIB 浏览器来查找 OID,并使用 Trap 来接收 BIG-IP 的告警信息。 附录一:几个常用的 OID 本附录中列出了几个常用的 OID,包括系统 OID、网络 OID、路由 OID 等。 ...
"snmptools.dll"则可能是包含SNMP工具函数的动态链接库文件,这些函数可以用于与SNMP代理进行交互,例如设置和检索OID值。 "perf32.exe"可能是性能监视工具,允许用户查看和分析系统性能数据。在Windows中,性能...
在SNMP4J中,你需要设置相应的陷阱信息,包括陷阱类型、源地址、代理地址等,然后发送出去。 7. 安全性和认证: SNMPv3引入了安全模型和认证机制,如USM(User-based Security Model)和VACM(View-based Access ...
使用SNMP4J,开发者能够通过编写Java代码来实现对网络设备的操作,比如检索设备信息、修改设备配置、接收告警通知等。 在这份文档中,提到了几个SNMP4J中实现的操作,包括GET、GETNEXT、GETBULK、Walk和SET。 GET...
通过上述内容,你应能掌握使用snmp4j库进行SNMP操作的基本方法,包括获取和设置MIB值,发送TRAP,以及在SNMPv3环境下的安全配置。这个eclipse工程提供了一个实用的起点,帮助你开始在Java项目中集成SNMP功能。
为了使用SNMP4J,开发者需要了解SNMP的基本概念,如MIB(Management Information Base)、OID(Object Identifier)和PDU等,并且需要熟悉Java编程。通过导入"snmp4j-2.0.3.jar"到项目中,结合SNMP4J提供的API,就...
在提供的“snmp4j.pdf”文档中,你将找到更多关于如何使用SNMP4J的详细示例和教程,包括初始化设置、发送请求、处理响应、以及设置陷阱监听器等内容。这份文档将帮助你深入理解和应用SNMP4J库,以便在Java环境中有效...
总结来说,通过SNMP获取远程主机的内存利用率和CPU使用率涉及SNMP协议的理解、OID的选择、以及使用像SNMP4J这样的库来构建SNMP请求和解析响应。在Java程序中,这通常包括建立SNMP会话、构造PDU、发送GET请求以及解析...
以上代码片段展示了如何使用C#和SnmpSharpNet库发送一个GET请求并获取OID对应的值。在实际大型项目中,可能需要处理更复杂的场景,如错误处理、定时轮询、批量查询等。SnmpSharpNet库提供了丰富的功能,能够满足这些...
以上代码片段展示了如何使用SNMP4j包读取SNMP协议数据的基本步骤,包括初始化SNMP会话、发送GET请求、处理陷阱以及配置SNMPv3安全模型。实际应用中,根据网络设备的具体情况,可能需要对这些基础代码进行相应的调整...
获取设备的OID通常需要使用SNMP工具。这些工具可以发送SNMP GET请求到目标设备,然后设备会返回对应的OID值。这些值可以用于监控设备状态,比如CPU和内存使用率。对于CPU利用率,可能的OID包括.1.3.6.1.2.1.25.3....
### Snmp4j库的使用 Snmp4j是一个用于实现SNMP通信的Java库,支持SNMPv1、v2c和v3,同时提供了强大的扩展性和灵活性。 #### Demo中的代码解析 **初始化通信** ```java public void initComm() throws IOException ...
SNMP(简单网络管理协议)是一种广泛用于网络设备...通过理解这些概念并参考"SnmpTrap"的源码,开发者可以更好地掌握如何使用SNMP4J在Java环境中实现SNMP Trap功能,从而在实际项目中实现网络设备的自动监控和报警。
4-FortiGate防火墙SNMP状态监控OID值说明-v1.1归类.pdf
以下是一个简单的示例,展示了如何使用 `snmp4j` 获取远程设备的主机名(OID为1.3.6.1.2.1.1.5.0): ```java import java.io.IOException; import java.util.Vector; import org.snmp4j.CommunityTarget; import ...