研究了adventnet 的API接口应用,走了很多弯路,为了给大家做指导,特此记录。
首先,adventnet分为高版本和低版本的API。以trap为例:高版本Using High-Level API,是在低版本的基础上在封装了一层,对于底版本我必须知道agent的upd端口号和地址,而高版本不需要知道,它会自动分发到agent端。
[color=red][b]Using Low-Level API[/b][/color]
以上是低版本,一般来说,是我知道对方的IP地址在做trap,这种不适合我的需要,我目前是直接分发出去。所以用高版本。
[color=red][b]Using High-Level API[/b][/color]
最后就是接收端接收了。
首先,adventnet分为高版本和低版本的API。以trap为例:高版本Using High-Level API,是在低版本的基础上在封装了一层,对于底版本我必须知道agent的upd端口号和地址,而高版本不需要知道,它会自动分发到agent端。
[color=red][b]Using Low-Level API[/b][/color]
public class Sendv2cTrap
{
public static void main(String args[])
{
if( args.length == 0)
{
System.out.println("Usage : java SnmpSendTrap hostname");
System.exit(0);
}
// 需要发给哪个主机的IP地址
String remoteHost = args[0];
// Start SNMP API
SnmpAPI api = new SnmpAPI();
api.setDebug(true);
SnmpSession session = new SnmpSession(api);
// set remote Host
UDPProtocolOptions option = new UDPProtocolOptions(hostname);
SnmpPDU pdu = new SnmpPDU();
pdu.setProtocolOptions(option);
// 需要发给哪个主机的端口号
option.setRemotePort(8001);
//open the session
try
{
session.open();
}
catch (SnmpException e )
{
System.err.println("Error opening socket: "+e);
}
// Build SNMPv2c Trap PDU
pdu.setCommand(SnmpAPI.TRP2_REQ_MSG );
//参数一
SnmpVar var = null;
SnmpOID oid = new SnmpOID(".1.3.6.1.2.1.1.3.0");
try
{
//create SnmpVar instance
var = SnmpVar.createVariable(systemuptime, SnmpAPI.TIMETICKS);
}
catch(SnmpException e)
{
System.err.println("Cannot create variable: " + oid + " with value: " + systemuptime);
return;
}
//create varbind
SnmpVarBind varbind = new SnmpVarBind(oid,var);
// add variable binding
pdu.addVariableBinding(varbind);
//参数二
oid = new SnmpOID(".1.3.6.1.6.3.1.1.4.1.0");
try
{
//create SnmpVar instance
var = SnmpVar.createVariable(trapoidvalue,SnmpAPI.OBJID);
}
catch(SnmpException e)
{
System.err.println("Cannot create variable: " + oid + " with value: " + trapoidvalue);
return;
}
//create varbind
SnmpVarBind varbind = new SnmpVarBind(oid,var);
// add variable binding
pdu.addVariableBinding(varbind);
// send PDU
try
{
session.send(pdu);
}
catch (SnmpException e)
{
System.err.println("Sending PDU"+e.getMessage());
}
System.exit(0);
}
以上是低版本,一般来说,是我知道对方的IP地址在做trap,这种不适合我的需要,我目前是直接分发出去。所以用高版本。
[color=red][b]Using High-Level API[/b][/color]
public class Sendv2Trap {
private static final String OID = "1.3.6.1.2.33779.1";
public static void main(String args[]) {
// instantiate SNMP target bean
SnmpTarget target = new SnmpTarget();
//本机主机地址
target.settargetHost("hostname");
//端口号
target.setTargetPort(162);
//Set the SNMP version.
target.setSnmpVersion(target.VERSION2C);
//值为public
target.setCommunity(community);
//测试值
String values[] = {"testing"};
try
{
//创建snmpoid
SnmpOID snmpOID = new SnmpOID(OID);
//通过oid绑定参数和变量
SnmpVar snmpVar = SnmpVar.createVariable("test Trap", SnmpAPI.STRING);
//发送trap
this.eventAPI.snmpSendNotification(1000, snmpOID, new SnmpVar[] { snmpVar }); }
catch (Exception e)
{
System.err.println("Error Sending Trap: "+e.getMessage());
}
System.exit(0);
}
最后就是接收端接收了。
public class SnmpTrapd implements TrapListener {
public static void main(String args[]) {
// instantiate SNMP Trap Receiver bean
SnmpTrapReceiver trapreceiver = new SnmpTrapReceiver();
// set the port in which the trap is received
trapreceiver.setPort(162);
// register the listener for trap events
trapreceiver.addTrapListener(new SnmpTrapd());
System.out.println("Waiting to receive traps .......");
}
@Override
public void receivedTrap(TrapEvent trap) {
System.out.println("Got a trap from: " + trap.getRemoteHost());
// print PDU details
System.out.println(((SnmpTrapReceiver) trap.getSource()).getMibOperations().toString(trap.getTrapPDU()));
if (trap.getTrapPDU().getCommand() == SnmpAPI.TRP_REQ_MSG) {
com.adventnet.snmp.mibs.MibTrap trapDefn = trap.getTrapDefinition();
if (trapDefn != null) // print name and description
System.out.println("Trap Name: " + trapDefn.getName() + "\nDescr: " + trapDefn.getDescription());
}
}
}