Snmp4j

SNMP(Simple Network Management Protocol,簡單網絡管理協議)的前身是簡單網關監控協議(SGMP),用來對通信線路進行管理。隨後,人們對SGMP進行了很大的修改,特別是加入了符合Internet定義的SMI和MIB:體系結構,改進後的協議就是著名的SNMP。SNMP的目標是管理互聯網Internet上衆多廠家生產的軟硬件平臺,因此SNMP受Internet標準網絡管理框架的影響也很大,現在Snmp有三個版分別是V1,V2,V3,現在SNMP已經出到第三個版本的協議,其功能較以前已經大大地加強和改進了。

[quote] 開發Snmp對設備進行採集數據時,必須考慮設備支持的Snmp版本,v1,v2版本可以兼容;但v3增加很安全機制,當利用v1,v2採集數據失敗時,此嘗試用v3版本。[/quote]

概念:

[quote]MIB----管理信息庫,由網絡管理協議訪問的管理對象數據庫,它包括SNMP可以通過網絡設備的SNMP管理代理進行設置的變量。
SMI----管理信息結構,用於定義通過網絡管理協議可訪問的對象的規則。[/quote]



[quote]SNMP進行網絡管理需要下面幾個重要部分:管理基站,管理代理,管理信息庫。
管理基站通常是一個獨立的設備,它用作網絡管理者進行網絡管理的用戶接口。基站上必須裝備有管理軟件,管理員可以使用的用戶接口和從MIB取得信息的數據庫,同時爲了進行網絡管理它應該具備將管理命令發出基站的能力。
管理代理是一種網絡設備。這些設備都必須能夠接收管理基站發來的信息,它們的狀態也必須可以由管理基站監視。管理代理響應基站的請求進行相應的操作,也可以在沒有請求的情況下向基站發送信息。
MIB是對象的集合,它代表網絡中可以管理的資源和設備。每個對象基本上是一個數據變量,它代表被管理的對象的一方面的信息。 [/quote]




[code]package com.shine.framework.core.util;

import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.dom4j.Element;
import org.snmp4j.AbstractTarget;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.PrivDES;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class SnmpHelper4j extends SnmpAbstract {

//Snmp Instance
private Snmp snmp=null;

private String ip;

//Unit(共同體)
private String community="public";

//Default Port
private int port = 161;

//Snmp version
private int version = 0;

//Transport mapping
private TransportMapping tm;

private Address targetAddress;

//Snmp Defualt Use UDP Protocl
private String protol="udp";

public SnmpHelper4j(){

}
public SnmpHelper4j(String ip, String community) throws Exception{
this.init(ip, community);
}
public SnmpHelper4j(String ip, String community, int port,int v) throws Exception{
this.init(ip, community, port,v);
}
/**
* 初始化
*/
public void init(String ip, String community, int port,int v) throws Exception {
this.port=port;
this.version=v;
this.init(ip, community);
}

/**
* 初始化
*/
public void init(String ip, String community) throws Exception {
this.ip=ip;
this.community=community;
StringBuffer tstr = new StringBuffer(this.protol).append(":").append(ip).append("/").append(this.port);
this.targetAddress = GenericAddress.parse(tstr.toString());
this.tm = new DefaultUdpTransportMapping();
this.snmp = new Snmp(this.tm);
}
/**
* OID值
*/
public String getOidValueString(String oid){
for(int i=0;i<=3;i++){
return this.getOidValueString(oid,i);
}
return null;
}
/**
* 存在預設值
* @param oid
* @param v
* @return
*/
public String getOidValueString(String oid,int v){
if(v==0 || v==1){
String result = getSnmpV1OidValueString(oid,v);
if(result!=null){
return result;
}
}
if(v==3){
String result = getSnmpV3OidValueString(oid);
if(result!=null){
return result;
}
}
return null;
}
/**
* 獲取SnmpV1/V2版本OID值
* @param oid
* @param snmpv
* @return
*/
private String getSnmpV1OidValueString(String oid,int snmpv){
this.state = true;
CommunityTarget target = this.setCommunityTarget(snmpv);
PDU pdu = this.setPdu(oid);
try{
return getStrResponse(snmpv,pdu,target);
}catch(Exception e){
e.printStackTrace();
}finally{
this.state = false;
this.close();
pdu=null;
target=null;
}
return null;
}
/**
* Snmp V1/V2 Target
* @param snmpv
* @return
*/
private CommunityTarget setCommunityTarget(int snmpv){
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(this.community));
target.setAddress(this.targetAddress);
target.setVersion(snmpv);
target.setTimeout(100);
target.setRetries(1);
return target;
}
/**
* SnmpV1/v2版本PDU數據
* @param oid
* @return
*/
private PDU setPdu(String oid){
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oid)));
pdu.setType(PDU.GET);
return pdu;
}
/**
* 獲取SnmpV3版本OID值
* @param oid
* @param snmpv
* @return
*/
private String getSnmpV3OidValueString(String oid){
this.state = true;
USM usm = new USM(SecurityProtocols.getInstance(),new OctetString(MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);
ScopedPDU spdu = this.setScopedPDU(oid);
UserTarget target = this.setUserTarget();
this.snmp.getUSM().addUser(new OctetString("MD5DES"), new UsmUser(new OctetString("MD5DES"), AuthMD5.ID,new OctetString("MD5DESUserAuthPassword"), PrivDES.ID,new OctetString("MD5DESUserPrivPassword")));
try{
return getStrResponse(3,spdu,target);
}catch(Exception e){
e.printStackTrace();
}finally{
this.state = false;
this.close();
target=null;
spdu = null;
usm = null;
}
return null;
}
/**
* V3 Target
* @return
*/
private UserTarget setUserTarget(){
UserTarget target = new UserTarget();
target.setAddress(this.targetAddress);
target.setRetries(1);
target.setTimeout(500);
target.setVersion(SnmpConstants.version3);
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
target.setSecurityName(new OctetString("MD5DES"));
return target;
}
/**
* SnmpV3版本Pdu數據
* @param oid
* @return
*/
private ScopedPDU setScopedPDU(String oid){
ScopedPDU spdu = new ScopedPDU();
spdu.add(new VariableBinding(new OID(oid)));
spdu.setType(ScopedPDU.GET);
spdu.setMaxRepetitions(50);
return spdu;
}
/**
* OID字符串數據響應
* @param snmpv
* @param pdu
* @param target
* @return
* @throws Exception
*/
private String getStrResponse(int snmpv,PDU pdu,AbstractTarget target) throws Exception{
this.snmp.listen();
ResponseEvent response = this.snmp.send(pdu, target);
PDU tpdu = response.getResponse();
if (response.getResponse() != null && tpdu.getErrorIndex() == tpdu.noError && tpdu.getErrorStatus() == tpdu.noError) {
this.version=snmpv;
Vector<VariableBinding> v = response.getResponse().getVariableBindings();
for(VariableBinding var:v){
return var.getOid().toString()+"(IP: "+this.ip + ":Snmp4j"+":snmpv"+(this.version+1)+")";
}

}
return null;
}

/**
* 重連接
*/
public void reconnection(String ip, String community, int port) {
try {
if (this.tm != null)
this.tm.close();
this.community=community;
StringBuffer tstr = new StringBuffer(this.protol).append(":").append(ip).append("/").append(port);
this.targetAddress = GenericAddress.parse(tstr.toString());
this.tm = new DefaultUdpTransportMapping();
this.snmp = new Snmp(this.tm);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 重連接
*/
public void reconnection() {
this.reconnection(this.ip, this.community, this.port);
}
/**
* 關閉監聽
*/
public void close() {
try{
if(this.tm != null){
this.tm.close();
}
}catch(Exception e){
e.printStackTrace();
}
}

public int getVersion() {
return version;
}
public void setVersion(int version) {
this.version = version;
}
public Snmp getSnmp() {
return snmp;
}
public void setSnmp(Snmp snmp) {
this.snmp = snmp;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getCommunity() {
return community;
}
public void setCommunity(String community) {
this.community = community;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public TransportMapping getTm() {
return tm;
}
public void setTm(TransportMapping tm) {
this.tm = tm;
}
public Address getTargetAddress() {
return targetAddress;
}
public void setTargetAddress(Address targetAddress) {
this.targetAddress = targetAddress;
}
public String getProtol() {
return protol;
}
public void setProtol(String protol) {
this.protol = protol;
}
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
SnmpHelper4j sh = new SnmpHelper4j("192.168.2.18", "public", 161);
System.out.println(sh.getOidValueString("1.3.6.1.2.1.1.1.0"));
}
}

[/code]
附上源碼(Snmp開源包包括Api文檔)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章