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. 【noip2017】【Luogu3960】列队 线段树

    题目描述 Sylvia 是一个热爱学习的女♂孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n \times mn×m 名学生,方阵的 ...

  2. CF1137E. Train Car Selection(可删堆)

    题面 三个操作 1.在当前数列最左端加入\(k\)个初始为\(0\)的数 2.在当前数列最右端加入\(k\)个初始为\(0\)的数 3.将当前数列从左到右第\(i\)个数加上\(b+(i-1)k(b& ...

  3. ASP.Net一般处理程序Session用法

    1.在aspx和aspx.cs中,都是以 Session["type"]="aaa" 和 string aaa=Session["type" ...

  4. springcloud微服务总结五 服务熔断

    一:雪崩效应 如下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者.A不可用引起了B的不可用,并将不可用像滚雪球一样放大到C和D时,导致整个系统瘫痪,雪崩效应就形成了. 雪崩过程: ...

  5. Android 基于TCP多线程通信实现群聊天的功能

    1.TCP多线程原理图 2.实现方法 (1)服务器端 (2)客户端 3.java后台代码 主界面 package com.lucky.test50socket2; import android.ann ...

  6. composer 创建自己包

    服务器环境下创建自己的项目文件 初始化composer 打开cmd 窗口,cd 到 backrestore 执行 composer init 命令 D:\phpStudy\WWW\backrestor ...

  7. Jupyter 安装与应用

    用pip安装Jupyter pip install jupyter 从命令行启动笔记本服务器 jupyter notebook 前提要先启动python,这里有一个 token值,如果不是使用默认浏览 ...

  8. 用 Koa 提供 Restful service 和查询 MongoDB 的例子

    const path = require('path'); const Koa = require('koa'); const app = new Koa(); const compose = req ...

  9. C++ GUI Qt4编程(09)-3.3spreadsheet-toolbar

    1. C++ GUI Qt4编程第三章,增加工具栏.状态栏和快捷键. 2. mainwindow.h /**/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #i ...

  10. RNN(recurrent neural network)学习笔记

    参考:https://www.jianshu.com/p/9dc9f41f0b29  以及<白话深度学习与TensorFlow> 与前馈神经网络.卷积神经网络等不同之处在于,RNN具有一定 ...