Snmp4j程式設計簡介之二 PDU

2021-05-07 14:22:10 字數 3474 閱讀 3988

snmp4j程式設計簡介之二:pdu

pdu(協議資料單元),用來表示管理站跟**站點進行通訊的資料。包括pdu的型別、傳輸的資料集合、錯誤說明等。

除snmpv1 trap外,其他操作型別的pdu大致相同。

snmp4j針對snmp的各個版本,開發了三個有關pdu的類。pdu(針對snmpv2c)、pduv1(針對snmpv1)、scopedpdu(針對snmpv3),但三個類除各自特別的一些引數外,都基本相同。所以snmp4j在設計的時候,將pdu設計成另外兩個的超類,使他們能夠共享大部分功能。

(1)pdu

1)pdu型別(snmpv1支援5種,get、set、getnext、trap、getresponse,snmpv2c增加了getbulk、inform)

int   gettype()

void   settype(int type)

2)錯誤(主要有6種錯誤,請參見rfc)

void   seterrorstatus(int   status)

int   geterrorstatus()

string    geterrorstatustext()

void   seterrorindex(int index)

int   geterrorindex()

3)變數

void add(variablebinding vb) // 對於除get、getnext、getbulk外

void addall(variablebinding vbs) // 對於除get、getnext、getbulk外的

void addoid(variablebinding vb) // 對於get、getnext、getbulk

void addalloid(variablebinding vbs) // 對於get、getnext、getbulk

variablebinding get(int i)

variablebinding toarray()

vector   getvariablebindings()

void set(int i,variablebinding vb)

void   remove(int i)

void   clear()

int   size()

(2)pduv1

pduv1繼承了pdu,除snmp v1 trap操作外 ,其它都跟pdu相同。因為snmp v1的trap設計pdu不同於其他操作的pdu,它包括:物件識別符號(oid)、**ip位址(agent-addr)、時間戳(time-stamp)、通用**型別(generic-trap)、特定**型別(specific-trap)。所以相應的增加了對這些欄位的get/set操作。具體參見api文件。

(3)scopedpdu

snmpv3採用了不同安全策略,它的pdu也增加了有關安全方面的幾個字段:上下文名稱(contextname)、上下文引擎id(contextengineid)等,其它pdu欄位屬於usm來管理。

所以scopedpdu在pdu的基礎上增加了相應的get/set操作。參見api。

示例**如下:(摘自api文件)

snmpv1/v2c getnext pdu

import org.snmp4j.pdu;

import org.snmp4j.smi.*;

...pdu pdu = new pdu();

pdu.add(new variablebinding(new oid("1.3.6.1.2.1.1.1"))); // sysdescr

pdu.add(new variablebinding(new oid("1.3.6.1.2.1.2.1"))); // ifnumber

pdu.settype(pdu.getnext);

...snmpv3 getbulk pdu

import org.snmp4j.scopedpdu;

import org.snmp4j.smi.*;

...scopedpdu pdu = new scopedpdu();

pdu.add(new variablebinding(new oid("1.3.6.1.2.1.2.1"))); // ifnumber

pdu.add(new variablebinding(new oid("1.3.6.1.2.1.2.2.1.10"))); // ifinoctets

pdu.add(new variablebinding(new oid("1.3.6.1.2.1.2.2.1.16"))); // ifoutoctets

pdu.settype(pdu.getbulk);

pdu.setmaxrepetitions(50);

// get ifnumber only once

pdu.setnonrepeaters(1);

// set context non-default context (default context does not need to be set)

pdu.setcontextname(new octetstring("subsystemcontexta"));

// set non-default context engine id (to use targets authoritative engine id

// use an empty (size == 0) octet string)

pdu.setcontextengineid(octetstring.fromhexstring("80:00:13:70:c0:a8:01:0d"));

...snmpv1 trap pdu

import org.snmp4j.pduv1;

...pduv1 pdu = new pduv1();

pdu.settype(pdu.v1trap);

pdu.setgenerictrap(pduv1.coldstart);

...snmpv2c/snmpv3 inform pdu

import org.snmp4j.scopedpdu;

...scopedpdu pdu = new scopedpdu();

pdu.settype(pdu.inform);

// sysuptime

long sysuptime = (system.currenttimemillis() - starttime) / 10;

pdu.add(new variablebinding(snmpconstants.sysuptime, new timeticks(sysuptime)));

pdu.add(new variablebinding(snmpconstants.snmptrapoid, snmpconstants.linkdown));

// payload

pdu.add(new variablebinding(new oid("1.3.6.1.2.1.2.2.1.1"+downindex),

new integer32(downindex)));

...

Snmp4j程式設計簡介之二 PDU

pdu 協議資料單元 用來表示管理站跟 站點進行通訊的資料。包括pdu的型別 傳輸的資料集合 錯誤說明等。除snmpv1 trap外,其他操作型別的pdu大致相同。snmp4j針對snmp的各個版本,開發了三個有關pdu的類。pdu 針對snmpv2c pduv1 針對snmpv1 scopedpd...

Snmp4j程式設計簡介之二 PDU

snmp4j程式設計簡介之二 pdu pdu 協議資料單元 用來表示管理站跟 站點進行通訊的資料。包括pdu的型別 傳輸的資料集合 錯誤說明等。除snmpv1 trap外,其他操作型別的pdu大致相同。snmp4j針對snmp的各個版本,開發了三個有關pdu的類。pdu 針對snmpv2c pduv...

Snmp4j程式設計簡介之二 PDU

snmp4j程式設計簡介之二 pdu pdu 協議資料單元 用來表示管理站跟 站點進行通訊的資料。包括pdu的型別 傳輸的資料集合 錯誤說明等。除snmpv1 trap外,其他操作型別的pdu大致相同。snmp4j針對snmp的各個版本,開發了三個有關pdu的類。pdu 針對snmpv2c pduv...