snmp4j snmp4j的使用

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.管理端:

  1 package com.main;
  2
  3 import java.io.IOException;
  4
  5 import org.snmp4j.CommunityTarget;
  6 import org.snmp4j.PDU;
  7 import org.snmp4j.Snmp;
  8 import org.snmp4j.TransportMapping;
  9 import org.snmp4j.event.ResponseEvent;
 10 import org.snmp4j.event.ResponseListener;
 11 import org.snmp4j.mp.SnmpConstants;
 12 import org.snmp4j.smi.Address;
 13 import org.snmp4j.smi.GenericAddress;
 14 import org.snmp4j.smi.OID;
 15 import org.snmp4j.smi.OctetString;
 16 import org.snmp4j.smi.VariableBinding;
 17 import org.snmp4j.transport.DefaultUdpTransportMapping;
 18
 19
 20 /**
 21  *以廣播的方式發送snmp并獲取設備的信息
 22  *
 23  * @author PC
 24  *
 25  */
 26 public class Manager {
 27
 28     /**
 29      * @param args
 30      */
 31     public static void main(String[] args) {
 32         // TODO Auto-generated method stub
 33
 34         System.out.println("管理端启动。。。");
 35
 36         send();
 37
 38         System.out.println("success");
 39     }
 40
 41     // 发送数据到目标机器
 42     public static void send() {
 43
 44         TransportMapping transport = null;
 45
 46         try {
 47             // 传输协议为UDP
 48             transport = new DefaultUdpTransportMapping();
 49         } catch (IOException e) {
 50             // TODO Auto-generated catch block
 51             e.printStackTrace();
 52         }
 53         // 创建snmp对象,发送报文
 54         Snmp snmp = new Snmp(transport);
 55
 56         try {
 57             snmp.listen();
 58         } catch (IOException e1) {
 59             // TODO Auto-generated catch block
 60             e1.printStackTrace();
 61         }
 62
 63         OID oid = new OID("1.3.6.1.2.2.1.0");
 64         // 报文
 65         PDU pdu = new PDU();
 66         VariableBinding variableBinding = new VariableBinding(oid);
 67         pdu.add(variableBinding);
 68         pdu.setType(PDU.GET);
 69
 70         // 目标
 71         CommunityTarget target = new CommunityTarget();
 72
 73         // 设置snmp共同体
 74         OctetString oct = new OctetString("public");
 75         target.setCommunity(oct);
 76
 77         // 向255.255.255.255发送UPD数据包即为UDP广播,接收端只需绑定UDP广播的端口号即可得到数据
 78         Address address = GenericAddress.parse("udp:192.168.0.254/161");
 79         target.setAddress(address);
 80         target.setRetries(2);
 81         target.setTimeout(5000);
 82         target.setVersion(SnmpConstants.version1);
 83
 84         // 设置监听对象
 85         ResponseListener listener = new ResponseListener() {
 86             public void onResponse(ResponseEvent event) {
 87                 ((Snmp) event.getSource()).cancel(event.getRequest(), this);
 88                 PDU request = event.getRequest();
 89                 PDU response = event.getResponse();
 90                 if (response != null) {
 91                     System.out.println("request.size()=" + request.size());
 92                     System.out.println("response.size()=" + response.size());
 93                 }
 94             }
 95         };
 96
 97         try {
 98             snmp.send(pdu, target, null, listener);
 99         } catch (IOException e) {
100             // TODO Auto-generated catch block
101             e.printStackTrace();
102         }
103     }
104
105 }

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

  1 package com.main;
  2
  3 import java.io.IOException;
  4
  5 import org.snmp4j.CommunityTarget;
  6 import org.snmp4j.PDU;
  7 import org.snmp4j.Snmp;
  8 import org.snmp4j.TransportMapping;
  9 import org.snmp4j.event.ResponseEvent;
 10 import org.snmp4j.mp.SnmpConstants;
 11 import org.snmp4j.smi.Address;
 12 import org.snmp4j.smi.GenericAddress;
 13 import org.snmp4j.smi.OID;
 14 import org.snmp4j.smi.OctetString;
 15 import org.snmp4j.smi.VariableBinding;
 16 import org.snmp4j.transport.DefaultUdpTransportMapping;
 17
 18 public class Monitor {
 19
 20     // systemDescr
 21         static final String OID1 = "1.3.6.1.2.1.1.1.0";
 22         // eth0
 23         static final String OID2 = "1.3.6.1.2.1.2.2.1.2.2";
 24         // MAC
 25         static final String OID3 = "1.3.6.1.2.1.2.2.1.6.2";
 26
 27         static final String OID4 = "1.3.6.1.2.1.1.1";
 28
 29         //static final int [] OID5 = {1,3,6,1,2,1,1,2}; 与第一个一样
 30
 31     /**
 32      * @param args
 33      */
 34     public static void main(String[] args) {
 35         // TODO Auto-generated method stub
 36         GetOID();
 37     }
 38
 39     /**
 40      * 获得本机oid
 41      */
 42     public static void GetOID() {
 43
 44         TransportMapping transport = null;
 45
 46         try {
 47             // 传输协议udp
 48             transport = new DefaultUdpTransportMapping();
 49             transport.listen();
 50         } catch (IOException e1) {
 51             // TODO Auto-generated catch block
 52             e1.printStackTrace();
 53         }
 54
 55         // 構造報文
 56         PDU request = new PDU();
 57         request.add(new VariableBinding(new OID(OID1)));
 58         request.add(new VariableBinding(new OID(OID2)));
 59         request.add(new VariableBinding(new OID(OID3)));
 60
 61         request.add(new VariableBinding(new OID(OID4)));
 62         //request.add(new VariableBinding(new OID(OID5)));
 63
 64         request.setType(PDU.GETNEXT);
 65
 66         // snmp初始化
 67         Snmp snmp = new Snmp(transport);
 68
 69         // 構造目標
 70         CommunityTarget target = new CommunityTarget();
 71         Address localAddress =GenericAddress.parse("udp:localhost/161");
 72         target.setAddress(localAddress);
 73         OctetString oct = new OctetString("public");
 74         target.setCommunity(oct);
 75         target.setVersion(SnmpConstants.version2c);
 76         target.setRetries(2);
 77         target.setTimeout(5 * 60);
 78
 79         try {
 80             // 發送報文
 81             ResponseEvent responseEvent = snmp.send(request, target);
 82
 83                 PDU response = responseEvent.getResponse();
 84                 if (response != null) {
 85                 System.out.println("request.size()=" + request.size());
 86                 System.out.println("response.size()=" + response.size());
 87                 VariableBinding vb1 = response.get(0);
 88                 VariableBinding vb2 = response.get(1);
 89                 VariableBinding vb3 = response.get(2);
 90                 VariableBinding vb4 = response.get(3);
 91                 //VariableBinding vb5 = response.get(4);
 92                 System.out.println(vb1);
 93                 System.out.println(vb2);
 94                 System.out.println(vb3);
 95                 System.out.println(vb4);
 96                 //System.out.println(vb5);
 97
 98                 //释放
 99                 transport.close();
100             }
101         } catch (IOException e) {
102             // TODO Auto-generated catch block
103             e.printStackTrace();
104         }
105     }
106 }

五.MIB:

常用OID:

系统参数(1.3.6.1.2.1.1)
OID 描述 备注 请求方式
.1.3.6.1.2.1.1.1.0 获取系统基本信息 SysDesc GET
.1.3.6.1.2.1.1.3.0 监控时间 sysUptime GET
.1.3.6.1.2.1.1.4.0 系统联系人 sysContact GET
.1.3.6.1.2.1.1.5.0 获取机器名 SysName GET
.1.3.6.1.2.1.1.6.0 机器坐在位置 SysLocation GET
.1.3.6.1.2.1.1.7.0 机器提供的服务 SysService GET
.1.3.6.1.2.1.25.4.2.1.2 系统运行的进程列表 hrSWRunName WALK
.1.3.6.1.2.1.25.6.3.1.2 系统安装的软件列表 hrSWInstalledName WALK
CPU及负载
OID 描述 备注 请求方式
. 1.3.6.1.4.1.2021.11.9.0 用户CPU百分比 ssCpuUser GET
. 1.3.6.1.4.1.2021.11.10.0 系统CPU百分比 ssCpuSystem GET
. 1.3.6.1.4.1.2021.11.11.0 空闲CPU百分比 ssCpuIdle GET
. 1.3.6.1.4.1.2021.11.50.0 原始用户CPU使用时间 ssCpuRawUser GET
.1.3.6.1.4.1.2021.11.51.0 原始nice占用时间 ssCpuRawNice GET
. 1.3.6.1.4.1.2021.11.52.0 原始系统CPU使用时间 ssCpuRawSystem. GET
. 1.3.6.1.4.1.2021.11.53.0 原始CPU空闲时间 ssCpuRawIdle GET
. 1.3.6.1.2.1.25.3.3.1.2 CPU的当前负载,N个核就有N个负载 hrProcessorLoad WALK
. 1.3.6.1.4.1.2021.11.3.0 ssSwapIn GET
. 1.3.6.1.4.1.2021.11.4.0 SsSwapOut GET
. 1.3.6.1.4.1.2021.11.5.0 ssIOSent GET
. 1.3.6.1.4.1.2021.11.6.0 ssIOReceive GET
. 1.3.6.1.4.1.2021.11.7.0 ssSysInterrupts GET
. 1.3.6.1.4.1.2021.11.8.0 ssSysContext GET
. 1.3.6.1.4.1.2021.11.54.0 ssCpuRawWait GET
. 1.3.6.1.4.1.2021.11.56.0 ssCpuRawInterrupt GET
. 1.3.6.1.4.1.2021.11.57.0 ssIORawSent GET
. 1.3.6.1.4.1.2021.11.58.0 ssIORawReceived GET
. 1.3.6.1.4.1.2021.11.59.0 ssRawInterrupts GET
. 1.3.6.1.4.1.2021.11.60.0 ssRawContexts GET
. 1.3.6.1.4.1.2021.11.61.0 ssCpuRawSoftIRQ GET
. 1.3.6.1.4.1.2021.11.62.0 ssRawSwapIn. GET
. 1.3.6.1.4.1.2021.11.63.0 ssRawSwapOut GET
.1.3.6.1.4.1.2021.10.1.3.1 Load5 GET
.1.3.6.1.4.1.2021.10.1.3.2 Load10 GET
.1.3.6.1.4.1.2021.10.1.3.3 Load15 GET
网络接口(1.3.6.1.2.1.2)
OID 描述 备注 请求方式
.1.3.6.1.2.1.2.1.0 网络接口的数目 IfNumber GET
.1.3.6.1.2.1.2.2.1.2 网络接口信息描述 IfDescr WALK
.1.3.6.1.2.1.2.2.1.3 网络接口类型 IfType WALK
.1.3.6.1.2.1.2.2.1.4 接口发送和接收的最大IP数据报[BYTE] IfMTU WALK
.1.3.6.1.2.1.2.2.1.5 接口当前带宽[bps] IfSpeed WALK
.1.3.6.1.2.1.2.2.1.6 接口的物理地址 IfPhysAddress WALK
.1.3.6.1.2.1.2.2.1.8 接口当前操作状态[up|down] IfOperStatus WALK
.1.3.6.1.2.1.2.2.1.10 接口收到的字节数 IfInOctet WALK
.1.3.6.1.2.1.2.2.1.16 接口发送的字节数 IfOutOctet WALK
.1.3.6.1.2.1.2.2.1.11 接口收到的数据包个数 IfInUcastPkts WALK
.1.3.6.1.2.1.2.2.1.17 接口发送的数据包个数 IfOutUcastPkts WALK

内存及磁盘(1.3.6.1.2.1.25)

OID 描述 备注 请求方式
.1.3.6.1.2.1.25.2.2.0 获取内存大小 hrMemorySize GET
.1.3.6.1.2.1.25.2.3.1.1 存储设备编号 hrStorageIndex WALK
.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 存储设备描述 hrStorageDescr WALK
.1.3.6.1.2.1.25.2.3.1.4 簇的大小 hrStorageAllocationUnits WALK
.1.3.6.1.2.1.25.2.3.1.5 簇的的数目 hrStorageSize WALK
.1.3.6.1.2.1.25.2.3.1.6 使用多少,跟总容量相除就是占用率 hrStorageUsed WALK
.1.3.6.1.4.1.2021.4.3.0 Total Swap Size(虚拟内存) memTotalSwap GET
.1.3.6.1.4.1.2021.4.4.0 Available Swap Space memAvailSwap GET
.1.3.6.1.4.1.2021.4.5.0 Total RAM in machine memTotalReal GET
.1.3.6.1.4.1.2021.4.6.0 Total RAM used memAvailReal GET
.1.3.6.1.4.1.2021.4.11.0 Total RAM Free memTotalFree GET
.1.3.6.1.4.1.2021.4.13.0 Total RAM Shared memShared GET
.1.3.6.1.4.1.2021.4.14.0 Total RAM Buffered memBuffer GET
.1.3.6.1.4.1.2021.4.15.0 Total Cached Memory memCached GET
.1.3.6.1.4.1.2021.9.1.2 Path where the disk is mounted dskPath WALK
.1.3.6.1.4.1.2021.9.1.3 Path of the device for the partition dskDevice WALK
.1.3.6.1.4.1.2021.9.1.6 Total size of the disk/partion (kBytes) dskTotal WALK
.1.3.6.1.4.1.2021.9.1.7 Available space on the disk dskAvail WALK
.1.3.6.1.4.1.2021.9.1.8 Used space on the disk dskUsed WALK
.1.3.6.1.4.1.2021.9.1.9 Percentage of space used on disk dskPercent WALK
.1.3.6.1.4.1.2021.9.1.10 Percentage of inodes used on disk dskPercentNode WALK

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

-------------思路之重

时间: 2024-08-27 19:04:58

snmp4j snmp4j的使用的相关文章

Snmp学习总结(七)——SNMP4J介绍

一.SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似. SNMP4J API 提供以下下特性: 支持MD5和SHA验证,DES,3DES,AES128.AES192和AES256加密的SNMPv3. 支持MPv1,MPv2C和MPv3,带执行的可阻塞的信息处理模块. 全部PDU格式. 可阻塞的传输拓扑.支持UPD.TCP.T

snmp4j 编程

从www.snmp4j.org下载snmp4j的jar包,用eclipse新建一个java项目.将jar包导入工程(只有一个jar包),开始编程 一个简单的测试程序 //create target //create pdu //snmp.send okay,上代码 package com.gxf.snmp; import java.io.IOException; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import or

使用snmp4j实现Snmp功能(一)

相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 上一篇文章讲了Snmp的一些基本概念(Snmp学习笔记),接下来,我们使用Java的开源组件snmp4j来实现一下Snmp里的各种功能.首先是上一篇文章中的那个例子.即通过snmp获取机器名. snmp4j的jar包可以在它的官方网站http://www.snmp4j.org/上下载,我就不啰嗦了. 接下来直接贴代码: import java.io.IOE

使用snmp4j实现Snmp功能(二)

相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前一篇文章讲了如何用snmp4j实现set和get的功能,今天讲如何接收trap. snmp4j提供了一个抽象类CommandResponder类用于接收trap,这个类里面有一个必须实现的方法processPdu(),当接收到trap,会自动进入这个方法,因此我们可以将对trap的处理写在这里. 下面修改上篇文章例子中的initComm()方法: pri

使用snmp4j实现Snmp功能(三)

相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前两篇文章讲了如何使用Snmp4j实现Set.Get(使用snmp4j实现Snmp功能(一))以及发送.接收Trap(使用snmp4j实现Snmp功能(二)) 功能. 在我们前面的实现中,如果访问MIB库中不存在的OID,Get方式的话,我们会得到一个Null值,而Set方式时Agent端会把我们发过去的 PDU原封不动的返回回来.当然多数情况下这不是我们

snmp4j读取数据

win7下开启snmpv2: 打开控制面板-->程序-->程序和功能-->打开或者关闭windows功能,选择简单网络管理协议(snmp),点击确定,打开服务,找到snmp service,右键属性,找到安全选项,在接受的社区名称中,添加以后程序要访问的团体名,在接受来自一下主机的snmp数据包中添加本机IP或者localhost(取决于程序使用localhost还是本机IP访问,如果使用本机IP访问,但是这里填localhost,则是无法访问的). 以下都是同步实现的: snmp ge

snmp4j获取mib信息的实例(测试成功)

使用java采用SNMP协议来获取设备上的MIB信息,测试例子采用的是本机作为测试,并且系统是win7而且启用了SNMP协议. 在win7上开启SNMP协议的教程如链接所示: http://blog.chinaunix.net/uid-24058189-id-2105677.html 在java中来操作snmp协议的jar包下载地址: http://www.snmp4j.org 工程结构(红框为最重要的两个文件): 本例子源码(采用maven框架,不影响例子): package mySNMP;

SNMP4j实现Trap的示例

目录: 环境参数 代码示例 [一].环境参数 jdk 1.6.0_18 snmp4j 1.11.3 [二].代码示例 1. Trap接收器的实现 代码:SnmpTrapMultiThreadReceiver.java package com.micmiu.snmp4j.demo1x; import java.io.IOException; import java.net.UnknownHostException; import java.util.Vector; import org.snmp4

SNMP4J与ObjectSNMP对比分析之我见

SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.Object SNMP是一个面向对象的SNMP开发组件,与关系数据库流行的O-R Mapping技术类似,实现了Object到SNMP MIB的操作映射(简称O-M Mapping).使用SNMP4J与ObjectSNMP开发类似于使用原生JDBC开发与Hibernate框架. SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命