使用snmp4j实现Snmp功能(二)

相关链接:
Snmp学习笔记
使用snmp4j实现Snmp功能(一)
使用snmp4j实现Snmp功能(二)
使用snmp4j实现Snmp功能(三)

前一篇文章讲了如何用snmp4j实现set和get的功能,今天讲如何接收trap。

snmp4j提供了一个抽象类CommandResponder类用于接收trap,这个类里面有一个必须实现的方法processPdu(),当接收到trap,会自动进入这个方法,因此我们可以将对trap的处理写在这里。

下面修改上篇文章例子中的initComm()方法:

 private TransportMapping transport = null;

       public void initComm() throws IOException {

              // 设置Agent方的IP和端口

              targetAddress = GenericAddress.parse("udp:192.168.1.1/161");

              // 设置接收trap的IP和端口

              transport = new DefaultUdpTransportMapping(new UdpAddress(

                            "192.168.1.2/162"));

              snmp = new Snmp(transport);

              CommandResponder trapRec = new CommandResponder() {

                     public synchronized void processPdu(CommandResponderEvent e) {

                            // 接收trap

                            PDU command = e.getPDU();

                            if (command != null) {

                                   System.out.println(command.toString());

                            }

                     }

              };

              snmp.addCommandResponder(trapRec);

              transport.listen();

       }

其中targetAddress指Agent端也就是trap发送,transport指trap接收方,这里就是本机,假设IP是192.168.1.2,但注意不能写成127.0.0.1。

因为我们无法得知trap什么时候会发送,所以需要有一个线程等待trap的到来,在这个例子中我们使用wait()来等待trap的到来,具体应用中就要根据实际情况来做了。

public synchronized void listen() {

              System.out.println("Waiting for traps..");

              try {

                     this.wait();//Wait for traps to come in

              } catch (InterruptedException ex) {

                     System.out.println("Interrupted while waiting for traps: " + ex);

                     System.exit(-1);

              }

       }

       public static void main(String[] args) {

              try {

                     SnmpUtil util = new SnmpUtil();

                     util.initComm();

                     util.listen();

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

将上面的代码添加到原来的例子中,就可以接收trap了。

但是还有一个问题,如何让192.168.1.1发送trap呢?这个也可以使用snmp4j来做。其实发送trap和发送set、get PDU是类似的,同样是发送PDU,只不过类型不一样。我们把前面的例子复制到192.168.1.1,在里面添加一段代码:

  public void setTrap() throws IOException {

        // 构造Trap 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.setType(PDU.TRAP);

        sendPDU(pdu);

        System.out.println("Trap sent successfully.");

    }

这里PDU的OID和Value可以自己构造,无需使用特定的值。

然后修改地址
targetAddress = GenericAddress.parse("udp:192.168.1.2/162");
transport = new DefaultUdpTransportMapping(new UdpAddress("192.168.1.1/161"));

另外需要修改target的version,即改为target.setVersion(SnmpConstants.version2c)为什么要这样改我也没搞清楚,总之verion1收不到。

接下来修改main()函数,调用setTrap()。

然后回到本机运行刚才的例子,当控制台显示“Waiting for traps..”时,运行Agent端的例子。此时如果192.168.1.2打出我们刚刚设置的PDU的信息,就说明Trap的收发成功了。

时间: 2024-10-02 03:50:42

使用snmp4j实现Snmp功能(二)的相关文章

使用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(使用snmp4j实现Snmp功能(一))以及发送.接收Trap(使用snmp4j实现Snmp功能(二)) 功能. 在我们前面的实现中,如果访问MIB库中不存在的OID,Get方式的话,我们会得到一个Null值,而Set方式时Agent端会把我们发过去的 PDU原封不动的返回回来.当然多数情况下这不是我们

词频统计-功能二

一.完成一个小程序 今天的任务是处理一本英文小说.我处理的英文小说是<war and peace> 本想着用多线程来解决的,发现看书还不是太懂,并不能真正动手编程. 我在编程的过程中主要遇到了以下两个问题: 1.在对整个英文小说进行单词总数统计遇见困难. 2.字符串数组的空字符串处理问题.因为我开始用空格来代替标点等不是英文单词来进行对单词分割,其中用到了正则表达式,后来统计对单词出现频数时,发现空格竟然排第一名,有4万多空格. 最终我的处理方式是使用List泛型集合的ForEach方法循环获

MVC应用程序请求密码的功能(二)

在完成<MVC应用程序请求密码的功能(一)>http://www.cnblogs.com/insus/p/3471534.html之后,如果你照着做,所有请求只会列在MailingList表中,并没发送出去. Insus.NET现在就继续下去,让这个功能能尽量完美下去. 在上一篇中,有一个存储过程: 在这个存储过程#38与#39行代码,是一个超链接,它是真正存在MVC的应用程序中.也就是说,给会员发送邮件时,就是把这个链接的视图发送至会员的邮箱中.因此,我们得创建这个视图. 创建这个视图,得先

Django之url上的include,URL命名和反向解析,命名空间 以及图书管理系统删除功能二合一方法

include其他的URLconfs #At any point, your urlpatterns can "include" other URLconf modules. This #essentially "roots" a set of URLs below other ones. #For example, here's an excerpt of the URLconf for the Django website itself. #It include

c#自己实现线程池功能(二)

介绍 在上一篇c#自己实现线程池功能(一)中,我们基本实现了一个可以运行的程序,而不能真正的称作线程池.由于是上篇中的代码有个致命的bug那就是没有任务是并不是等待,而是疯狂的进行while循环,并试图lock任务链表,这样带来的问题的就是性能相当低下,程序反映速度很慢(当加入一个新任务后,要过很久这个job才开始运行)造成的原因就是刚才所说的. 为了解决这个问题我们就需要使用某种方法使得程序能够让进程同步. 方法一 使用信号量 我们为了减少对task任务的加锁操作,只有当task不为空时才进行

webpack4+node合并资源请求, 实现combo功能(二十三)

本文学习使用nodejs实现css或js资源文件的合并请求功能,我们都知道在一个复杂的项目当中,可能会使用到很多第三方插件,虽然目前使用vue开发系统或者h5页面,vue组件够用,但是有的项目中会使用到类似于echarts这样的插件,或者第三方其他的插件,比如ztree.js这样的,那如果我们把所有js都打包到一个js文件当中,那么该js可能会变得非常大,或者我们可能会把他们单独打包一个个js文件去,然后在页面中分别一个个使用script标签去引入他们,但是这样会导致页面多个js请求.因此就想使

odoo导入功能二开

原来有的导入功能相信很多小伙伴对其功能不是很满意,不过没关系,我们可以二开啊,把它的功能改造成你想要的样子,接下来让我们看看怎么办吧 例如我想把员工导入功能中添加上用户同步注册功能 首先,我要找到原模块中导入时调用的模型--importUser.py文件 找到这个文件之后打开 HtkjtImport 类,该类继承import基础模块 class HtkjtImport(models.TransientModel): _inherit = "base_import.import" 在该类

dedecms5.7文章实现阅读全文功能二次开发

阅读全文功能其实在很多的流行站点都有的,比如网易,新浪等,随着文章内容的增加,当一个页面有多个分页的时候,就会显示出这个“在本页阅读全文”的链接,点击这个链接之后,出现的,将是这篇文章以没有分页出现的型式.,那么在dedecms5.7如何在文章内容页添加阅读全文功能呢?如图所示: 这个阅读全文有什么用呢?说白了,也就是提高用户体验.下面让我们看看,怎么简单现实这个功能. 修改文件:include/arc.archives.class.php 注意:做任何修改前都要备份好原文件. 第一步:打开in