java snmp4j接收snmpV3 trap数据,实测有效
遇到的问题
1.unknown securityName
注意发送的用户配置了engineId时,接收端用户也要配置该engineId,不然会报unknown securityName
2.使用PrivAES256加密,报错aes加解密 Illegal key size
不支持AES256,需要替换jar包,请看我上篇文章的内容
接收数据端
package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snmp4j.*;
import org.snmp4j.mp.*;
import org.snmp4j.security.*;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
import java.util.regex.Pattern;
public class MySnmpV3Server implements CommandResponder {
private static final Logger logger = LoggerFactory
.getLogger(MySnmpV3Server.class);
private static String username = "ttlsa";
private static String authPassword = "ttlsapwd";
private static String privPassword = "ttlsades";
public static void main(String[] args) {
MySnmpV3Server server= new MySnmpV3Server();
server.exec();
}
private void exec() {
try {
String ip = "0.0.0.0/6666";
Address address = new UdpAddress(ip);
DefaultUdpTransportMapping defaultUdpTransportMapping = new DefaultUdpTransportMapping((UdpAddress) address);
ThreadPool threadPool = ThreadPool.create("Trap", 2);
MultiThreadedMessageDispatcher mtDispatcher = new MultiThreadedMessageDispatcher(threadPool,
new MessageDispatcherImpl());
// add message processing models
mtDispatcher.addMessageProcessingModel(new MPv1());
mtDispatcher.addMessageProcessingModel(new MPv2c());
mtDispatcher.addMessageProcessingModel(new MPv3());
// add all security protocols
SecurityProtocols.getInstance().addDefaultProtocols();
Snmp _snmp = new Snmp(mtDispatcher, defaultUdpTransportMapping);
_snmp.addCommandResponder(this);
MPv3 mpv3 =
(MPv3)_snmp.getMessageProcessingModel(MessageProcessingModel.MPv3);
USM usm = new USM(SecurityProtocols.getInstance(),
new OctetString(mpv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);
_snmp.getUSM().addUser(new OctetString(username),
new UsmUser(new OctetString(username),
AuthHMAC384SHA512.ID,
new OctetString(authPassword),
PrivAES256.ID,
new OctetString(privPassword)));
try {
defaultUdpTransportMapping.listen();
} catch(IOException ioex) {
logger.error("Unable to listen: " + ioex);
//System.out.println("Unable to listen: " + ioex);
System.exit(-1);
}
logger.info("Waiting for traps..");
//System.out.println("Waiting for traps..");
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public synchronized void processPdu(CommandResponderEvent event) {
logger.info("Received PDU...");
//System.out.println("Received PDU...");
logger.info("PeerAddress:"+event.getPeerAddress().toString());
//System.out.println("PeerAddress:"+event.getPeerAddress().toString());
PDU command = event.getPDU();
logger.info(command.toString());
if (command != null) {
StringBuilder stringBuilder = new StringBuilder();
//消息类型
String type = null;
if(command instanceof ScopedPDU){
ScopedPDU scopedPDU = (ScopedPDU) command;
OctetString contextEngineID = scopedPDU.getContextEngineID();
String engineId = null;
try {
engineId = new String(OctetString.fromHexString(contextEngineID.toString()).getValue(), "GBK");
} catch (Exception ue) {
logger.error("vb的Variable值转换异常,variable="+contextEngineID,ue);
}
OctetString contextName = scopedPDU.getContextName();
logger.info("contextEngineID="+engineId
+",contextName="+contextName);