前言
网上关于V3加密认证的例子不多,尤其是认证和加密的,很多都是发送trap的例子,很少有接收trap的例子。
虽然是V3,但也支持V1V2,只需要打开相关注释就行。
网上没有认证且加密成功的例子,下面的例子都能测试通。
现在贴出来,希望对大家有用。
消息接收类
package org.apache.flume.test.v3;
import org.snmp4j.*;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.security.*;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
import java.util.Vector;
public class MultiThreadedTrapReceiver implements CommandResponder {
private String username1 = "nmsAdminNaNp";
private String username2 = "nmsAdmin2ANp";
private String username3 = "nmsAdmin3ap";
private String authPassword = "nmsAuthKey";
private String privPassword = "nmsPrivKey";
private MultiThreadedMessageDispatcher dispatcher;
private Snmp snmp = null;
private Address listenAddress;
private ThreadPool threadPool;
public MultiThreadedTrapReceiver() {
// BasicConfigurator.configure();
}
private void init() throws Exception {
/*threadPool = ThreadPool.create("Trap", 2);
dispatcher = new MultiThreadedMessageDispatcher(threadPool,
new MessageDispatcherImpl());
listenAddress = GenericAddress.parse(System.getProperty(
"snmp4j.listenAddress", "udp:10.195.88.96/162")); // 本地IP与监听端口
TransportMapping transport;
// 对TCP与UDP协议进行处理
if (listenAddress instanceof UdpAddress) {
transport = new DefaultUdpTransportMapping(
(UdpAddress) listenAddress);
} else {
transport = new DefaultTcpTransportMapping(
(TcpAddress) listenAddress);
}
snmp = new Snmp(dispatcher, transport);
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
UsmUser usmUser = new UsmUser(new OctetString(username), AuthMD5.ID,
new OctetString(authPassword), Priv3DES.ID,
new OctetString(privPassword));
USM usm = new USM(SecurityProtocols.getInstance().addDefaultProtocols(), new OctetString(MPv3
.createLocalEngineID()), 0);
usm.addUser(usmUser);
SecurityModels.getInstance().addSecurityModel(usm);
snmp.listen();
//add the enginID in the trap
//OctetString engineID = new OctetString(MPv3.createLocalEngineID());
byte[] enginId = "TEO_ID".getBytes();
OctetString engineID = new OctetString(enginId);
//create and add the userSecurityModel
USM usm = new USM(SecurityProtocols.getInstance(),engineID, 0);
SecurityModels.getInstance().addSecurityModel(usm);
//add the securityProtocols,you can skip it if your users are noAuthNoPriv
SecurityProtocols.getInstance().addDefaultProtocols();
//create and add the user
UsmUser usmUser = new UsmUser(new OctetString(username), AuthMD5.ID,
new OctetString(authPassword), Priv3DES.ID,
new OctetString(privPassword));
usm.addUser(usmUser);
//snmp.getUSM().addUser(usmUser);
snmp.listen();
*/
/*******************************************使用处*************************************************/
//创建接收SnmpTrap的线程池,参数: 线程名称及线程数
threadPool = ThreadPool.create("Trap", 2);
dispatcher = new MultiThreadedMessageDispatcher(threadPool,
new MessageDispatcherImpl());
//监听端的 ip地址 和 监听端口号
listenAddress = GenericAddress.parse(System.getProperty(
"snmp4j.listenAddress", "udp:127.0.0.1/161"));
TransportMapping transport;
if (listenAddress instanceof UdpAddress) {
transpo