https://www.cnblogs.com/xdp-gacl/p/4187089.html
http://doc.okbase.net/yuanfy008/archive/265663.html
1 snmp简单介绍
java利用snmp4j包来读取snmp协议数据,很简单的一个流程,就是利用java来读取运行snmp协议的数据,例如服务器、PC机或者路由器等运行了snmp协议的设备。
snmp协议是什么呢?
简单网络管理协议(SNMP),由一组网络管理的标准组成,包含一个 应用层 协议(application layer protocol)、 数据库模型 (database schema)和一组资源对象。该协议能够支持 网络管理系统 ,用以监测连接到网络上的设备是否有任何引起管理上关注的情况。该协议是互联网工程工作小组(IETF,Internet Engineering TaskForce)定义的internet协议簇的一部分。SNMP的目标是管理 互联网 Internet上众多厂家生产的软硬件平台,因此SNMP受Internet标准 网络管理 框架的影响也很大。SNMP已经出到第三个版本的协议,其功能较以前已经大大地加强和改进了。
上面是百度百科上对于snmp的一个定义,其实很简单,就是用来管理网络、查看网络信息的一种协议。
2 在本机上开启snmp协议
那么如何在本机上开启snmp协议呢?
首先,在控制面板中找到“卸载程序”;
在弹出的窗口中单击“打开或关闭Windows功能”;
勾选弹出窗口中的“简单网络管理协议(SNMP)”项后单击“确定”并根据提示完成安装即可。
完成SNMP服务的安装后,右键单击“计算机”选择“管理”
在弹出的“计算机管理”窗口中左侧导航栏中找到“服务”,并在右侧找到“SNMPService”项;
鼠标双击“SNMPService”选项,在弹出的窗口中切换到“安全”选项卡中,如下图添加“接受的社区名称”和接收那些主机发出的SNMP数据包。
“接受的社区名称”是自己定义的任意字符都可以,接收那些主机发出的SNMP数据包定义成你的Nagios服务器即可。到这里被监控端的Windows主机的SNMP服务就配置完成了。
其中要注意的地方就是,在开启后,还要到服务里面给snmp协议添加public权限。
3 snmp4j.jar包的下载
包用的是snmp4j.jar,下载地址是:http://www.snmp4j.org
4 编码测试
SnmpData:
- package com.test.snmp;
-
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.CountDownLatch;
- import java.util.concurrent.TimeUnit;
-
- 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.Integer32;
- import org.snmp4j.smi.Null;
- import org.snmp4j.smi.OID;
- import org.snmp4j.smi.OctetString;
- import org.snmp4j.smi.VariableBinding;
- import org.snmp4j.transport.DefaultUdpTransportMapping;
-
- public class SnmpData {
-
- public static final int DEFAULT_VERSION = SnmpConstants.version2c;
- public static final String DEFAULT_PROTOCOL = "udp";
- public static final int DEFAULT_PORT = 161;
- public static final long DEFAULT_TIMEOUT = 3 * 1000L;
- public static final int DEFAULT_RETRY = 3;
-
- /**
- * 创建对象communityTarget,用于返回target
- *
- * @param targetAddress
- * @param community
- * @param version
- * @param timeOut
- * @param retry
- * @return CommunityTarget
- */
- public static CommunityTarget createDefault(String ip, String community) {
- Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip
- + "/" + DEFAULT_PORT);
- CommunityTarget target = new CommunityTarget();
- target.setCommunity(new OctetString(community));
- target.setAddress(address);
- target.setVersion(DEFAULT_VERSION);
- target.setTimeout(DEFAULT_TIMEOUT); // milliseconds
- target.setRetries(DEFAULT_RETRY);
- return target;
- }
- /*根据OID,获取单条消息*/
- public static void snmpGet(String ip, String community, String oid) {
-
- CommunityTarget target = createDefault(ip, community);
- Snmp snmp = null;
- try {
- PDU pdu = new PDU();
- // pdu.add(new VariableBinding(new OID(new int[]
- // {1,3,6,1,2,1,1,2})));
- pdu.add(new VariableBinding(new OID(oid)));
-
- DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- snmp.listen();
- System.out.println("-------> 发送PDU <-------");
- pdu.setType(PDU.GET);
- ResponseEvent respEvent = snmp.send(pdu, target);
- System.out.println("PeerAddress:" + respEvent.getPeerAddress());
- PDU response = respEvent.getResponse();
-
- if (response == null) {
- System.out.println("response is null, request time out");
- } else {
-
- // Vector<VariableBinding> vbVect =
- // response.getVariableBindings();
- // System.out.println("vb size:" + vbVect.size());
- // if (vbVect.size() == 0) {
- // System.out.println("response vb size is 0 ");
- // } else {
- // VariableBinding vb = vbVect.firstElement();
- // System.out.println(vb.getOid() + " = " + vb.getVariable());
- // }
-
- System.out.println("response pdu size is " + response.size());
- for (int i = 0; i < response.size(); i++) {
- VariableBinding vb = response.get(i);
- System.out.println(vb.getOid() + " = " + vb.getVariable());
- }
-
- }
- System.out.println("SNMP GET one OID value finished !");
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("SNMP Get Exception:" + e);
- } finally {
- if (snmp != null) {
- try {
- snmp.close();
- } catch (IOException ex1) {
- snmp = null;
- }
- }
-
- }
- }
- /*根据OID列表,一次获取多条OID数据,并且以List形式返回*/
- public static void snmpGetList(String ip, String community, List<String> oidList)
- {
- CommunityTarget target = createDefault(ip, community);
- Snmp snmp = null;
- try {
- PDU pdu = new PDU();
-
- for(String oid:oidList)
- {
- pdu.add(new VariableBinding(new OID(oid)));
- }
-
- DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- snmp.listen();
- System.out.println("-------> 发送PDU <-------");
- pdu.setType(PDU.GET);
- ResponseEvent respEvent = snmp.send(pdu, target);
- System.out.println("PeerAddress:" + respEvent.getPeerAddress());
- PDU response = respEvent.getResponse();
-
- if (response == null) {
- System.out.println("response is null, request time out");
- } else {
-
- System.out.println("response pdu size is " + response.size());
- for (int i = 0; i < response.size(); i++) {
- VariableBinding vb = response.get(i);
- System.out.println(vb.getOid() + " = " + vb.getVariable());
- }
-
- }
- System.out.println("SNMP GET one OID value finished !");
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("SNMP Get Exception:" + e);
- } finally {
- if (snmp != null) {
- try {
- snmp.close();
- } catch (IOException ex1) {
- snmp = null;
- }
- }
-
- }
- }
- /*根据OID列表,采用异步方式一次获取多条OID数据,并且以List形式返回*/
- public static void snmpAsynGetList(String ip, String community,List<String> oidList)
- {
- CommunityTarget target = createDefault(ip, community);
- Snmp snmp = null;
- try {
- PDU pdu = new PDU();
-
- for(String oid:oidList)
- {
- pdu.add(new VariableBinding(new OID(oid)));
- }
-
- DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- snmp.listen();
- System.out.println("-------> 发送PDU <-------");
- pdu.setType(PDU.GET);
- ResponseEvent respEvent = snmp.send(pdu, target);
- System.out.println("PeerAddress:" + respEvent.getPeerAddress());
- PDU response = respEvent.getResponse();
-
- /*异步获取*/
- final CountDownLatch latch = new CountDownLatch(1);
- ResponseListener listener = new ResponseListener() {
- public void onResponse(ResponseEvent event) {
- ((Snmp) event.getSource()).cancel(event.getRequest(), this);
- PDU response = event.getResponse();
- PDU request = event.getRequest();
- System.out.println("[request]:" + request);
- if (response == null) {
- System.out.println("[ERROR]: response is null");
- } else if (response.getErrorStatus() != 0) {
- System.out.println("[ERROR]: response status"
- + response.getErrorStatus() + " Text:"
- + response.getErrorStatusText());
- } else {
- System.out.println("Received response Success!");
- for (int i = 0; i < response.size(); i++) {
- VariableBinding vb = response.get(i);
- System.out.println(vb.getOid() + " = "
- + vb.getVariable());
- }
- System.out.println("SNMP Asyn GetList OID finished. ");
- latch.countDown();
- }
- }
- };
-
- pdu.setType(PDU.GET);
- snmp.send(pdu, target, null, listener);
- System.out.println("asyn send pdu wait for response...");
-
- boolean wait = latch.await(30, TimeUnit.SECONDS);
- System.out.println("latch.await =:" + wait);
-
- snmp.close();
-
- System.out.println("SNMP GET one OID value finished !");
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("SNMP Get Exception:" + e);
- } finally {
- if (snmp != null) {
- try {
- snmp.close();
- } catch (IOException ex1) {
- snmp = null;
- }
- }
-
- }
- }
- /*根据targetOID,获取树形数据*/
- public static void snmpWalk(String ip, String community, String targetOid)
- {
- CommunityTarget target = createDefault(ip, community);
- TransportMapping transport = null;
- Snmp snmp = null;
- try {
- transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- transport.listen();
-
- PDU pdu = new PDU();
- OID targetOID = new OID(targetOid);
- pdu.add(new VariableBinding(targetOID));
-
- boolean finished = false;
- System.out.println("----> demo start <----");
- while (!finished) {
- VariableBinding vb = null;
- ResponseEvent respEvent = snmp.getNext(pdu, target);
-
- PDU response = respEvent.getResponse();
-
- if (null == response) {
- System.out.println("responsePDU == null");
- finished = true;
- break;
- } else {
- vb = response.get(0);
- }
- // check finish
- finished = checkWalkFinished(targetOID, pdu, vb);
- if (!finished) {
- System.out.println("==== walk each vlaue :");
- System.out.println(vb.getOid() + " = " + vb.getVariable());
-
- // Set up the variable binding for the next entry.
- pdu.setRequestID(new Integer32(0));
- pdu.set(0, vb);
- } else {
- System.out.println("SNMP walk OID has finished.");
- snmp.close();
- }
- }
- System.out.println("----> demo end <----");
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("SNMP walk Exception: " + e);
- } finally {
- if (snmp != null) {
- try {
- snmp.close();
- } catch (IOException ex1) {
- snmp = null;
- }
- }
- }
- }
-
- private static boolean checkWalkFinished(OID targetOID, PDU pdu,
- VariableBinding vb) {
- boolean finished = false;
- if (pdu.getErrorStatus() != 0) {
- System.out.println("[true] responsePDU.getErrorStatus() != 0 ");
- System.out.println(pdu.getErrorStatusText());
- finished = true;
- } else if (vb.getOid() == null) {
- System.out.println("[true] vb.getOid() == null");
- finished = true;
- } else if (vb.getOid().size() < targetOID.size()) {
- System.out.println("[true] vb.getOid().size() < targetOID.size()");
- finished = true;
- } else if (targetOID.leftMostCompare(targetOID.size(), vb.getOid()) != 0) {
- System.out.println("[true] targetOID.leftMostCompare() != 0");
- finished = true;
- } else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
- System.out
- .println("[true] Null.isExceptionSyntax(vb.getVariable().getSyntax())");
- finished = true;
- } else if (vb.getOid().compareTo(targetOID) <= 0) {
- System.out.println("[true] Variable received is not "
- + "lexicographic successor of requested " + "one:");
- System.out.println(vb.toString() + " <= " + targetOID);
- finished = true;
- }
- return finished;
-
- }
- /*根据targetOID,异步获取树形数据*/
- public static void snmpAsynWalk(String ip, String community, String oid)
- {
- final CommunityTarget target = createDefault(ip, community);
- Snmp snmp = null;
- try {
- System.out.println("----> demo start <----");
-
- DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- snmp.listen();
-
- final PDU pdu = new PDU();
- final OID targetOID = new OID(oid);
- final CountDownLatch latch = new CountDownLatch(1);
- pdu.add(new VariableBinding(targetOID));
-
- ResponseListener listener = new ResponseListener() {
- public void onResponse(ResponseEvent event) {
- ((Snmp) event.getSource()).cancel(event.getRequest(), this);
-
- try {
- PDU response = event.getResponse();
- // PDU request = event.getRequest();
- // System.out.println("[request]:" + request);
- if (response == null) {
- System.out.println("[ERROR]: response is null");
- } else if (response.getErrorStatus() != 0) {
- System.out.println("[ERROR]: response status"
- + response.getErrorStatus() + " Text:"
- + response.getErrorStatusText());
- } else {
- System.out
- .println("Received Walk response value :");
- VariableBinding vb = response.get(0);
-
- boolean finished = checkWalkFinished(targetOID,
- pdu, vb);
- if (!finished) {
- System.out.println(vb.getOid() + " = "
- + vb.getVariable());
- pdu.setRequestID(new Integer32(0));
- pdu.set(0, vb);
- ((Snmp) event.getSource()).getNext(pdu, target,
- null, this);
- } else {
- System.out
- .println("SNMP Asyn walk OID value success !");
- latch.countDown();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- latch.countDown();
- }
-
- }
- };
-
- snmp.getNext(pdu, target, null, listener);
- System.out.println("pdu 已发送,等到异步处理结果...");
-
- boolean wait = latch.await(30, TimeUnit.SECONDS);
- System.out.println("latch.await =:" + wait);
- snmp.close();
-
- System.out.println("----> demo end <----");
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("SNMP Asyn Walk Exception:" + e);
- }
- }
- /*根据OID和指定string来设置设备的数据*/
- public static void setPDU(String ip,String community,String oid,String val) throws IOException
- {
- CommunityTarget target = createDefault(ip, community);
- Snmp snmp = null;
- PDU pdu = new PDU();
- pdu.add(new VariableBinding(new OID(oid),new OctetString(val)));
- pdu.setType(PDU.SET);
-
- DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- snmp.listen();
- System.out.println("-------> 发送PDU <-------");
- snmp.send(pdu, target);
- snmp.close();
- }
- }
SnmpTest:
- package com.test.snmp;
-
- import java.util.ArrayList;
- import java.util.List;
- import org.snmp4j.log.ConsoleLogFactory;
- import org.snmp4j.log.LogAdapter;
- import org.snmp4j.log.LogFactory;
- import com.test.snmp.SnmpData;
-
- public class SnmpTest {
-
- /**
- * @param args
- */
- public static void main(String[] args) {
-
- // TODO Auto-generated method stub
- SnmpTest test = new SnmpTest();
-
- test.testGet();
-
- }
-
- public void testGet()
- {
- String ip = "127.0.0.1";
- String community = "public";
- String oidval = "1.3.6.1.2.1.1.6.0";
- SnmpData.snmpGet(ip, community, oidval);
- }
-
-
- public void testGetList(){
- String ip = "127.0.0.1";
- String community = "public";
- List<String> oidList=new ArrayList<String>();
- oidList.add("1.3.6.1.2.1.1.5.0");
- oidList.add("1.3.6.1.2.1.1.7.0");
- SnmpData.snmpGetList(ip, community, oidList);
- }
-
-
- public void testGetAsyList()
- {
- String ip = "127.0.0.1";
- String community = "public";
- List<String> oidList=new ArrayList<String>();
- oidList.add("1.3.6.1.2.1");
- oidList.add("1.3.6.1.2.12");
- SnmpData.snmpAsynGetList(ip, community, oidList);
- System.out.println("i am first!");
- }
-
-
- public void testWalk()
- {
- String ip = "127.0.0.1";
- String community = "public";
- String targetOid = "1.3.6.1.2.1.1.5.0";
- SnmpData.snmpWalk(ip, community, targetOid);
- }
-
-
- public void testAsyWalk()
- {
- String ip = "127.0.0.1";
- String community = "public";
- // 异步采集数据
- SnmpData.snmpAsynWalk(ip, community, "1.3.6.1.2.1.25.4.2.1.2");
- }
-
-
- public void testSetPDU() throws Exception
- {
- String ip = "127.0.0.1";
- String community = "public";
- SnmpData.setPDU(ip, community, "1.3.6.1.2.1.1.6.0","jianghuiwen");
- }
-
-
- public void testVersion()
- {
- System.out.println(org.snmp4j.version.VersionInfo.getVersion());
- }
- }
文档和源码csdn下载:http://download.csdn.net/detail/davebobo/9509435
ref: http://www.tuicool.com/articles/FF7fEbi
ref: http://blog.chinaunix.net/uid-21857285-id-3340206.html
-------------------------更新--------------------------------------
Trap功能的实现:
下面是两个用于发送和接收Trap报文信息的类:
接收Trap消息类:
发送Trap消息的类:- import java.io.IOException;
- import java.util.Vector;
-
- 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;
-
- /**
- * 本类用于向管理进程发送Trap信息
- *
- * @author zhanjia
- *
- */
- public class SnmpUtilSendTrap {
-
- private Snmp snmp = null;
-
- private Address targetAddress = null;
-
- public void initComm() throws IOException {
-
- // 设置管理进程的IP和端口
- targetAddress = GenericAddress.parse("udp:192.168.1.23/162");
- TransportMapping transport = new DefaultUdpTransportMapping();
- snmp = new Snmp(transport);
- transport.listen();
-
- }
-
- /**
- * 向管理进程发送Trap报文
- *
- * @throws IOException
- */
- public void sendPDU() throws IOException {
-
- // 设置 target
- CommunityTarget target = new CommunityTarget();
- target.setAddress(targetAddress);
-
- // 通信不成功时的重试次数
- target.setRetries(2);
- // 超时时间
- target.setTimeout(1500);
- // snmp版本
- target.setVersion(SnmpConstants.version2c);
-
- // 创建 PDU
- PDU pdu = new PDU();
- pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.1"),
- new OctetString("SnmpTrap")));
- pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"),
- new OctetString("JavaEE")));
- pdu.setType(PDU.TRAP);
-
- // 向Agent发送PDU,并接收Response
- ResponseEvent respEvnt = snmp.send(pdu, target);
-
- // 解析Response
- if (respEvnt != null && respEvnt.getResponse() != null) {
- Vector<VariableBinding> recVBs = respEvnt.getResponse()
- .getVariableBindings();
- for (int i = 0; i < recVBs.size(); i++) {
- VariableBinding recVB = recVBs.elementAt(i);
- System.out.println(recVB.getOid() + " : " + recVB.getVariable());
- }
- }
- }
-
- public static void main(String[] args) {
- try {
- SnmpUtilSendTrap util = new SnmpUtilSendTrap();
- util.initComm();
- util.sendPDU();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
-
- }
1、运行MultiThreadedTrapReceiver类,提示“开始监听Trap信息!”并处理监听状态
2、运行SnmpUtilSendTrap类,运行完毕后,将会在“开始监听Trap信息!”后面显示:
1.3.6.1.2.3377.10.1.1.1.1 : SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2 : JavaEE
MultiThreadedTrapReceiver输出面板中显示以上两行即表示测试成功!
说明:
本例只在本人电脑上测试过,操作系统为Windows
ref:http://www.iteye.com/topic/308836
-----------------------------------------------------更新20160621-------------------------------------------------接下来问题又来了,我们发的trap消息如果manager掉线我们应该考虑将trap消息保存下来,此时snmp inform就用上场了。详解请看下文:http://blog.csdn.net/davebobo/article/details/51730688
【转载】 java利用snmp4j包来读取snmp协议数据(Manager端)
原文:https://www.cnblogs.com/jing1617/p/8780366.html