joeSNMP

JavaオープンソースSNMP実装は結構情報が少なくて、メジャーなのはSNMP4JとjoeSNMPくらい?といってもGoogleヒット件数も少なくSNMP4Jが12,100、joeSNMPが8,240です
http://www.snmp4j.org/
http://sourceforge.net/projects/joesnmp/
共通して言えるのがどっちもドキュメント/サンプルが少ねえー
で、joeSNMPはSNMP v3に対応していない&バージョンが0.3.4、とかなり弱っちい感じなのですが、OpenNMSの内部プロジェクトなのでちょっと安心?っていうのと、SNMP4Jよりはコーディングが簡単なのでSNMPクライアントとして使ってみました。

ダウンロードしたら、
joesnmp-0.3.4/output/lib
にライブラリとサンプルのjarがあります。

とりあえずSimpleClientを動かしてみましょう。クラスパスを通して

> java org.opennms.examples.SimpleClient hogehoge 1.3.6.1.2.1.1.5
Received value: .1.3.6.1.2.1.1.5.0=hogehoge

引数はホスト名、OIDです。

ソースコード
joesnmp-0.3.4/src/joesnmp/org/opennms/examples/SimpleClient.java
です。

public class SimpleClient
{
    public static void main(String st[]) throws Exception
    {
        if (st.length != 2)
        {
            System.out.println("Usage: java SimpleClient host oid");
            System.exit(0);
        }
        
        InetAddress remote = InetAddress.getByName(st[0]); 
        SnmpPeer peer = new SnmpPeer(remote); 
        peer.setPort(161); 
        peer.setTimeout(5000); 
        peer.setRetries(1); // it is actually number of tries
         
        SnmpParameters parms = peer.getParameters(); 
        parms.setVersion(SnmpSMI.SNMPV2); 
        parms.setReadCommunity("public"); 
                 
        final SnmpSession session = new SnmpSession(peer); 
        session.setDefaultHandler(new SnmpHandler()
        {        
            public void snmpTimeoutError(SnmpSession session, SnmpSyntax pdu)
            {
                System.out.println("SnmpTimeout");
                synchronized (session) { session.notify(); }
            }
        
            public void snmpInternalError(SnmpSession session, int err, SnmpSyntax pdu)
            {
                System.out.println("InternalError");
                synchronized (session) { session.notify(); }
            }
        
            public void snmpReceivedPdu(SnmpSession session, int command, SnmpPduPacket pdu)
            {
                SnmpVarBind varBind = pdu.getVarBindAt(0);
                System.out.println("Received value: " + varBind.getName() + "=" + varBind.getValue());
                synchronized (session) { session.notify(); }
            }        
        });
        
        SnmpVarBind[] vblist = {new SnmpVarBind(st[1])};
        SnmpPduRequest pdu = new SnmpPduRequest(st[1].endsWith(".0") ? SnmpPduPacket.GET : SnmpPduPacket.GETNEXT, vblist);
        pdu.setRequestId(1);
        
        try
        {
            synchronized (session)
            {
                session.send(pdu);
                session.wait();
            }
        }
        catch (InterruptedException e)
        {
            // do nothing
        }
        finally
        {
            session.close();
        }
    }
}

SnmpHandlerインターフェースを実装しないといけないです。サンプルではSystem.outするだけなので無名クラスで済ませてますが、あれこれする場合はちゃんと作りこむことになるでしょう。