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