SNMPトラップ受信を実践に向けて(2)

いよいよ org.snmp4j.CommandResponder を使ってトラップ受信を書く。
先日のつづきである。

import java.util.Iterator;
import java.util.Vector;
import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.PDUv1;
import org.snmp4j.smi.VariableBinding;
/**
 * トラップ受信 CommandResponder
 */

public class TrapResponder implements CommandResponder{
   private TrapRecvMap traprecvmap;
   public TrapResponder(){
      this.traprecvmap = TrapRecvMap.bind();
   }
   /*
    * @see org.snmp4j.CommandResponder#processPdu(org.snmp4j.CommandResponderEvent)
    */

   @Override
   public void processPdu(CommandResponderEvent event){
      long recvTime = System.currentTimeMillis();
      PDUv1 pduv1 = (PDUv1)event.getPDU();
      String key = pduv1.getAgentAddress()+"_"+pduv1.getGenericTrap()+"_";
      Integer trapno = null;
      Vector vars = event.getPDU().getVariableBindings();
      for(Iterator<?> it=vars.iterator();it.hasNext();){
         VariableBinding v = (VariableBinding)it.next();
         String oidstr = v.getOid().toString();
         if (oidstr.equals("1.3.6.1.2.1.2.2.1.1")){
            try{
            trapno = v.getVariable().toInt();
            break;
            }catch(Exception e){
               trapno = null;
            }
         }
      }
      if (trapno != null){
         key += trapno.toString();
         this.traprecvmap.put(key,new TrapInfo(
            recvTime,pduv1.getAgentAddress().toString()
           ,pduv1.getGenericTrap(),trapno.intValue())
);

      }
   }
}
------------------------------------------------------------
受信実行のサンプル
import java.io.IOException;
import jp.jsuite.snmp.SnmpTrapReceiveModule;
import jp.jsuite.snmp.SnmpTrapReceiver;
import test.recv4.TrapResponder;
import com.google.inject.Guice;
import com.google.inject.Injector;
// サンプル
public class RecvMain{
   public static void main(String[] args){
      // 受信Map 初期生成
      TrapRecvMap traprecvmap = TrapRecvMap.bind();

      // SNMP 受信
      Injector injector = Guice.createInjector(
          new SnmpTrapReceiveModule("111.11.11.111",2,TrapResponder.class));
      SnmpTrapReceiver snmpTrapReceiver = injector.getInstance(SnmpTrapReceiver.class);

      try{
      // 受信開始
      snmpTrapReceiver.start();

      // SLEEP
      try{Thread.sleep(60L * 9000L);}catch(InterruptedException e){}

      // 受信終了
      snmpTrapReceiver.end();

      }catch(IOException e1){
         e1.printStackTrace();
      }finally{
         traprecvmap.close();
      }

   }
}