SMTP

자바를 이용한 SNMP 데이터 가져오기 - 2 -

bang2001 2013. 7. 25. 17:42

OpenNMS를 이용한 SNMP GET 구현

API의 명칭을 OpenNMS라고 하였지만 사실은 OpenNMS는 하나의 NMS 프로그램이다. 여기서 사용하는 것은 OpenNMS를 구현할 때 사용한 SNMP API 부분만을 이용하는 것이다. SNMP API는 joeSNMP라는 이름으로 제공되고 있다. 

http://www.opennms.org/files/releases/joeSNMP 에서 다운받을 수 있다.
전체 패키지는 org.opennms.protocols로 구성되어 있으며 org.opennms.test에는 SNMP walk나 trap을 테스트해 볼 수 있는 테스트용 응용 프로그램이 있다. OpenNMS의 SNMP API를 이용하여 데이터를 받는 순서는 <그림 1>과 같다.

 


<그림 1> SNMP API를 이용해 데이터를 받는 순서




SNMP 에이전트와 통신을 담당하는 클래스는 SnmpSession이며, 에이전트로부터 받은 메시지는 SnmpSession에 의해서 SnmpHandler로 전하게 된다. SnmpHandler는 단순한 인터페이스이므로 이것을 구현하여 SnmpSession에 등록해야 한다. SnmpSession을 생성할 때는 SNMP 커뮤니티 스트링 정보와 SNMP 에이전트의 IP 주소와 같은 정보를 입력해 줘야 한다.

// SnmpSession 생성자
SnmpSession (InetAddress peer)
SnmpSession (SnmpPeer peer) 
SnmpSession (InetAddress peer, SnmpParameters params)

SnmpSession 생성자에서 peer라는 이름은 SNMP 에이전트를 가리키며 접속에 필요한 정보들은 SnmpParameters 클래스에서 담당하게 된다.

// SnmpParameters 생성자
SnmpParameters ()
SnmpParameters (int version)
SnmpParameters (Strig readCommunity)
SnmpParameters (String readCommunity, String writeCommunity)

SnmpParameters 클래스에는 SnmpSession에서 SNMP 에이전트와의 통신에 사용할 SNMP 버전 정보, 읽기 커뮤니티 스트링, 쓰기 커뮤니티 스트링에 대한 정보를 담당하게 된다. SnmpSession 클래스의 인스턴스는 다음의 코드로 생성할 수 있다.

SnmpParameters params = new SnmpParameters ("public");
SnmpSession session = new SnmpSession (InetAddress.getByName ("localhost"), params)

그러나 인스턴스인 session은 아직 사용할 준비가 끝난 것은 아니다. SNMP 메시지를 보내기 위해서는 session에 SnmpHandler를 구현한 클래스의 인스턴스를 DefaultHandler로 등록해야 한다. 그렇지 않은 경우 SnmpSession 클래스의 정의에 따라 SnmpHandlerNotDefinedException을 발생하게 된다. SnmpHandler는 인터페이스로 다음과 같이 3개의 메쏘드를 정의하고 있다.

snmpInternalError (SnmpSession session, int err, SnmpSyntax pdu)
snmpReceivedPdu (SnmpSession session, int command, SnmpPduPacket pdu)
snmpTimeoutError (SnmpSession session, SnmpSyntax pdu)

각 메쏘드에서 인자로 받고 있는 session은 메시지를 전송하기 위해 사용했던 SnmpSession을 가리키고 있으며, InternalError의 경우 잘못된 OID나 잘못된 데이터 타입으로 인하여 API 내부 처리시에 에러가 발생한 경우 호출된다. TimeoutError는 SNMP 에이전트에 SnmpSession을 이용하여 데이터를 보냈지만 기본적으로 설정된 타임아웃 시간 내에 응답받지 못하는 경우 호출되도록 되어 있다. receivedPdu는 정상적으로 SNMP 에이전트로부터 데이터를 받은 경우 호출되며 이때 인자인 pdu에는 해당 데이터가 담겨져 있다. 

SNMP 에이전트와 통신에 사용되는 데이터 타입들은 모두 SnmpSyntax 인터페이스를 구현하고 있으며, 각 타입은 ASNTYPE으로 정의된 바이트 타입의 필드에 의해 구분되고 있다. 즉, SnmpHandler의 snmpReceivedPdu 메쏘드가 호출되어 받은 SnmpPduPacket은 SnmpSyntax를 구현하고 있는 인스턴스이며, 이 인스턴스 내의 ASNTYPE으로 정의된 필드를 각 SNMP 데이터 타입과 비교한 뒤 캐스팅을 이용하여 사용하도록 하고 있다.
 
출처 : http://silent1002.blog.me/12426113