1. 程式人生 > >SNMP 使用SNMP4J V2進行TRAP

SNMP 使用SNMP4J V2進行TRAP

SNMP trap(SNMP 陷阱):某種入口,到達該入口會使SNMP被管裝置主動通知SNMP管理器,而不是等待SNMP管理器的再次輪詢!

在網管系統中,被管理裝置中的代理可以在任何時候向網路管理工作站報告錯誤情況,例如預製定閾值越界程度等等。代理並不需要等到管理工作站為獲得這些錯誤情況而輪詢他的時候才會報告。這些錯誤情況就是眾所周知的SNMP自陷(trap)!

網管系統開放監聽埠,始終監聽被管裝置對於該埠的通訊資訊。被管裝置發生故障會主動向該埠傳送故障資訊,網管系統收到訊息進行告警!

首先要模擬工作站對埠進行監聽,請看如下程式:

Java程式碼  收藏程式碼

  1. package t3;  
  2. import java.io.IOException;  
  3. import java.net.UnknownHostException;  
  4. import java.util.Vector;  
  5. import org.snmp4j.CommandResponder;  
  6. import org.snmp4j.CommandResponderEvent;  
  7. import org.snmp4j.MessageDispatcherImpl;  
  8. import org.snmp4j.Snmp;  
  9. import org.snmp4j.TransportMapping;  
  10. import
     org.snmp4j.mp.MPv1;  
  11. import org.snmp4j.mp.MPv2c;  
  12. import org.snmp4j.mp.MPv3;  
  13. import org.snmp4j.security.SecurityModels;  
  14. import org.snmp4j.security.SecurityProtocols;  
  15. import org.snmp4j.security.USM;  
  16. import org.snmp4j.smi.Address;  
  17. import org.snmp4j.smi.GenericAddress;  
  18. import org.snmp4j.smi.OctetString;  
  19. import org.snmp4j.smi.TcpAddress;  
  20. import org.snmp4j.smi.UdpAddress;  
  21. import org.snmp4j.smi.VariableBinding;  
  22. import org.snmp4j.transport.DefaultTcpTransportMapping;  
  23. import org.snmp4j.transport.DefaultUdpTransportMapping;  
  24. import org.snmp4j.util.MultiThreadedMessageDispatcher;  
  25. import org.snmp4j.util.ThreadPool;  
  26. /** 
  27.  * 本類用於監聽代理程序的Trap資訊 
  28.  */  
  29. public class MultiThreadedTrapReceiver implements CommandResponder {  
  30.     public static void main(String[] args) {  
  31.         MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();  
  32.         multithreadedtrapreceiver.run();  
  33.     }  
  34.     private MultiThreadedMessageDispatcher dispatcher;  
  35.     private Snmp snmp = null;  
  36.     private Address listenAddress;  
  37.     private ThreadPool threadPool;  
  38.     public MultiThreadedTrapReceiver() {  
  39.     }  
  40.     public void run() {  
  41.         try {  
  42.             init();  
  43.             snmp.addCommandResponder(this);  
  44.             System.out.println("--------------->開始監聽Trap資訊!<---------------");  
  45.         } catch (Exception ex) {  
  46.             ex.printStackTrace();  
  47.         }  
  48.     }  
  49.     private void init() throws UnknownHostException, IOException {  
  50.         threadPool = ThreadPool.create("Trap"2);  
  51.         dispatcher = new MultiThreadedMessageDispatcher(threadPool,new MessageDispatcherImpl());  
  52.         listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress""udp:127.0.0.1/2008")); // 本地IP與監聽埠  
  53.         TransportMapping transport;  
  54.         // 對TCP與UDP協議進行處理  
  55.         if (listenAddress instanceof UdpAddress) {  
  56.             transport = new DefaultUdpTransportMapping((UdpAddress) listenAddress);  
  57.         } else {  
  58.             transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress);  
  59.         }  
  60.         snmp = new Snmp(dispatcher, transport);  
  61.         snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());  
  62.         snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());  
  63.         snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());  
  64.         USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);  
  65.         SecurityModels.getInstance().addSecurityModel(usm);  
  66.         snmp.listen();  
  67.     }  
  68.     /** 
  69.      * 實現CommandResponder的processPdu方法, 用於處理傳入的請求、PDU等資訊 
  70.      * 當接收到trap時,會自動進入這個方法 
  71.      */  
  72.     @SuppressWarnings("unchecked")  
  73.     public void processPdu(CommandResponderEvent respEvnt) {  
  74.         // 解析Response  
  75.         if (respEvnt != null && respEvnt.getPDU() != null) {  
  76.             Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();  
  77.             for (int i = 0; i < recVBs.size(); i++) {  
  78.                 VariableBinding recVB = recVBs.elementAt(i);  
  79.                 System.out.println(recVB.getOid() + " : " + recVB.getVariable());  
  80.             }  
  81.         }  
  82.     }  
  83. }  

我們採用的是實現 CommandResponder 介面,該介面有一個方法

Java程式碼  收藏程式碼

  1. public void processPdu(CommandResponderEvent respEvnt)   

在該埠接收到資訊時會主動呼叫該方法!

執行Main方法,控制檯提示

Java程式碼  收藏程式碼

  1. -------------->開始監聽Trap資訊!<---------------  

程式對本機埠 2008 開始監聽!

使用命令

Java程式碼  收藏程式碼

  1. >netstate -an  

發現本機UDP埠已經開始監聽!

我們再來實現Agent,被管裝置向網管系統TRAP資訊:

Java程式碼  收藏程式碼

  1. package t3;  
  2. import java.io.IOException;  
  3. import org.snmp4j.CommunityTarget;  
  4. import org.snmp4j.PDU;  
  5. import org.snmp4j.Snmp;  
  6. import org.snmp4j.TransportMapping;  
  7. import org.snmp4j.mp.SnmpConstants;  
  8. import org.snmp4j.smi.Address;  
  9. import org.snmp4j.smi.GenericAddress;  
  10. import org.snmp4j.smi.OID;  
  11. import org.snmp4j.smi.OctetString;  
  12. import org.snmp4j.smi.VariableBinding;  
  13. import org.snmp4j.transport.DefaultUdpTransportMapping;  
  14. /** 
  15.  * 本類用於向管理程序傳送Trap資訊 
  16.  */  
  17. public class SnmpUtilSendTrap {  
  18.     private Snmp snmp = null;  
  19.     private Address targetAddress = null;  
  20.     public static void main(String[] args) {  
  21.         try {  
  22.             SnmpUtilSendTrap util = new SnmpUtilSendTrap();  
  23.             util.initComm();  
  24.             util.sendPDU();  
  25.         } catch (IOException e) {  
  26.             e.printStackTrace();  
  27.         }  
  28.     }  
  29.     public void initComm() throws IOException {  
  30.         // 設定管理程序的IP和埠  
  31.         targetAddress = GenericAddress.parse("udp:127.0.0.1/2008");  
  32.         TransportMapping transport = new DefaultUdpTransportMapping();  
  33.         snmp = new Snmp(transport);  
  34.         transport.listen();  
  35.     }  
  36.     /** 
  37.      * 向管理程序傳送Trap報文 
  38.      *  
  39.      * @throws IOException 
  40.      */  
  41.     @SuppressWarnings("unchecked")  
  42.     public void sendPDU() throws IOException {  
  43.         // 設定 target  
  44.         CommunityTarget target = new CommunityTarget();  
  45.         target.setAddress(targetAddress);  
  46.         // 通訊不成功時的重試次數  
  47.         target.setRetries(2);  
  48.         // 超時時間  
  49.         target.setTimeout(1000 * 5);  
  50.         // snmp版本  
  51.         target.setVersion(SnmpConstants.version2c);  
  52.         // 建立 PDU  
  53.         PDU pdu = new PDU();  
  54.         pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.6.0"),new OctetString("aaaa")));  
  55.         pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.2.0"),new OctetString("bbbb")));  
  56.         pdu.setType(PDU.TRAP);  
  57.         // 向Agent傳送PDU,並接收Response  
  58.         snmp.send(pdu, target);  
  59.         System.out.println("------------> END<--------------");  
  60.     }     
  61. }  

使用的SNMP版本應該是 V2,V1的操作與V2 TRAP不同!

執行後控制檯列印執行結束!

網管系統模擬端列印收到的OID和OID對應的值資訊!

1 

1 

分享到:  

評論

KuhYygy 寫道

請問下樓主,如果trap裡的包含中文的資訊,應該如何解碼,準確來講,應該如何選擇字元編碼?

String s = new String(((OctetString)recVB.getVariable()).getValue(), "UTF-8");

如上,我看有些寫UTF-8,有些寫GBK,請問這個應該怎麼選擇,或者有其它的方法解釋出trap裡的中文?謝謝~


如果是我們倆之間做通訊,咱倆之間肯定知道字串是什麼編碼格式的,為什麼會出現不知道編碼的情況?

6 樓 KuhYygy 2014-06-03  

請問下樓主,如果trap裡的包含中文的資訊,應該如何解碼,準確來講,應該如何選擇字元編碼?

String s = new String(((OctetString)recVB.getVariable()).getValue(), "UTF-8");

如上,我看有些寫UTF-8,有些寫GBK,請問這個應該怎麼選擇,或者有其它的方法解釋出trap裡的中文?謝謝~

5 樓 lanqiu17 2014-02-21  

cuisuqiang 寫道

lanqiu17 寫道

  @SuppressWarnings("unchecked")  
    public void processPdu(CommandResponderEvent respEvnt) {  
        // 解析Response  
        if (respEvnt != null && respEvnt.getPDU() != null) {  
            Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();  
            for (int i = 0; i < recVBs.size(); i++) {  
                VariableBinding recVB = recVBs.elementAt(i);  
                System.out.println(recVB.getOid() + " : " + recVB.getVariable());  
            }  
        }  
    }

樓主,我覺得這裡應該交給執行緒去處理。它佔用的是接收trap執行緒池中的執行緒,會阻塞trap訊息的接收


SNMP4J用的是堵塞執行緒池處理,既然已經有執行緒池處理了,為什麼再做一層執行緒處理?除非是擔心收到的訊息很長時間處理不掉,那增大SNMP執行緒池就可以了

但當管理裝置過多,並且傳送trap訊息頻繁時,增大snmp執行緒池只是將問題延後了

lanqiu17 寫道

  @SuppressWarnings("unchecked")  
    public void processPdu(CommandResponderEvent respEvnt) {  
        // 解析Response  
        if (respEvnt != null && respEvnt.getPDU() != null) {  
            Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();  
            for (int i = 0; i < recVBs.size(); i++) {  
                VariableBinding recVB = recVBs.elementAt(i);  
                System.out.println(recVB.getOid() + " : " + recVB.getVariable());  
            }  
        }  
    }

樓主,我覺得這裡應該交給執行緒去處理。它佔用的是接收trap執行緒池中的執行緒,會阻塞trap訊息的接收


SNMP4J用的是堵塞執行緒池處理,既然已經有執行緒池處理了,為什麼再做一層執行緒處理?除非是擔心收到的訊息很長時間處理不掉,那增大SNMP執行緒池就可以了

3 樓 lanqiu17 2014-02-20  

  @SuppressWarnings("unchecked")  
    public void processPdu(CommandResponderEvent respEvnt) {  
        // 解析Response  
        if (respEvnt != null && respEvnt.getPDU() != null) {  
            Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();  
            for (int i = 0; i < recVBs.size(); i++) {  
                VariableBinding recVB = recVBs.elementAt(i);  
                System.out.println(recVB.getOid() + " : " + recVB.getVariable());  
            }  
        }  
    }

樓主,我覺得這裡應該交給執行緒去處理。它佔用的是接收trap執行緒池中的執行緒,會阻塞trap訊息的接收

2 樓 lanqiu17 2014-02-20  

哥們, 你也是做網管軟體的啊 , 能交流下嗎

如果Trap時需要給客戶端返回一些資訊,可以參考如下程式碼: 

Java程式碼  收藏程式碼

  1. /** 
  2.  * 實現CommandResponder的processPdu方法, 用於處理傳入的請求、PDU等資訊 
  3.  * 當接收到trap時,會自動進入這個方法 
  4.  */  
  5. @SuppressWarnings("unchecked")  
  6. public void processPdu(CommandResponderEvent respEvnt) {  
  7.     List<VariableBinding> list = new ArrayList<VariableBinding>();  
  8.     // 解析Response  
  9.     if (respEvnt != null && respEvnt.getPDU() != null) {  
  10.         Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();  
  11.         for (int i = 0; i < recVBs.size(); i++) {  
  12.             VariableBinding recVB = recVBs.elementAt(i);  
  13.             System.out.println(recVB.getOid() + " : " + recVB.getVariable());  
  14.             Random random = new Random();  
  15.             list.add(new VariableBinding(recVB.getOid(),new Integer32(random.nextInt(1999))));  
  16.         }             
  17.         org.snmp4j.mp.StatusInformation statusInformation = new org.snmp4j.mp.StatusInformation();  
  18.         org.snmp4j.mp.StateReference ref = respEvnt.getStateReference();  
  19.         try {  
  20.             // 建立 PDU  
  21.             PDU vPDU = respEvnt.getPDU();  
  22.             vPDU.setType(PDU.RESPONSE);  
  23.             Random random = new Random();  
  24.             for(int i = 0;i< list.size() ;i++){  
  25.                 VariableBinding vb = list.get(i);  
  26.                 vb.setVariable(new Integer32(random.nextInt(9999)));  
  27.                 vPDU.set(i,vb);  
  28.             }  
  29.             respEvnt.getMessageDispatcher().returnResponsePdu(  
  30.                     respEvnt.getMessageProcessingModel(),  
  31.                     respEvnt.getSecurityModel(),  
  32.                     respEvnt.getSecurityName(),  
  33.                     respEvnt.getSecurityLevel(),   
  34.                     vPDU,  
  35.                     respEvnt.getMaxSizeResponsePDU(),   
  36.                     ref,  
  37.                     statusInformation);  
  38.         } catch (Exception e) {  
  39.             e.printStackTrace();  
  40.         }             
  41.     }  
  42. }  

相關推薦

SNMP 使用SNMP4J V2進行TRAP

SNMP trap(SNMP 陷阱):某種入口,到達該入口會使SNMP被管裝置主動通知SNMP管理器,而不是等待SNMP管理器的再次輪詢! 在網管系統中,被管理裝置中的代理可以在任何時候向網路管理工作站報告錯誤情況,例如預製定閾值越界程度等等。代理並不需要等到管理工作站

使用Java進行SNMP程式設計-SNMP4J-SNMPv1/v2-程式碼例項

使用SNMP4J可以很方便的實現一個SNMP NMS的功能。 對於SNMPv1/SNMPv2,簡單的說,只需要以下幾個步驟 1) 建立Snmp物件snmp 2) 建立CommunityTarget物件target,並指定community, version, addres

SNMP4J實現SNMP TRAP

近期專案和華為的介面有要求用SNMP做實時告警的上送,在網上查找了些資料,整理了下 SNMP分為:SNMP TRAP\SNMP GET\SNMP SET      1.SNMP TRAP簡單說一般就是Manager和agent之間拿來傳輸資料,Manager會一直監聽著代理程序傳送           TR

硬件層監控之Zabbix-snmp-trap企業級實戰

硬件層監控監控對象: 服務器存儲交換機路由器防洪墻 監控數據采集方法: SNMP trap 目前我監控以下的硬件信息:1、cpu處理器狀態2、cpu省電模式狀態(如果開啟了省電模式,在壓力大的時候,會很卡的)3、raid狀態(比如做了哪個raid模式,raid狀態是否正常)4、內存狀態(可以查看當前

SNMP V2簡單設置

don host public connect ont use log app 默認 SNMP V2簡單設置 默認配置 com2sec notConfigUser default publicgroup notConfigGroup v1

使用apksigner對apk進行v2簽名

一個 二次 問題 nbsp ava tput put -o 註意 最近進行三方安全測試,剩最後一個問題: 原因是我用360加固寶之後,又用了360Signer對apk進行二次簽名,而360Signer是用v1方式對apk進行簽名的,所以安全檢測還是不通過。 下面給

SNMP:使用net-snmp捕捉trap

格式 -o pro 分享圖片 分享 命令 win7 gen exe 管理端:172.18.0.135 win7系統 代理端:172.18.0.212 Debian7.2 前提:代理端已配置snmp,可正常實現用SNMP協議實現系統信息監控 1、管理端下載ne

java-snmp4jsnmp

package com.Snmp4jFirstDemo; import org.snmp4j.*;import org.snmp4j.mp.SnmpConstants;import org.snmp4j.smi.GenericAddress;import org.snmp4j.smi.OID;import

【Zabbix-SNMPtrap】列舉一個常見使用Zabbix的SNMP trap監控裝置的例子

本文以監控綠盟裝置為例。1.登入被監控的裝置的管理系統,配置snmptrap地址指向zabbix伺服器或代理伺服器。snmptrap地址也叫陷阱。2.配置或關閉防火牆,並驗證是否能在zabbix伺服器或代理伺服器上收到裝置的trap資訊。2.1 舊版防火牆開放UDP的162埠的命令如下: vi

如何給SNMP Trap通道加上同步機制

SNMP協議是在伺服器以及硬體管理中通常都會用到的管理協議,其好處在於使用起來簡單,然後又是標準化的,幾乎所有的硬體裝置都支援此協議。不過近期網路安全問題大家都比較關注,SNMP也飽受爭議。 今天我們要討論是是如何使用SNMP Trap傳送同步訊息。 SNMP TRAP是SNMP協議裡面通常使用的通

net-snmp擴充套件trap型別的私有mib

注:本文介紹的是靜態編譯的方法擴充套件的私有mib,別的方法請看本人整理的《net-snmp agent開發(用net-snmp擴充套件MIB庫)》 1. 首先建立一個簡單的含有table變數的mib檔案取名test-trap.mib,字尾名也可以是.txt 實際操作

SNMP trap訊息為何不能正確發往指定埠162.

最近做網路攝像機,有局點要求需要按SNMP協議上報訊息,於是從網站http://www.net-snmp.org/下載了一個snmp原始碼包5.2.6,tar解壓,交叉編譯: ./configure --build=i686-linux --host=arm-merlin-l

snmp4j程式設計之三 trap監聽

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

【NetSNMP##】 C語言傳送SNMP Trap訊息

專案需求系統利用SNMP Trap訊息上報狀態給NMS,考慮使用net-snmp提供的SNMP庫函式實現該功能,且需要根據不同埠使用不同的session。 1)標頭檔案 為了使用 netsnmp 的 API,必須 include 以下這些標頭檔案: #include &

linux下snmp4j獲取net-snmp的基本資訊

linux下,net-snmp已經提供了完整的snmp服務和框架,尤其是基本的snmp資訊,如sysObjectId、CPU、記憶體等。通過標準的snmp的oid,可以很容易的從net-snmp所提供的服務中獲取這些資訊。但net-snmp的trap功能需要通過指令碼來配置

SNMP Trap的功能介紹

前面我們已經對SNMP協議有所瞭解了,隨著對這個協議的瞭解,我們也發現,它的更能更為強大。其中包括了多種協議的支援。那麼今天我們就來詳細介紹一下SNMP Trap的具體內容。那麼什麼是SNMP Trap呢? 自1998以來,SNMP已經被廣泛被接受和支援。SNMP依賴

java利用snmp4j包來讀取snmp協議資料(Manager端)

1 snmp簡單介紹 java利用snmp4j包來讀取snmp協議資料,很簡單的一個流程,就是利用java來讀取執行snmp協議的資料,例如伺服器、PC機或者路由器等運行了snmp協議的裝置。 snmp協議是什麼呢? 簡單網路管理協議(SNMP),由一組網路管理的標準組成,

Snmp學習總結(二)——SNMP4J介紹

一、SNMP4J介紹     SNMP4J是一個用Java來實現SNMP(簡單網路管理協議)協議的開源專案.它支援以命令列的形式進行管理與響應。SNMP4J是純面向物件設計與SNMP++(用C++實現SNMPv1/v2c/v3)相類似。   SNMP4J API 提供

snmp trap入門

更多資訊在http://www.ibm.com/developerworks/cn/linux/l-cn-snmp/ SNMP(Simple Network Management Protocol) trap是一種很有用,但是也容易讓人難以理解的協議。雖然名字叫做簡單網路管

使用snmp4j實現Snmp功能(一)

插播一段宣告:樓主我其實就用了小半年的Snmp而已,就把學習心得發了出來,目的就是能夠引導大家入門,但是更深入的知識我就不知道啦。請大家不要再問我問題了,我知道的都已經寫出來啦,謝謝! 上一篇有關Snmp的文章已經是一年前寫的了,因為工作等各種原因,一直沒有繼續下去。但