您的位置:首页 > 其它

snmp snmp4j的使用

2015-07-02 09:45 597 查看
snmp4j的使用

一.什么是snmp及snmp4j?

snmp是 Simple Network Management Protocol (简单网络管理协议)的简写。

SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似。

参考百度百科:
http://baike.baidu.com/link?url=fzj8rJp06yZBxx4MRVTYu5Iiub45QmK3WVzVC30tDtXFQmMJZkfEA9yfcP2E1HJz4bSYh9oNCc5zQVr7gmceP_
二.步骤:

管理端步骤:

1.设定传输协议
2.snmp初始化
3.构造发送报文
4.构造发送目标
5.构造响应监听(异步)
6.发送

监控端步骤:

1.设定传输协议
2.snmp初始化
3.构造发送报文
4.构造发送目标
5.发送并返回响应
6.处理返回结果

三.snmp常用的类:

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
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;


别看这么多包就吓怕了,遇事不惊才是站到最后的人,下面我们一起来研究他们的用法,按照如上步骤:

我就以管理端的方式讲解:

工具的重要性不说大家都懂的,能事半功倍的效果:建议大家先下载snmp4j api文档。然后跟着我一起研究:

首先我们把一个大问题划分成几个小问题,个个击破,于是一个大问题就解决了:(参考下面的demo熟悉snmp协议及snmp4j)

1.设定传输协议:

TransportMapping接口:此该接口代表了SNMP4J所使用的传输层协议。这也是SNMP4J一大特色的地方。按照RFC的规定,SNMP是只使用UDP作为传输层协议的。而SNMP4J支持管理端和代理端使用UDP或者TCP进行传输。该接口有两个子接口。(查看api文档)

在Package org.snmp4j.transport这个包下有一个类设定了传输方式为udp:这个类就是DefaultUdpTransportMapping,使用时只需实例化它即可。

2.初始化snmp:

snmp:这个类主要用来收发数据,它主要有一个send方法,这个很重要,有很多重载。查看文档。

3.构造报文(PDU):

PDU:就是要通信的数据。

4.构造目标:

CommunityTarget:要发送通信数据要去的目标。

5.监听:

ResponseListener:负责监听并回调对应的函数处理。

ResponseListener listener = new ResponseListener() {
public void onResponse(ResponseEvent event) {
((Snmp) event.getSource()).cancel(event.getRequest(), this);
PDU request = event.getRequest();
PDU response = event.getResponse();
if (response != null) {
System.out.println("request.size()=" + request.size());
System.out.println("response.size()=" + response.size());
}
}
};

6.发送:

发送:就是指将pdu(数据)发送到target(目标)机器,监听返回的数据并作响应。

snmp.send(pdu, target, null, listener);

snmp、pdu及target之间的关系可以用一句话概括:

Target就是你远方的恋人,PDU就是你们之间传递的情书、而Snmp就是负责帮你寄信收信的邮差。

四.demo:(以广播的方式)

1.管理端:

package com.main;

import java.io.IOException;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
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;

/**
*以廣播的方式發送snmp并獲取設備的信息
*
* @author PC
*
*/
public class Manager {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println("管理端启动。。。");

send();

System.out.println("success");
}

// 发送数据到目标机器
public static void send() {

TransportMapping transport = null;

try {
// 传输协议为UDP
transport = new DefaultUdpTransportMapping();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 创建snmp对象,发送报文
Snmp snmp = new Snmp(transport);

try {
snmp.listen();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

OID oid = new OID("1.3.6.1.2.2.1.0");
// 报文
PDU pdu = new PDU();
VariableBinding variableBinding = new VariableBinding(oid);
pdu.add(variableBinding);
pdu.setType(PDU.GET);

// 目标
CommunityTarget target = new CommunityTarget();

// 设置snmp共同体
OctetString oct = new OctetString("public");
target.setCommunity(oct);

// 向255.255.255.255发送UPD数据包即为UDP广播,接收端只需绑定UDP广播的端口号即可得到数据
Address address = GenericAddress.parse("udp:192.168.0.254/161");
target.setAddress(address);
target.setRetries(2);
target.setTimeout(5000);
target.setVersion(SnmpConstants.version1);

// 设置监听对象
ResponseListener listener = new ResponseListener() {
public void onResponse(ResponseEvent event) {
((Snmp) event.getSource()).cancel(event.getRequest(), this);
PDU request = event.getRequest();
PDU response = event.getResponse();
if (response != null) {
System.out.println("request.size()=" + request.size());
System.out.println("response.size()=" + response.size());
}
}
};

try {
snmp.send(pdu, target, null, listener);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}


2.监控端:(获取本地信息)

package com.main;

import java.io.IOException;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
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 Monitor {

// systemDescr
static final String OID1 = "1.3.6.1.2.1.1.1.0";
// eth0
static final String OID2 = "1.3.6.1.2.1.2.2.1.2.2";
// MAC
static final String OID3 = "1.3.6.1.2.1.2.2.1.6.2";

static final String OID4 = "1.3.6.1.2.1.1.1";

//static final int [] OID5 = {1,3,6,1,2,1,1,2}; 与第一个一样

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
GetOID();
}

/**
* 获得本机oid
*/
public static void GetOID() {

TransportMapping transport = null;

try {
// 传输协议udp
transport = new DefaultUdpTransportMapping();
transport.listen();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

// 構造報文
PDU request = new PDU();
request.add(new VariableBinding(new OID(OID1)));
request.add(new VariableBinding(new OID(OID2)));
request.add(new VariableBinding(new OID(OID3)));

request.add(new VariableBinding(new OID(OID4)));
//request.add(new VariableBinding(new OID(OID5)));

request.setType(PDU.GETNEXT);

// snmp初始化
Snmp snmp = new Snmp(transport);

// 構造目標
CommunityTarget target = new CommunityTarget();
Address localAddress =GenericAddress.parse("udp:localhost/161");
target.setAddress(localAddress);
OctetString oct = new OctetString("public");
target.setCommunity(oct);
target.setVersion(SnmpConstants.version2c);
target.setRetries(2);
target.setTimeout(5 * 60);

try {
// 發送報文
ResponseEvent responseEvent = snmp.send(request, target);

PDU response = responseEvent.getResponse();
if (response != null) {
System.out.println("request.size()=" + request.size());
System.out.println("response.size()=" + response.size());
VariableBinding vb1 = response.get(0);
VariableBinding vb2 = response.get(1);
VariableBinding vb3 = response.get(2);
VariableBinding vb4 = response.get(3);
//VariableBinding vb5 = response.get(4);
System.out.println(vb1);
System.out.println(vb2);
System.out.println(vb3);
System.out.println(vb4);
//System.out.println(vb5);

//释放
transport.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


五.MIB:

常用OID:

系统参数(1.3.6.1.2.1.1)
OID描述备注请求方式
.1.3.6.1.2.1.1.1.0获取系统基本信息SysDescGET
.1.3.6.1.2.1.1.3.0监控时间sysUptimeGET
.1.3.6.1.2.1.1.4.0系统联系人sysContactGET
.1.3.6.1.2.1.1.5.0获取机器名SysNameGET
.1.3.6.1.2.1.1.6.0机器坐在位置SysLocationGET
.1.3.6.1.2.1.1.7.0机器提供的服务SysServiceGET
.1.3.6.1.2.1.25.4.2.1.2系统运行的进程列表hrSWRunNameWALK
.1.3.6.1.2.1.25.6.3.1.2系统安装的软件列表hrSWInstalledNameWALK
网络接口(1.3.6.1.2.1.2)
OID描述备注请求方式
.1.3.6.1.2.1.2.1.0网络接口的数目IfNumberGET
.1.3.6.1.2.1.2.2.1.2网络接口信息描述IfDescrWALK
.1.3.6.1.2.1.2.2.1.3网络接口类型IfTypeWALK
.1.3.6.1.2.1.2.2.1.4接口发送和接收的最大IP数据报[BYTE]IfMTUWALK
.1.3.6.1.2.1.2.2.1.5接口当前带宽[bps]IfSpeedWALK
.1.3.6.1.2.1.2.2.1.6接口的物理地址IfPhysAddressWALK
.1.3.6.1.2.1.2.2.1.8接口当前操作状态[up|down]IfOperStatusWALK
.1.3.6.1.2.1.2.2.1.10接口收到的字节数IfInOctetWALK
.1.3.6.1.2.1.2.2.1.16接口发送的字节数IfOutOctetWALK
.1.3.6.1.2.1.2.2.1.11接口收到的数据包个数IfInUcastPktsWALK
.1.3.6.1.2.1.2.2.1.17接口发送的数据包个数IfOutUcastPktsWALK
CPU及负载
OID描述备注请求方式
. 1.3.6.1.4.1.2021.11.9.0用户CPU百分比ssCpuUserGET
. 1.3.6.1.4.1.2021.11.10.0系统CPU百分比ssCpuSystemGET
. 1.3.6.1.4.1.2021.11.11.0空闲CPU百分比ssCpuIdleGET
. 1.3.6.1.4.1.2021.11.50.0原始用户CPU使用时间ssCpuRawUserGET
.1.3.6.1.4.1.2021.11.51.0原始nice占用时间ssCpuRawNiceGET
. 1.3.6.1.4.1.2021.11.52.0原始系统CPU使用时间ssCpuRawSystem.GET
. 1.3.6.1.4.1.2021.11.53.0原始CPU空闲时间ssCpuRawIdleGET
. 1.3.6.1.2.1.25.3.3.1.2CPU的当前负载,N个核就有N个负载hrProcessorLoadWALK
. 1.3.6.1.4.1.2021.11.3.0ssSwapInGET
. 1.3.6.1.4.1.2021.11.4.0SsSwapOutGET
. 1.3.6.1.4.1.2021.11.5.0ssIOSentGET
. 1.3.6.1.4.1.2021.11.6.0ssIOReceiveGET
. 1.3.6.1.4.1.2021.11.7.0ssSysInterruptsGET
. 1.3.6.1.4.1.2021.11.8.0ssSysContextGET
. 1.3.6.1.4.1.2021.11.54.0ssCpuRawWaitGET
. 1.3.6.1.4.1.2021.11.56.0ssCpuRawInterruptGET
. 1.3.6.1.4.1.2021.11.57.0ssIORawSentGET
. 1.3.6.1.4.1.2021.11.58.0ssIORawReceivedGET
. 1.3.6.1.4.1.2021.11.59.0ssRawInterruptsGET
. 1.3.6.1.4.1.2021.11.60.0ssRawContextsGET
. 1.3.6.1.4.1.2021.11.61.0ssCpuRawSoftIRQGET
. 1.3.6.1.4.1.2021.11.62.0ssRawSwapIn.GET
. 1.3.6.1.4.1.2021.11.63.0ssRawSwapOutGET
.1.3.6.1.4.1.2021.10.1.3.1Load5GET
.1.3.6.1.4.1.2021.10.1.3.2Load10GET
.1.3.6.1.4.1.2021.10.1.3.3Load15GET
内存及磁盘(1.3.6.1.2.1.25)
OID描述备注请求方式
.1.3.6.1.2.1.25.2.2.0获取内存大小hrMemorySizeGET
.1.3.6.1.2.1.25.2.3.1.1存储设备编号hrStorageIndexWALK
.1.3.6.1.2.1.25.2.3.1.2存储设备类型hrStorageType[OID]WALK
.1.3.6.1.2.1.25.2.3.1.3存储设备描述hrStorageDescrWALK
.1.3.6.1.2.1.25.2.3.1.4簇的大小hrStorageAllocationUnitsWALK
.1.3.6.1.2.1.25.2.3.1.5簇的的数目hrStorageSizeWALK
.1.3.6.1.2.1.25.2.3.1.6使用多少,跟总容量相除就是占用率hrStorageUsedWALK
.1.3.6.1.4.1.2021.4.3.0Total Swap Size(虚拟内存)memTotalSwapGET
.1.3.6.1.4.1.2021.4.4.0Available Swap SpacememAvailSwapGET
.1.3.6.1.4.1.2021.4.5.0Total RAM in machinememTotalRealGET
.1.3.6.1.4.1.2021.4.6.0Total RAM usedmemAvailRealGET
.1.3.6.1.4.1.2021.4.11.0Total RAM FreememTotalFreeGET
.1.3.6.1.4.1.2021.4.13.0Total RAM SharedmemSharedGET
.1.3.6.1.4.1.2021.4.14.0Total RAM BufferedmemBufferGET
.1.3.6.1.4.1.2021.4.15.0Total Cached MemorymemCachedGET
.1.3.6.1.4.1.2021.9.1.2Path where the disk is mounteddskPathWALK
.1.3.6.1.4.1.2021.9.1.3Path of the device for the partitiondskDeviceWALK
.1.3.6.1.4.1.2021.9.1.6Total size of the disk/partion (kBytes)dskTotalWALK
.1.3.6.1.4.1.2021.9.1.7Available space on the diskdskAvailWALK
.1.3.6.1.4.1.2021.9.1.8Used space on the diskdskUsedWALK
.1.3.6.1.4.1.2021.9.1.9Percentage of space used on diskdskPercentWALK
.1.3.6.1.4.1.2021.9.1.10Percentage of inodes used on diskdskPercentNodeWALK
其他的mib

参考:http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers

学习就是学习别人的思维,学习别人遇到问题的处理方法。

------------思路之重
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: