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するだけなので無名クラスで済ませてますが、あれこれする場合はちゃんと作りこむことになるでしょう。