SNMP4J的使用
SNMP协议
SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。
简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。SNMP协议应用广泛,使用简单。一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。
SNMP规定了5种协议数据单元:
1.get-request操作:从代理进程处提取一个或多个参数值。
2.get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数 值。
3.set-request操作:设置代理进程的一个或多个参数值。
4.get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。
5.trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
snmpwalk工具操作参数
snmpwalk [版本] [权限] [IP] [OID] [参数(Integer或string)]
snmpwalk操作示例:
snmpwalk -v2c public 192.168.0.107 .1.3.6.1.4.1.532.2.1.2.1.5. 11
snmp对象结构
snmp4J
snmp4J是Java对于snmp协议的一个开源项目,目前使用的是对应Java8的snmp4j依赖:
<dependency> <groupId>org.snmp4j</groupId> <artifactId>snmp4j</artifactId> <version>2.8.3</version> </dependency>
snmp4J主要分为几大对象结构
- snmp对象 ,可以看成一个代理人,ResponseEvent response=snmp.send(pdu, target)方法用来传递消息,返回数据;
- target对象 ,目标参数封装,设置目标参数的地址,协议版本,超时、重传等;
- pdu对象 ,pdu.add(VariableBinding)添加要发送的数据,比如oid和integer、string参数;
- ResponseEvent对象 ,返回参数封装;
- VariableBinding对象 数据绑定,然后添加到pdu;
- TransportMapping snmp对象初始化参数,默认为DefaultUdpTransportMapping,new snmp(TransportMapping);
MIB BROWSER
snmp4J使用
案例:
项目 | Value |
---|---|
设备 | 远程智能pdu,接口文档,MIB库 |
调试工具 | MIB BROWSER |
协议 | SNMP协议 |
SNMP框架 | SNMP4J |
项目框架 | springboot |
1.将电脑与设备的网络连通,能访问设备的内部网页,使用MIB BROWSER导入设备的MIB库,调试get,set,getnext各种操作。
2.新建一个springboot项目,导入SNMP4J依赖,创建SNMPUtil工具类,创建定时任务,一分钟获取一次数据
package com.example.demo.task;
import com.example.demo.config.ParamsConfig;
import com.example.demo.util.SnmpUtil;
import lombok.extern.slf4j.Slf4j;
import org.snmp4j.PDU;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Vector;
@Component
@Slf4j
public class PduTask {
@Autowired
private ParamsConfig paramsConfig;//配置参数
@Scheduled(fixedRate = 60000)//每分钟执行一次
@Async
public void getPduInfo() {
log.info("获取pdu数据:开始");
int ver2c = SnmpConstants.version2c;//snmp2协议
SnmpUtil snmpUtil=new SnmpUtil(ver2c);
PDU pdu = new PDU();
//PDU pdu = new ScopedPDU();
// 设置要获取的对象ID,这个OID代表远程计算机的名称
OID oid1 = new OID(paramsConfig.temp_oid);//温度
OID oid2 = new OID(paramsConfig.humi_oid);//湿度
OID oid3 = new OID(paramsConfig.smoke_oid);//烟感
OID oid4 = new OID(paramsConfig.voltage_oid);//电压
OID oid5 = new OID(paramsConfig.current_oid);//电流
pdu.add(new VariableBinding(oid1));
pdu.add(new VariableBinding(oid2));
pdu.add(new VariableBinding(oid3));
pdu.add(new VariableBinding(oid4));
pdu.add(new VariableBinding(oid5));
// 设置报文类型
pdu.setType(PDU.GET);
try {
String addr=paramsConfig.transfer_protocol+":"+paramsConfig.snmp_ip+"/"+paramsConfig.snmp_port;
ResponseEvent response=snmpUtil.sendMessage(false, true, pdu, addr,new OctetString("public"));//192.168.1.233 WinServer2008服务器
Vector<? extends VariableBinding> list =response.getResponse().getVariableBindings();
System.out.println("Synchronize(同步) message(消息) from(来自) "
+ response.getPeerAddress() + "\r\n" + "request(发送的请求):"
+ response.getRequest() + "\r\n" + "response(返回的响应):"
+ list.get(0).getVariable().toString().substring(0,4)+"\r\n"+
list.get(1).getVariable().toString().substring(0,4)+"\r\n"+
list.get(2).getVariable()+"\r\n"+
list.get(3).getVariable()+"\r\n"+
list.get(4).getVariable());
log.info("发送数据--------------------------------------------");
} catch (IOException e) {
e.printStackTrace();
}
log.info("定时获取探测站Info:结束");
}
}
返回数据
Synchronize(同步) message(消息) from(来自) 192.168.0.107/161
request(发送的请求):GET[requestID=292621635, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.532.2.2.1.1.4.1 = Null; 1.3.6.1.4.1.532.2.2.1.1.5.1 = Null; 1.3.6.1.4.1.532.2.4.1.1.5.4 = Null; 1.3.6.1.4.1.532.2.1.1.1.3.1 = Null; 1.3.6.1.4.1.532.2.1.1.1.4.1 = Null]]
response(返回的响应):25.2
63.1
0
223.1
0.0
至此snmp4j的使用就完成了