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...