snmp 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.管理端:
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 | 获取系统基本信息 | 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 |
| 网络接口(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 |
| 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.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 |
其他的mib
参考:http://www.iana.org/assignments/enterprise-numbers/enterprise-numbers
学习就是学习别人的思维,学习别人遇到问题的处理方法。
------------思路之重
snmp snmp4j的使用的更多相关文章
- Snmp学习总结(七)——SNMP4J介绍
一.SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMP ...
- SNMP学习笔记之SNMP4J介绍(Java)
0x00 SNMP4J介绍 SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应.SNMP4J是纯面向对象设计与SNMP++(用C++实现S ...
- 【转载】 java利用snmp4j包来读取snmp协议数据(Manager端)
https://www.cnblogs.com/xdp-gacl/p/4187089.html http://doc.okbase.net/yuanfy008/archive/265663.html ...
- 使用snmp4j实现Snmp功能(三)
相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前两篇文章讲了如何使用Snmp4j实现Set.Get(使用 ...
- 使用snmp4j实现Snmp功能(二)
相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 前一篇文章讲了如何用snmp4j实现set和get的功能, ...
- 使用snmp4j实现Snmp功能(一)
相关链接:Snmp学习笔记使用snmp4j实现Snmp功能(一)使用snmp4j实现Snmp功能(二)使用snmp4j实现Snmp功能(三) 上一篇文章讲了Snmp的一些基本概念(Snmp学习笔记), ...
- snmp getTable demo :iftable ipAddresstable
package org.huangxf.snmp.test; import java.io.IOException; import java.util.List; import org.snmp4j. ...
- snmp4j 编程
从www.snmp4j.org下载snmp4j的jar包,用eclipse新建一个java项目.将jar包导入工程(只有一个jar包),开始编程 一个简单的测试程序 //create target / ...
- 基于Java使用Snmp4j进行监控与采集(snmptrap、snmpwalk、snmpget)
之前有在弄监控服务器这块的工作,今天来整体总结下.因为有些服务器(路由器.交换机等都是基于snmp协议的)必须使用snmp协议去监控采集和接收信息,所以必须去了解snmp相关内容,以及如何在基于jav ...
随机推荐
- CF 36E Two Paths——欧拉路
题目:http://codeforces.com/contest/36/problem/E 找出两条欧拉路覆盖无向图. 套上欧拉路模板.用过的边要记录. 注意 一个连通块.4个奇度数点 的情况是在两个 ...
- inotify 同步脚本
#!/bin/bash path1=/home/htoa/tomcat/webapps/ROOT/htoa/ ip=192.168.30.13 /usr/bin/inotifywait -mrq -- ...
- 设置eclipse中jsp/html文件好看的自动排版
注:本文转载于ieayoio,原文链接:https://blog.csdn.net/ieayoio/article/details/49930587#8912689 eclipse中jsp文件代码的排 ...
- vijos1264:神秘的咒语
描述 身为拜月教的高级间谍,你的任务总是逼迫你出生入死.比如这一次,拜月教主就派你跟踪赵灵儿一行,潜入试炼窟底. 据说试炼窟底藏着五行法术的最高法术:风神,雷神,雪妖,火神,山神的咒语.为了习得这些法 ...
- 【转】hurry_liu 大神STM32移植contiki入门之一:系统介绍和开发环境搭建
前言: 由于项目的原因,需要在LPC1788(STM32 cortex-M3)上面跑contiki. 之前没有涉及到contiki,不知其为何物.不过这个不是难事,做IT的,每每遇到新事物,都不会处理 ...
- 【转】CSG(Closed Subscriber Group)闭合用户组
CSG是3GPP R8中引入的概念,定义为闭合用户组.有以下特点: 1. 每个CSG由一个CSG ID标识 2. 同一用户可属于多个CSG,用户与CSG的关系就好比签约,启用了CSG小区只会允许签约用 ...
- Py修行路 Matplotlib 绘图及可视化模块
Matplotlib是一个强大的Python绘图和数据可视化的工具包. 安装方法:pip install matplotlib 引用方法:import matplotlib.pyplot as plt ...
- Celery-4.1 用户指南: Daemonization (系统守护进程)
Generic init-scripts 查看Celery发布里的 extra/generic-init.d/ 文件夹. 这个文件夹中包含了celery worker 程序的通用bash初始化脚本,可 ...
- C语言在32位和64位机器下数字数据类型的字节数取决于编译器和平台, 主要由编译器决定。
C语言中数字数据类型的字节数 C声明 32位机器 64位机器 char 1 1 short int 2 2 int 4 4 //整型在32位和64位下都是4个字节 long int 4 8 l ...
- Drools学习笔记1—规则文件
Facts(即普通的POJO) 指普通业务对象插入到Workingmemory后的对象规则可以对fact对象进行任意的对象操作是规则与应用系统交换的桥梁返回FactHandler对象,是插入到Work ...