论坛首页 编程语言技术论坛

SNMP 使用SNMP4J OID设置不同类型的参数值

浏览 3432 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-05-24  

在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)));
 

这样,我的整形的参数值才正确的传递了过去!

 

其实许多时候我们看别人怎么写,那只能给个参考或入个门,真正应用或根据业务如果写,要自己去研究源码才行!

   发表时间:2012-05-24  
不懂LZ需求……
既然要传参数,为何不用set;
你们的设备这么怪异的,get需要传参数?!

另外:
OID都有对应的类型,没必要写死在pdu.add(XXX)里。
写配置文件,启动服务的时候预加载到Map里,再写个匹配OID类型的函数就好了。
0 请登录后投票
   发表时间:2012-05-24  
srocker 写道
不懂LZ需求……
既然要传参数,为何不用set;
你们的设备这么怪异的,get需要传参数?!

另外:
OID都有对应的类型,没必要写死在pdu.add(XXX)里。
写配置文件,启动服务的时候预加载到Map里,再写个匹配OID类型的函数就好了。

技术是死的,需求是活的!
我们需要多某个设备进行修改,但是设备有很多呀,我们做的是列车,那么多车和车厢,要区分开所以每次要传递一些必要的信息,然后才能进行修改!
协议只是定义了一个传输和操作的规定,而不是我们实际要做的事情,如果都是一样的,那还要其他开发干嘛,有人开发出一套全世界都可以通用了!

我也另外,我这是做例子呢,到时候这些OID信息是存在数据库的。
我写这个是为了大家学习,你不能这样误会我吧!
0 请登录后投票
   发表时间:2012-05-25  
LZ表激动,我只是不太懂你这个帖子用意。
因为一个OID都有对应的MIB类型,该传什么预先难道不知道?
还需要像你这么用代码去“猜”?

我疑惑在这里,呵呵。
该用Octet String就用Octet String;
该用Integer就用Integer。

不用把时间花在研究接口类型上。
当然还是要鼓励研究底层数据结构。
但是项目以市场为导向的话,没空去研究。呵呵
0 请登录后投票
   发表时间:2012-05-25   最后修改:2012-05-25
希望大家积极评论!
0 请登录后投票
   发表时间:2012-05-25  
srocker 写道
LZ表激动,我只是不太懂你这个帖子用意。
因为一个OID都有对应的MIB类型,该传什么预先难道不知道?
还需要像你这么用代码去“猜”?

我疑惑在这里,呵呵。
该用Octet String就用Octet String;
该用Integer就用Integer。

不用把时间花在研究接口类型上。
当然还是要鼓励研究底层数据结构。
但是项目以市场为导向的话,没空去研究。呵呵

你说的对,不过需求嘛,咱说了不算!
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics