<!-- https://mvnrepository.com/artifact/org.snmp4j/snmp4j -->
<dependency>
<groupId>org.snmp4j</groupId>
<artifactId>snmp4j</artifactId>
<version>2.6.3</version>
</dependency>
import lombok.extern.slf4j.Slf4j;
import org.snmp4j.*;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
public class SnmpUtil {
public static final int DEFAULT_VERSION = SnmpConstants.version2c;
public static final String DEFAULT_PROTOCOL = "udp";
public static final long DEFAULT_TIMEOUT = 3 * 1000L;
public static final int DEFAULT_RETRY = 3;
public static CommunityTarget createDefault(String ip, String community, String port) {
Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip
+ "/" + 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 Map<String, List<String>> getSnmpData(String ip, String community, String port,
String oid) {
Map<String, List<String>> map = new HashMap<>();
CommunityTarget target = createDefault(ip, community, port);
Snmp snmp = null;
try {
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
snmp.listen();
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oid)));
pdu.setType(PDU.GET);
ResponseEvent responseEvent = snmp.send(pdu, target);
if (null != responseEvent && null != responseEvent.getResponse()) {
List<? extends VariableBinding> variableBindings = responseEvent.getResponse().getVariableBindings();
List<String> collect = variableBindings.stream().map(VariableBinding::getVariable).map(Objects::toString).collect(Collectors.toList());
map.put(oid, collect);
}
} catch (Exception e) {
e.printStackTrace();
log.error("get snmp data Exception:" + e);
} finally {
if (null != snmp) {
try {
snmp.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return map;
}
public static List<Map> snmpWalk(String ip, String community, String port,
String oid) {
List<Map> list = new ArrayList<Map>();
try {
CommunityTarget target = createDefault(ip, community, port);
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
Snmp snmp = null;
snmp = new Snmp(transport);
snmp.listen();
PDU pdu = createPDU(SnmpConstants.version2c, PDU.GETNEXT, oid);
boolean matched = true;
while (matched) {
ResponseEvent responseEvent = snmp.send(pdu, target);
if (responseEvent == null || responseEvent.getResponse() == null) {
System.out.println("TimeOut...");
break;
}
PDU response = responseEvent.getResponse();
String nextOid = null;
Vector<? extends VariableBinding> variableBindings = response.getVariableBindings();
for (int i = 0; i < variableBindings.size(); i++) {
Map map = new HashMap();
VariableBinding variableBinding = variableBindings.elementAt(i);
Variable variable = variableBinding.getVariable();
nextOid = variableBinding.getOid().toDottedString();
if (!nextOid.startsWith(oid)) {
matched = false;
break;
}
map.put("oid", nextOid);
map.put("value", variable);
list.add(map);
}
if (!matched) {
break;
}
pdu.clear();
pdu.add(new VariableBinding(new OID(nextOid)));
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
private static PDU createPDU(int version, int type, String oid) {
PDU pdu = null;
if (version == SnmpConstants.version3) {
pdu = new ScopedPDU();
} else {
pdu = new PDUv1();
}
pdu.setType(type);
pdu.add(new VariableBinding(new OID(oid)));
return pdu;
}
}