在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
相关推荐
1 windows下安装和配置snmp服务 2 用snmp4j获取本地所有oid 代码
通过snmp和oid获取电脑的内存硬盘的使用情况和总量
快速获取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....
windows上snmp自定义oid工具 配置参考: http://www.cnblogs.com/smallcoderhujin/p/3890233.html
Java来实现snmp的get、walk代码示例
通过snmp的OID获取对方主机的内存利用率及CPU的使用率
Juniper常用SNMP(OID)使用手册_Ver2
F5 SNMP OID说明rv1 供大家学习! 本资料共包含以下附件: BIG-IPLTMSNMPV9[1].2.x.说明rv1.doc
4-FortiGate防火墙SNMP状态监控OID值说明-v1.1归类.pdf
使用SNMP4J可以很方便的实现一个SNMP NMS的功能。 对于SNMPv1/SNMPv2,简单的说,只需要以下几个步骤 1) 创建Snmp对象snmp 2) 创建CommunityTarget对象target,并指定community, version, address, timeout, retry...
使用mib2c工具添加私有SNMP的OID
snmp 常用oid列表
列出了SNMP的MIB中常用的OID,根据这些OID可以很容易找到相关的被管对象。供初学SNMP协议的人使用,非常好!
通过使用snmp协议,监控设置了OID的数据。方便网络的管理
跟linux平台的snmpwalk功能类似,使用方法:cmd→cd到该exe文件的目录→snmpwalk.exe + option(通过snmpwalk.exe -h可以获得相关参数及运用方法,包括version、community、host、oid等) SNMPWALK是一个通过SNMP ...
Java SNMP Package:这是一个实现了SNMP协议的Java包.它提供对基本的SNMP客户端与在SNMP...这个包提供了一种机制用于取得与设置SNMP对象标识(OID:object identifier)值通过一个简单的通信接口并可用于描述SNMP结构等.
此合集包含200余个SNMP常用的OID。可以很方便的查找自己所需的OID,包括:系统参数、网络接口、CPU和负载、内存和磁盘及System Group等。
做网管系统时候获取被监控设备的oid,例如内存,cpu利用率等等
常用snmp取得监控信息的oid 如: .1.3.6.1.2.1.1.3 system 系统运行时间 .1.3.6.1.2.1.2.1 Interfaces 端口数量 .1.3.6.1.2.1.2.2.1.3 Interfaces 每个端口类型