SNMP4J是一个开源的,用Java实现的snmp协议。其中提供了一下API,在这些API上面封装了一些方法,比如SNMP的get-request请求,get-next-request请求等

如果不了解SNMP协议的点我(不是我写的)

下面贴我封装的Java代码(后面还会封装一些其他请求,比如说请求一个表格等操作)

SNMP4J jar包或源码下载点我(不用翻墙) www.snmp4j.org

定义接口Snmp_aip_interface.java

import java.util.List;

public interface Snmp_aip_interface {
/**
* 根据ip,oid返回get消息
* @param ip
* @param oid
* @return
*/
public String get(String ip, String oid_str); /**
* 根据ip,oid和新值设置oid节点的值
* @param ip
* @param oid_str
* @param value_new
*/
public void set(String ip, String oid_str, String value_new); /**
* 根据ip,oid返回getNext消息
* @param ip
* @param oid_str
* @return
*/
public String getNext(String ip, String oid_str); /**
* 根据ip,oid获取bulk消息
* @param ip
* @param oid_str
* @return
*/
public List<String> getBulk(String ip, String oid_str); /**
* snmp v3版get api
* @param ip
* @param oid_str
* @return
*/
public String getV3(String ip, String oid_str); /**
* 向ip地址发送消息,这里利用发送trap消息来发送任意消息
* @param ip
* @param message
*/
public void sendMessage(String ip, String message);
}

对接口的实现Snmp_api.java

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector; import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
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.UdpAddress;
import org.snmp4j.smi.Variable;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping; import com.gxf.snmpinterceptor.Snmp_aip_interface; /**
* 封装snmp v 2的消息格式,对外提供接口
* 使用开源snmp4j进行封装
* 代理端监听udp 161端口,管理端监听的是udp 162端口
* snmp2c提供的消息格式,Get,GetNext,Set,Reponse,Trap,GetBulk,
* @author Administrator
*
* PDU类型 版本(0)|共同体|PDU类型(0-3)|请求标识|差错索引|差错状态(0-5)|差错索引|名称|值|名称|值...
*
* trap
*
* |PDU类型(0-3)|企业|代理地址|trap类型(0-6)|特定代码|时间戳|名称|值..
*
*/
public class Snmp_api implements Snmp_aip_interface{
private Snmp snmp;
private TransportMapping transportMapping;
private int timeOut;
private int timesRetry; public Snmp_api(){
// Thread thread_rec = new receiveTrapThread();
// thread_rec.start();
// listen();
} private void init(){
try {
transportMapping = new DefaultUdpTransportMapping();
} catch (IOException e) {
System.out.println("init transportMapping failed!");
System.out.println(e.getMessage());
}
snmp = new Snmp(transportMapping);
timeOut = 1500;
timesRetry = 2;
} /**
* 根据ip,oid返回get消息
* @param ip
* @param oid
* @return
*/
public String get(String ip, String oid_str){
init();
String ret = "";
//构造PDU
PDU pdu = new PDU();
OID oid = new OID(oid_str);
VariableBinding vb = new VariableBinding(oid);
pdu.add(vb);
pdu.setType(PDU.GET); //构造target
String address_str = "udp:" + ip + "/161";
// String address_str = "udp:210.38.235.184/161";
Address address = GenericAddress.parse(address_str);
OctetString name_com = new OctetString("public");
CommunityTarget target = new CommunityTarget();
target.setAddress(address); //设置address
target.setRetries(timesRetry);
target.setTimeout(timeOut);
target.setVersion(SnmpConstants.version2c); //设置版本号
target.setCommunity(name_com); //设置团体名 try {
this.transportMapping.listen();
} catch (IOException e) {
System.out.println("transportMapping.listen() failed!");
System.out.println(e.getMessage());
}
ResponseEvent responseEvent = null;
//发送消息
try {
responseEvent = snmp.send(pdu, target);
} catch (IOException e) {
System.out.println("snmp.send(pdu, target) failed");
System.out.println(e.getMessage());
}
//获取结果
if(responseEvent != null){
PDU pdu_rep = responseEvent.getResponse();
for(int i = 0; i < pdu_rep.size(); i++){
VariableBinding vb_temp = pdu_rep.get(i);
Variable var_temp = vb_temp.getVariable();
ret += var_temp.toString();
}//for
}//if
try {
transportMapping.close(); //关闭正在进行的监听
} catch (IOException e) {
System.out.println("transportMapping.close() failed!");
System.out.println(e.getMessage());
}
return ret;
} /**
* 根据ip,oid和新值设置oid节点的值
* @param ip
* @param oid_str
* @param value_new
*/
public void set(String ip, String oid_str, String value_new){
init();
//构造PDU
PDU pdu = new PDU();
OID oid = new OID(oid_str);
VariableBinding vb = null; vb = new VariableBinding(oid, new OctetString(value_new)); pdu.add(vb);
pdu.setType(PDU.SET); //构造target
String address_str = "udp:" + ip + "/161";
CommunityTarget target = new CommunityTarget();
OctetString com_oct = new OctetString("public");
target.setCommunity(com_oct); //设置团体名
Address address = GenericAddress.parse(address_str);
target.setAddress(address); //设置address
target.setVersion(SnmpConstants.version2c); //设置版本号
target.setTimeout(1500);
target.setRetries(timesRetry); //发送pdu
try {
transportMapping.listen();
} catch (IOException e) {
System.out.println("listen failed in set pdu");
System.out.println(e.getMessage());
}
try {
snmp.send(pdu, target);
} catch (IOException e) {
System.out.println("send failed in send set message!");
System.out.println(e.getMessage());
} finally{
try {
transportMapping.close(); //关闭正在进行的监听
} catch (IOException e) {
System.out.println("transportMapping.close() failed!");
System.out.println(e.getMessage());
}
}
} /**
* 根据ip,oid返回getNext消息
* @param ip
* @param oid_str
* @return
*/
public String getNext(String ip, String oid_str){
init();
String ret = "";
//构造PDU
PDU pdu = new PDU();
OID oid = new OID(oid_str);
VariableBinding vb = new VariableBinding(oid);
pdu.add(vb);
pdu.setType(PDU.GETNEXT); //构造target
String address_str = "udp:" + ip + "/161"; //UDP和ip
CommunityTarget target = new CommunityTarget();
Address address = GenericAddress.parse(address_str);
target.setCommunity(new OctetString("public"));
target.setAddress(address);
target.setTimeout(timeOut);
target.setRetries(timesRetry);
target.setVersion(SnmpConstants.version2c); //设置版本号 ResponseEvent responseEvent = null; try {
this.transportMapping.listen(); //开始监听
} catch (IOException e1) {
System.out.println("transportMapping.listen() failed!");
System.out.println(e1.getMessage());
} //发送消息
try {
responseEvent = snmp.send(pdu, target);
if(responseEvent != null){ //组装返回的消息
PDU pdu_reponse = responseEvent.getResponse();
for(int i = 0; pdu_reponse != null && i < pdu_reponse.size(); i++){
VariableBinding vb_temp = pdu_reponse.get(i);
Variable var_temp = vb_temp.getVariable();
ret += var_temp.toString();
}
}
} catch (IOException e) {
System.out.println("snmp.send(pdu, target) failed! in getNext");
e.printStackTrace();
} finally{ //关闭监听
try {
this.transportMapping.close();
snmp.close();
} catch (IOException e) {
System.out.println("transportMapping.close() failed!");
System.out.println(e.getMessage());
}
}//finally return ret;
} /**
* 根据ip,oid获取bulk消息
* @param ip
* @param oid_str
* @return
*/
public List<String> getBulk(String ip, String oid_str){
init();
List<String> ret = new ArrayList<String>();
//构造PDU
PDU pdu = new PDU();
pdu.setType(PDU.GETBULK);
pdu.setMaxRepetitions(200);
pdu.setNonRepeaters(0);
OID oid = new OID(oid_str);
VariableBinding vb = new VariableBinding(oid);
pdu.add(vb); //构造target
String address_str = "udp:" + ip + "/161"; //UDP和ip
CommunityTarget target = new CommunityTarget();
Address address = GenericAddress.parse(address_str);
target.setCommunity(new OctetString("public"));
target.setVersion(SnmpConstants.version2c);
target.setAddress(address);
target.setTimeout(timeOut);
target.setRetries(timesRetry); try { //开始监听UDP端口
this.transportMapping.listen();
} catch (IOException e) {
System.out.println("transportMapping.listen() failed!");
System.out.println(e.getMessage());
} //发送消息
ResponseEvent responseEvent = null;
try {
responseEvent = this.snmp.send(pdu, target);
} catch (IOException e) {
System.out.println(".snmp.send(pdu, target) failed! in getBulk");
e.printStackTrace();
} if(responseEvent != null){
PDU pdu_rec = responseEvent.getResponse(); System.out.println(pdu_rec.size()); //输出为0,说明前面没有获取到数据
for(int i = 0; i < pdu_rec.size(); i++){
String str_temp = "";
VariableBinding vb_temp = pdu_rec.get(i);
str_temp += vb_temp.getOid() + " ";
str_temp += vb_temp.getVariable().toString();
ret.add(str_temp);
}//for
}//if try {
this.transportMapping.close();
} catch (IOException e) {
System.out.println("transportMapping.close() failed!");
System.out.println(e.getMessage());
} return ret;
} /**
* 接收trap消息线程
* @author Administrator
*
*/
private class receiveTrapThread extends Thread{
public void run(){
System.out.println("start run thread.."); try {
transportMapping.listen();
} catch (IOException e) {
System.out.println("listen failed in receiveTrapThread.run()!");
e.printStackTrace();
}
CommandResponder commandResponder = new CommandResponder(){
@Override
public void processPdu(CommandResponderEvent event) {
System.out.println("enter processPdu()...");
PDU pdu_receive = event.getPDU();
StringBuffer sb = new StringBuffer(); for(int i = 0; i < pdu_receive.size(); i++){
VariableBinding vb_temp = pdu_receive.get(i);
sb.append(vb_temp.getVariable().toString());
}//for
System.out.println(sb.toString());
} };
snmp.addCommandResponder(commandResponder);
}
} public synchronized void listen(){
System.out.println("start listen..");
try {
this.wait();
} catch (InterruptedException e) { e.printStackTrace();
}
} /* (non-Javadoc)
* @see com.gxf.snmp.interfaces.Snmp_aip_interface#getV3(java.lang.String, java.lang.String)
*/
@Override
public String getV3(String ip, String oid_str) {
Snmp snmp = null;
try {
snmp = new Snmp(new DefaultUdpTransportMapping()); USM usm = new USM(SecurityProtocols.getInstance(),
new OctetString(MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm); snmp.listen();
} catch (IOException e) {
e.printStackTrace();
}
UsmUser user = new UsmUser(
new OctetString("luckygxf"),
AuthMD5.ID, new OctetString("luckygxf"),
PrivDES.ID, new OctetString("luckygxf")
);
OctetString contextEngineId = new OctetString("0002651100[02]");
snmp.getUSM().addUser(new OctetString("nmsAdmin"), new OctetString("0002651100"), user);
snmp.getUSM().addUser(new OctetString("luckygxf"), user);
String address_str = ip + "/161";
// System.out.println("address_str = " + address_str);
Address address = new UdpAddress(address_str);
UserTarget target = new UserTarget();
target.setVersion(SnmpConstants.version3);
target.setAddress(address);
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
target.setSecurityName(new OctetString("luckygxf"));
target.setTimeout(2000);
target.setRetries(1); ScopedPDU pdu = new ScopedPDU();
pdu.setType(PDU.GET);
pdu.setContextEngineID(contextEngineId);
VariableBinding vb = new VariableBinding(new OID(oid_str));
pdu.add(vb); ResponseEvent responseEvent = null;
try {
responseEvent = snmp.send(pdu, target);
} catch (IOException e) { e.printStackTrace();
}
StringBuffer sb = new StringBuffer(); //返回的字符串
if(null != responseEvent){
PDU pdu_rec = responseEvent.getResponse();
// System.out.println("pdu_rec.size() = " + pdu_rec.size());
if(pdu_rec != null){
Vector<? extends VariableBinding> vbs = pdu_rec.getVariableBindings();
for(VariableBinding vb_temp : vbs){
sb.append(vb_temp.getVariable().toString());
}//for
}
}//if try {
snmp.close();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString(); } /* (non-Javadoc)
* @see com.gxf.snmp.interfaces.Snmp_aip_interface#sendMessage(java.lang.String, java.lang.String)
*/
@Override
public void sendMessage(String ip, String message) {
//构造trap PDU
PDU pdu = new PDU();
VariableBinding vb = new VariableBinding(new OID("1.3.6.1.2.3377.10.1.1.1.1"), new OctetString(message));
pdu.add(vb);
pdu.setType(PDU.TRAP); //构造target
String address_str = "udp:" + ip + "/16200"; //这里发送端口为16200
CommunityTarget target = new CommunityTarget();
Address address = GenericAddress.parse(address_str);
target.setAddress(address);
target.setVersion(SnmpConstants.version2c);
target.setCommunity(new OctetString("public"));
target.setTimeout(2000);
target.setRetries(2);
TransportMapping<UdpAddress> tranportMapping = null;
try {
tranportMapping = new DefaultUdpTransportMapping();
tranportMapping.listen();
} catch (IOException e) {
System.out.println("sendTrap(String ip) failed in Snmp_api.sendTrap(String ip)!");
e.printStackTrace();
}
Snmp snmp = new Snmp(tranportMapping);
try {
ResponseEvent responseEvent = snmp.send(pdu, target); //得到回复的pdu
if(null != responseEvent){
StringBuffer sb = new StringBuffer();
PDU pdu_rec = responseEvent.getResponse();
for(int i = 0;pdu_rec != null && i < pdu_rec.size(); i++){
VariableBinding vb_temp = pdu_rec.get(i);
sb.append(vb.getVariable().toInt());
}//for System.out.println(sb.toString());
}
} catch (IOException e) {
System.out.println("snmp.send(pdu, target) failed in Snmp_api.sendTrap(String ip)!");
} try {
tranportMapping.close();
snmp.close(); //关闭tansportmapping and snmp 释放资源
} catch (IOException e) {
System.out.println("tranportMapping.close() and snmp.close() failed in Snmp_api.sendTrap(String ip)!");
e.printStackTrace();
} }
}

P.S.从google code中copy了一份到github中:https://github.com/luckygxf/flower

这个封装的功能更强大

对SNMP4J的一些封装的更多相关文章

  1. [C#] 简单的 Helper 封装 -- RegularExpressionHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. iOS开发之App间账号共享与SDK封装

    上篇博客<iOS逆向工程之KeyChain与Snoop-it>中已经提到了,App间的数据共享可以使用KeyChian来实现.本篇博客就实战一下呢.开门见山,本篇博客会封装一个登录用的SD ...

  3. Ajax实现原理,代码封装

    都知道实现页面的异步操作需要使用Ajax,那么Ajax到是怎么实现异步操作的呢? 首先需要认识一个对象 --> XMLHttpRequest 对象 --> Ajax的核心.它有许多的属性和 ...

  4. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  5. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  6. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  7. 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  8. CSharpGL(29)初步封装Texture和Framebuffer

    +BIT祝威+悄悄在此留下版了个权的信息说: CSharpGL(29)初步封装Texture和Framebuffer +BIT祝威+悄悄在此留下版了个权的信息说: Texture和Framebuffe ...

  9. CSharpGL(7)对VAO和VBO的封装

    CSharpGL(7)对VAO和VBO的封装 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码中包含10多个独立的Demo,更适合入门参考 ...

随机推荐

  1. django中itsdangerous的用法

    itsdangerous用来解决什么问题,为什么需要用到itsdangerous? 安装命令:pip install itsdangerous 有时候你想向不可信的环境发送一些数据,但如何安全完成这个 ...

  2. Deploy Flask app to Apache on Windows

    内容已过期,分割线以下为原文存档. 故事背景 这次我需要将一个Flask应用部署到本地的Windows服务器上.操作系统是64位的,程序是基于Python 3开发的,大体就是这样. 部署选项 根据Fl ...

  3. SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...

  4. C#调用存储过程的ADO.Net

    using System.Data.SqlClient; //如果存储过程没有输入和输出参数,而且不返回查询结果 SqlCommand cmd = new SqlCommand("存储过程名 ...

  5. 队列 和 堆栈用python 来实现

    一.利用python列表实现堆栈和队列 堆栈: 堆栈是一个后进先出的数据结构,其工作方式就像生活中常见到的直梯,先进去的人肯定是最后出. 我们可以设置一个类,用列表来存放栈中的元素的信息,利用列表的a ...

  6. Python和qqbot库开发简单的机器人

    from qqbot import QQBotSlot as qqbotslot, RunBot @qqbotslot def onQQMessage(bot, contact, member, co ...

  7. clustalX2使用以及相关的问题

    Clustalx的操作 第一步:输入序列文件. 第二步:设定比对的一些参数. 参数设定窗口. 第三步:开始序列比对. 第四步:比对完成,选择保存结果文件的格式 相关问题 CLUSTALX-是CLUST ...

  8. java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)

    目录: 1. 编程题目 2. 方法一 3. 方法二 4. 方法三 5. 方法四 6. 总结 正文: 1. 编程题目 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数. 2. ...

  9. SPOJ - REPEATS RMQ循环节

    题意:求重复次数最多的重复子串(并非长度最长) 枚举循环子串长度\(L\),求最多能连续出现多少次,相邻的节点往后的判断可以使用\(LCP\)得到值为\(K\),那么得到一个可能的解就是\(K/L+1 ...

  10. flume将数据发送到kafka、hdfs、hive、http、netcat等模式的使用总结

    1.source为http模式,sink为logger模式,将数据在控制台打印出来. conf配置文件如下: # Name the components on this agent a1.source ...