SNMP 使用SNMP4J OID设置不同类型的参数值
2012-07-05 21:35
453 查看
在SNMP4J中操作SNMP协议最重要的一点就是向PDU增加OID,我们可以一次性增加N个OID,如果是GET操作,那么增加一个OID的方式是这样的:Java代码
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.9999.23.0.0.1.0")));
我这里有一个需求,要使用一个约定好的OID作为参数,传递一些参数值过去,那么在进行GET操作时我至少就要传递两个OID到PDU中,一个是没有参数的,一个是有值的! 我这里要用一个约定的OID传递一个整型的值过去,我看到网上千篇一律的传递的都是这样的:Java代码
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.9999.23.0.0.1.0"),new OctetString("cuisuqiang")));
可是这是一个字符串,要传递整型恐怕不是这样的,于是我看了一下源码,OctetString的构造方法,发现:Java代码
/**
* 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数组再传递到该对象中是否可以呢?我按照自己的想法去做:Java代码
byte[] carNo = new byte[]{22};
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new OctetString(carNo)));
当Agent拦截到我发送的内容时发现:Java代码
[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增加的那个对象到底是什么,看了下源码发现:Java代码
/**
* 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的实现的,于是马上改写自己的代码:Java代码
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new Integer32(22)));
这样,我的整形的参数值才正确的传递了过去! 其实许多时候我们看别人怎么写,那只能给个参考或入个门,真正应用或根据业务如果写,要自己去研究源码才行!
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.9999.23.0.0.1.0")));
我这里有一个需求,要使用一个约定好的OID作为参数,传递一些参数值过去,那么在进行GET操作时我至少就要传递两个OID到PDU中,一个是没有参数的,一个是有值的! 我这里要用一个约定的OID传递一个整型的值过去,我看到网上千篇一律的传递的都是这样的:Java代码
pdu.add(new VariableBinding(new OID("1.3.6.1.4.1.9999.23.0.0.1.0"),new OctetString("cuisuqiang")));
可是这是一个字符串,要传递整型恐怕不是这样的,于是我看了一下源码,OctetString的构造方法,发现:Java代码
/**
* 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数组再传递到该对象中是否可以呢?我按照自己的想法去做:Java代码
byte[] carNo = new byte[]{22};
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new OctetString(carNo)));
当Agent拦截到我发送的内容时发现:Java代码
[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增加的那个对象到底是什么,看了下源码发现:Java代码
/**
* 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的实现的,于是马上改写自己的代码:Java代码
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new Integer32(22)));
这样,我的整形的参数值才正确的传递了过去! 其实许多时候我们看别人怎么写,那只能给个参考或入个门,真正应用或根据业务如果写,要自己去研究源码才行!
相关文章推荐
- SNMP 使用SNMP4J OID设置不同类型的参数值
- Vim 的 tab 设置(2): 使用 autocmd 为不同的文件类型应用不同的 tab 设置
- 使用snmp4j实现Snmp功能(一)
- 语法基础: 使用不同的数据类型标记数组
- 使用snmp4j实现Snmp功能(三)
- Android不同音源类型的音量设置问题:
- Oracle 和SQL Server 语句与数据类型使用上的不同之处 (转)
- 要求根据RandomStr.java:使用类型转换生成六位验证字符串,示例程序每次运 行时,都会生成不同的字符串。
- windows控制台中使用不同颜色显示不同类型的日志
- 使用snmp4j实现Snmp功能(三)
- 使用viewport的元数据、CSS和Javascript来为不同分辨率的屏幕设置合适的页面
- 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化
- 【android】 使用一个shape.xml文件,使用代码设置不同圆角背景颜色
- 错误:因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 解决方法
- 使用snmp4j实现Snmp功能(一)
- 使用PreparedStatementSetter 设置参数跟 表字段类型不匹配出现的错误
- 当使用dbeaver导出多个sql文件,怎么快速的把它合并成一个文件,可以针对多种不同的类型
- 使用snmp4j实现Snmp功能(二)
- 使用jackson的writeValueAsString把java对象输出成字符串实例,设置应答体的类型
- 根据不同input类型设置不同的css