1. 程式人生 > >snmp4j程式設計之三 trap監聽

snmp4j程式設計之三 trap監聽

接收Trap報文資訊的類::

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Vector;

import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;

/**
 * 本類用於監聽代理程序的Trap資訊
 * 
 * @author zhanjia
 *
 */
public class MultiThreadedTrapReceiver implements CommandResponder {

	private MultiThreadedMessageDispatcher dispatcher;
	private Snmp snmp = null;
	private Address listenAddress;
	private ThreadPool threadPool;

	public MultiThreadedTrapReceiver() {
		// BasicConfigurator.configure();
	}

	private void init() throws UnknownHostException, IOException {
		threadPool = ThreadPool.create("Trap", 2);
		dispatcher = new MultiThreadedMessageDispatcher(threadPool,
				new MessageDispatcherImpl());
		listenAddress = GenericAddress.parse(System.getProperty(
				"snmp4j.listenAddress", "udp:192.168.1.23/162")); // 本地IP與監聽埠
		TransportMapping transport;
		// 對TCP與UDP協議進行處理
		if (listenAddress instanceof UdpAddress) {
			transport = new DefaultUdpTransportMapping(
					(UdpAddress) listenAddress);
		} else {
			transport = new DefaultTcpTransportMapping(
					(TcpAddress) listenAddress);
		}
		snmp = new Snmp(dispatcher, transport);
		snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
		snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
		snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
		USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3
				.createLocalEngineID()), 0);
		SecurityModels.getInstance().addSecurityModel(usm);
		snmp.listen();
	}

	
	public void run() {
		try {
			init();
			snmp.addCommandResponder(this);
			System.out.println("開始監聽Trap資訊!");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * 實現CommandResponder的processPdu方法, 用於處理傳入的請求、PDU等資訊
	 * 當接收到trap時,會自動進入這個方法
	 * 
	 * @param respEvnt
	 */
	public void processPdu(CommandResponderEvent respEvnt) {
		// 解析Response
               if (respEvnt != null && respEvnt.getPDU() != null) {
        	   Vector<VariableBinding> recVBs = (Vector<VariableBinding>)respEvnt.getPDU().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) {
		MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();
		multithreadedtrapreceiver.run();
	}

}

傳送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 = (Vector<VariableBinding>) 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


相關推薦

snmp4j程式設計 trap

接收Trap報文資訊的類:: import java.io.IOException; import java.net.UnknownHostException; import java.util.Vector; import org.snmp4j.CommandRes

ios開發--鍵盤的

efault key nil self. transform blog mar form owa 監聽鍵盤的彈出,讓整個頁面向上移動,比較簡單,僅做記錄使用: 代碼如下: // 監聽鍵盤 [[NSNotificationCenter defaultCenter]

圖形用戶界面添加,實例化

IT main round ID end AD generated 圖片 ima package 圖形用戶界面1;import java.awt.*;//import java.awt.event.ActionEvent;//import java.awt.event.Wi

HTML編程滾輪滑動效果的實現

false eve function dom 滾輪 event als 瀏覽器 html 在前端頁面制作過程中,我們經常會發現有時候某些動作需要滾動滑輪來實現,那麽對於初學者來說可能不明白是如何實現的,對於這個問題,下面就來跟大家分析一下,如何用滾輪滑動監聽效果的實現。 源

Vue數據存在的問題

methods const name val 深度 cli and 不可 相同 Vue之數據監聽 當數據監聽的是列表時,數據發生改變,不會被監聽到。 // 用$set修改數組中的數組能夠被監聽 // app.$set(this.hobby,

Preference 事件總結

Preference 三種監聽事件總結 今天使用到,突然有點模糊了,總結記錄下方便回顧。 對比 區別 聯絡 執行順序 onPreferenceClick

android_事件de用法

layout: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm

Python黑客程式設計3網路資料和過濾

Python黑客程式設計3網路資料監聽和過濾 課程的實驗環境如下: •作業系統:kali Linux 2.0 •程式設計工具:Wing IDE •Python版本:2.7.9 •涉及到的主要python模組:pypcap,dpkt,scapy,scapy-http 涉及到的幾個python網路抓包和

Fragment詳解六——如何fragment中的回退事件與怎樣儲存fragment狀態

前言:計劃總是趕不上變化,無論結局怎樣,只要一直跟隨自己的內心,不放棄,總有一天,你會成為那個人,加油。相關文章:經過前幾篇,大家應該對Fragment認識的已經足夠多了,有關Fragment的基礎知識在前幾篇基本就講完了,這篇給大家講兩個可能會用到的知識點。這兩點理解起來可

android TextWatcher的

以前用過android.text.TextWatcher來監聽文字發生變化,但沒有仔細去想它,今天興致來了就發個瘋來玩玩吧! 有點擔心自己理解錯,所以還是先把英文API解釋給大家看看 1、什麼情況下使用了? When an object of a type is attac

java&android執行緒池-Executor框架ThreadPoolExcutor&ScheduledThreadPoolExecutor淺析(多執行緒程式設計

java多執行緒-概念&建立啟動&中斷&守護執行緒&優先順序&執行緒狀態(多執行緒程式設計之一)java多執行緒同步以及執行緒間通訊詳解&消費者生產者模式&死鎖&Thread.join()(多執行緒程式設計之二)

Java併發程式設計:執行緒掛起、恢復與終止的正確方法

出處:http://blog.csdn.NET/ns_code/article/details/17095733 掛起和恢復執行緒 Thread 的API中包含兩個被淘汰的方法,它們用於臨時掛起和重啟某個執行緒,這些方法已經被淘汰,因為它們是不安全的,不穩定的。如果

Preference 事件說明

Android preference onPreferenceClick/onPreferenceChange/onPreferenceTreeClick 分析 3者的區別 使用方式不同 onPreferenceClick 與onPreference

JavaGUI鍵盤事件KeyListener

例項:監聽鍵盤的上下左右鍵 /** * KeyListener:鍵盤監聽事件 * @author Administrator */ public class KeyListenerDemo

iOS開發音樂播放----耳機拔插

新增監聽事件: [AVAudioSession sharedInstance]; [[NSNotificationCenter defaultCenter] addObserver:s

cocos creator事件:、發射、派送

事件監聽 事件處理是在節點(cc.Node)中完成的。 對於元件,可以通過訪問節點this.node來註冊和監聽事件。 監聽事件可以通過this.node.on()方法和this.node.once()方法來註冊。 node.on(type, callback,

Android常用返回按鍵

在安卓開發中,我們經常要對按鍵進行監聽,今天跟大家分享一下最常用的按下返回退出功能的實現. 如果沒有對返回鍵設定監聽,通常按下一次返回鍵就會退出程式或退出某個介面,這樣是很不人性化的,我們可以有兩種處理方式: 按下返回鍵時彈出一個對話方塊(AlertDia

Qt鍵盤事件-實時響應大小寫Capslock按鍵

目錄 一、開篇 二、效果展示 三、實現思路 1、重寫QLlinEdit 2、全域性應用程式事件 3、windows鉤子 四、相關文章

跟我一起學.NetCore配置變更

**前言** 通常程式中配置少不了,配置的修改也避免不了,配置的熱更新為此給應用程式帶來很大的便捷,不用重啟,提高使用者體驗;但往往有時候需要對修改進行審計,也就是需要記錄,有時候也會針對配置修改的時候觸發相關操作,比如說發郵件通知,或是其他業務操作等,遇到這種情況,配置變更監聽的用處就體現出來了,接下來就

安卓專案實戰Glide 3高手養成():Glide的回撥與

前言 通過前面兩篇的講解,我們對於Glide的一些使用都有了基本瞭解,知道了使用Glide載入圖片只需要一行程式碼即可: Glide.with(this).load(url).into(imageView); 而在這一行程式碼的背後,Glide幫我們執行了成千上萬行的邏輯。