1.什么是SNMP
SNMP是管理进程(NMS)和代理进程(Agent)之间的通信协议。它规定了在网络环境中对设备进行监视和管理的标准化管理框架、通信的公共语言、相应的安全和访问控制机制。网络管理员使用SNMP功能可以查询设备信息、修改设备的参数值、监控设备状态、自动发现网络故障、生成报告等。基于TCP/IP互联网的标准协议,传输层协议一般采用UDP。自动化网络管理。网络管理员可以利用SNMP平台在网络上的节点检索信息、修改信息、发现故障、完成故障诊断、进行容量规划和生成报告。屏蔽不同设备的物理差异,实现对不同厂商产品的自动化管理。SNMP只提供最基本的功能集,使得管理任务与被管设备的物理特性和实际网络类型相对独立,从而实现对不同厂商设备的管理。简单的请求—应答方式和主动通告方式相结合,并有超时和重传机制。报文种类少,报文格式简单,方便解析,易于实现。SNMPv3版本提供了认证和加密安全机制,以及基于用户和视图的访问控制功能,增强了安全性。
一丶通过OID获取信息
/*
* 每个厂商的OID定义是不一样的
*/
public static String GetCarbonDust(String ip){
try{
//设定CommunityTarget
CommunityTarget myTarget = new CommunityTarget();
Address deviceAdd = GenericAddress.parse("udp:"+ip+"/161"); //通信主机的地址
myTarget.setAddress(deviceAdd); //设定通信主机的地址
myTarget.setCommunity(new OctetString("public")); //设置snmp共同体
myTarget.setRetries(2); //设置超时重试次数
myTarget.setTimeout(5*60); //设置超时的时间
myTarget.setVersion(SnmpConstants.version2c);//设置snmp版本
//设定采取的协议
TransportMapping transport = new DefaultUdpTransportMapping(); //设定传输协议为UDP
transport.listen();
Snmp protocol = new Snmp(transport);
//获取mib
PDU request = new PDU();
request.add(new VariableBinding(new OID("1.3.6.1.2.1.43.11.1.1.9.1.0")));
request.setType(PDU.GETNEXT);
ResponseEvent responseEvent = protocol.send(request, myTarget);
PDU response=responseEvent.getResponse();
//输出
if(response != null){
VariableBinding vb1 = response.get(0);
String string = vb1.toString();
return string ;
transport.close();
}
}catch(IOException e){
return "";
}
return "失败";
}
二 丶捕获陷阱
public class SnmpUtil implements CommandResponder{
private static int Numcreate = 200;
private static String ipAddress = null;
private Snmp snmp = null;
public void init(){
//1、初始化多线程消息转发类
ThreadPool threadPool = ThreadPool.create("SnmpTrap", Numcreate);
MessageDispatcher messageDispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
//其中要增加三种处理模型 3中类型的 v1 v2 v3
messageDispatcher.addMessageProcessingModel(new MPv1());
messageDispatcher.addMessageProcessingModel(new MPv2c());
OctetString localEngineID = new OctetString(MPv3.createLocalEngineID());
USM usm = new USM(SecurityProtocols.getInstance().addDefaultProtocols(), localEngineID, 0);
UsmUser user = new UsmUser(new OctetString("SNMPV3"), AuthSHA.ID, new OctetString("authPassword"),
PrivAES128.ID, new OctetString("privPassword"));
usm.addUser(user.getSecurityName(), user);
messageDispatcher.addMessageProcessingModel(new MPv3(usm));
//2、创建transportMapping
TransportMapping<?> transportMapping = null;
try {
UdpAddress updAddr = (UdpAddress) GenericAddress.parse(System.getProperty("snmp4j.listenAddress", ipAddress));
transportMapping = new DefaultUdpTransportMapping(updAddr);
//3、创建snmp
snmp = new Snmp(messageDispatcher, transportMapping);
//开启监听
snmp.listen();
} catch (IOException e) {
System.err.println("初始化transportMapping失败:"+ e.getMessage());
e.printStackTrace();
}
}
public void Listen(String ip) {
ipAddress=ip;
init();
//一定要将当前对象添加至commandResponderListeners中
snmp.addCommandResponder(this);
System.out.println("开始监听trap信息:");
}
/**
* 处理信息方法
*/
@Override
public void processPdu(CommandResponderEvent event) {
String version = null ;
String community = null;
if (event.getPDU().getType() == PDU.V1TRAP) {
version = "v1";
community = new String(event.getSecurityName());
} else if (event.getPDU().getType() == PDU.TRAP){
if (event.getSecurityModel() == 2) {
version = "v2";
community = new String(event.getSecurityName());
}else {
version = "v3";
}
}
System.out.println("接收到的trap信息:[发送来源="+event.getPeerAddress()+",snmp版本="+version+",团体名="+community+", 携带的变量="+event.getPDU()+"]");
}
public static void main(String[] args) {
SnmpUtil handler = new SnmpUtil();
handler.Listen("udp:ip/162");
}
}
感兴趣的可以是试试(学习记录,有问题的可以一起讨论!)