初学SNMP。
源于网上的代码,自己再修改了些。
一、SNMP-Get-Set
package snmp.setget;
import java.io.IOException;
import java.util.Vector;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class SnmpSetGet {
private Snmp snmp = null;
private Address agentAddrPort = null;
public void initComm() throws IOException {
agentAddrPort = GenericAddress.parse("udp:127.0.0.1/161");
TransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
}
public ResponseEvent sendPDU(PDU pdu) throws IOException {
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(agentAddrPort);
target.setRetries(2);
target.setTimeout(1500);
target.setVersion(SnmpConstants.version1);
return snmp.send(pdu, target);
}
public void setPDU() throws IOException {
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"),
new OctetString("aa") ) );
pdu.setType(PDU.SET);
readResponse(sendPDU(pdu));
}
public void getPDU() throws IOException {
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0")));
pdu.setType(PDU.GET);
readResponse(sendPDU(pdu));
}
public void readResponse(ResponseEvent respEvnt) {
if(respEvnt == null) {
System.out.println("respEvnt == null");
} else if(respEvnt.getResponse() == null) {
System.out.println("respEvnt.getResponse() == null");
} else if (respEvnt != null && respEvnt.getResponse() != null) {
@SuppressWarnings("unchecked")
Vector<VariableBinding> recVBs = respEvnt.getResponse().getVariableBindings();
for (int i = 0; i < recVBs.size(); i++) {
VariableBinding recVB = recVBs.elementAt(i);
System.out.println(recVB.getOid() + " " + recVB.getVariable());
}
}
}
public static void main(String[] args) {
try {
SnmpSetGet util = new SnmpSetGet();
util.initComm();
util.setPDU();
util.getPDU();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:
1.3.6.1.2.1.1.5.0 aa
1.3.6.1.2.1.1.5.0 aa
二、SNMP-Trap
package snmp.trap;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.util.Vector;
import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.CommunityTarget;
import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
/**
* 本类用于监听代理进程的Trap信息
*/
public class MultiThreadedTrapReceiver {
private Snmp snmpManager = null;
private String listenAddress = null;
private void getLocalIP() {
InetAddress addr = null;
try {
addr = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
}
String ip = addr.getHostAddress().toString();
System.out.println("IP: " + ip);
listenAddress = "udp:" + ip + "/162";
}
private void init() throws UnknownHostException, IOException {
ThreadPool threadPool = ThreadPool.create("Trap", 2);
MultiThreadedMessageDispatcher dispatcher =
new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
Address address = GenericAddress.parse(listenAddress);
TransportMapping transport = new DefaultUdpTransportMapping((UdpAddress)address);
snmpManager = new Snmp(dispatcher, transport);
snmpManager.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
snmpManager.listen();
}
public void managerRun() {
try {
init();
CommandResponder trapRec = new CommandResponder() {
/**
* 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
* 当接收到trap时,会自动进入这个方法
* */
@Override
public void processPdu(CommandResponderEvent respEvnt) {
if (respEvnt != null && respEvnt.getPDU() != null) {
@SuppressWarnings("unchecked")
Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();
for (int i = 0; i < recVBs.size(); i++) {
VariableBinding recVB = recVBs.elementAt(i);
System.out.println(recVB.getOid() + " =c= " + recVB.getVariable());
}
}
}
};
snmpManager.addCommandResponder(trapRec);
System.out.println("开始监听Trap信息!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
private Snmp snmpAgent = null;
private CommunityTarget target = null;
public void initComm() throws IOException {
target = new CommunityTarget();
Address address = GenericAddress.parse(listenAddress);
target.setAddress(address);
target.setRetries(2);
target.setTimeout(1500);
target.setVersion(SnmpConstants.version2c);
TransportMapping transport = new DefaultUdpTransportMapping();
snmpAgent = new Snmp(transport);
transport.listen();
}
/**
* 向管理进程发送Trap报文
*/
public void sendTrap() throws IOException {
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.1"),
new OctetString("SnmpTrap")));
pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"),
new OctetString((new Timestamp(System.currentTimeMillis())).toString())));
pdu.setType(PDU.TRAP);
snmpAgent.send(pdu, target);
}
public void agentRun() {
try {
initComm();
while(true) {
Thread.sleep(1000); //设置Trap发送频率
sendTrap();
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();
multithreadedtrapreceiver.getLocalIP();
multithreadedtrapreceiver.managerRun();
multithreadedtrapreceiver.agentRun();
}
}
结果:
IP: <这里输出IP地址>
开始监听Trap信息!
1.3.6.1.2.3377.10.1.1.1.1 =c= SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2 =c= 2015-02-27 15:56:30.502
1.3.6.1.2.3377.10.1.1.1.1 =c= SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2 =c= 2015-02-27 15:56:31.506
1.3.6.1.2.3377.10.1.1.1.1 =c= SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2 =c= 2015-02-27 15:56:32.506
1.3.6.1.2.3377.10.1.1.1.1 =c= SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2 =c= 2015-02-27 15:56:33.506
.............每秒输出2行