Java使用-Snmp4j接口-操作SNMP简单网路协议
前言:这篇文章实现了 查询单个OID 和 同时查询多个OID。 如有错误或建议,非常感谢提出。
需要接口帮助文档可在我的资源中自行下载。
SpringBoot操作Snmp
1. 导入依赖
<dependency>
<groupId>org.snmp4j</groupId>
<artifactId>snmp4j</artifactId>
<version>2.8.3</version>
</dependency>
2. 认识主要的类和接口
2.1、Snmp类
? 该类是Snmp4j核心类,负责Snmp报文的接收个发送。它提供了发送和接收PDU的方法,所有的PDU类型都可以采用同步或者异步的方式被发送。
2.2、PDU类和ScopedPDU类
? 该类是Snmp报文单元的抽象,其中PDU类适用于SNMPv1和SNMPv2c。ScopedPdu\DU类继承于PDU类,适用于SNMPv3。
2.3、Target接口和CommunityTarget类以及UserTarget类
? 对应于SNMP代理的地址信息,包括IP地址和端口号(161)。其中Target接口适用于SNMPv1和SNMPv2c。CommunityTarget类实现了Target接口,用于SNMPv1和SNMPv2c这两个版本,UserTarget类实现了Target接口,适用于SNMPv3。
2.4、TransportMapping接口
? 该接口代表了Snmp4j所使用的传输协议。这也是Snmp4j一大特色的地方。按照PFC的规定,Snmp是只使用UDP作为传输层协议的。而Snmp4j支持管理端和代理端使用UDP或者TCP进行传输,该连接由两个子接口。
2.5、Snmp、Target、PDU之间的关系
Target代表远程设备或者远程实体,PDU代表管理端同Target通信的数据,Snmp就代表管理者管理功能(起始就是数据的收发)的具体执行者。
举个栗子:Target就是你远方的恋人,PDU就是你们之间传递的情书,而Snmp就是负责帮你寄信收信的邮差。
3.Snmp4j的两种消息发送模式
SNMP4J支持两种消息发送模式:同步发送模式和异步发送模式。
同步发送模式也称阻塞模式。当管理端发送出一条消息之后,线程会被阻塞,直到收到对方的回应或者时间超时。同步发送模式编程较为简单,但是不适用于发送广播消息。
异步发送模式也称非阻塞模式。当程序发送一条消息之后,线程将会继续执行,当收到消息的回应的时候,程序会对消息作出相应的处理。要实现异步发送模式,需要实例化一个实现了ResponseListener接口的类的对象。ResponseListener接口中有一个名为onResponse的函数。这是一个回调函数,当程序收到响应的时候,会自动调用该函数。由该函数完成对响应的处理。
4.简单的代码实现
package com.example.util;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import java.io.IOException;
import java.util.List;
public class Snmp4jUtil {
public static final int DEFAULT_VERSION = SnmpConstants.version2c;
public static final String DEFAULT_PROTOCOL = "udp";
public static final int DEFAULT_PORT = 161;
public static final long DEFAULT_TIMEOUT = 3 * 1000L;
public static final int DEFAULT_RETRY = 3;
public static CommunityTarget createDefault(String ip,String community){
Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip + "/" + DEFAULT_PORT);
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));
target.setAddress(address);
target.setVersion(DEFAULT_VERSION);
target.setTimeout(DEFAULT_TIMEOUT);
target.setRetries(DEFAULT_RETRY);
return target;
}
public static void snmpGet(String ip,String community,String oid) throws IOException {
CommunityTarget target = createDefault(ip, community);
Snmp snmp = null;
try{
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oid)));
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
snmp.listen();
System.out.println("------>发送PDU<------");
pdu.setType(PDU.GET);
ResponseEvent respEvent = snmp.send(pdu, target);
System.out.println("PeerAddress:" + respEvent.getPeerAddress());
PDU response = respEvent.getResponse();
if(response == null){
System.out.println("ERROR: <response is null, request time out>");
} else {
System.out.println("响应的PDU大小为:[" + response.size() + "]");
for (int i = 0; i < response.size(); i++) {
VariableBinding vb = response.get(i);
System.out.println("请 求 的 OID:[" + vb.getOid() + "]");
System.out.println("获取OID对应的值:[" + vb.getVariable() + "]");
}
}
System.out.println("----------结果:成功!!!");
}catch(Exception e){
e.printStackTrace();
System.out.println("SNMP Get Exception:" + e);
}finally {
if (snmp != null) {
try { snmp.close(); }
catch (IOException ex1) { snmp = null; }
}
}
}
public static void snmpGetList(String ip, String community, List<String> oidList){
CommunityTarget target = createDefault(ip, community);
Snmp snmp = null;
try{
PDU pdu =new PDU();
for (String oid : oidList) {
pdu.add(new VariableBinding(new OID(oid)));
}
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
snmp.listen();
System.out.println("------>发送PDU<------");
pdu.setType(PDU.GET);
ResponseEvent respEvent = snmp.send(pdu, target);
System.out.println("PeerAddress:" + respEvent.getPeerAddress());
PDU response = respEvent.getResponse();
if(response == null){
System.out.println("ERROR: <response is null, request time out>");
} else {
System.out.println("响应的PDU大小为:[" + response.size() + "]");
for (int i = 0; i < response.size(); i++) {
VariableBinding vb = response.get(i);
System.out.println("请 求 的 OID:[" + vb.getOid() + "]");
System.out.println("获取OID对应的值:[" + vb.getVariable() + "]");
}
}
System.out.println("----------结果:成功!!!");
}catch(Exception e){
e.printStackTrace();
System.out.println("SNMP Get Exception:" + e);
}finally {
if (snmp != null) {
try { snmp.close(); }
catch (IOException ex1) { snmp = null; }
}
}
}
}
|