SNMP(简单网络管理协议)是一种广泛应用于IP网络中的标准协议,主要用于监控和管理网络设备(如路由器、交换机、服务器等)。最初是基于简单网关监控协议(SGMP)发展而来,通过引入管理信息结构(SMI)和管理信息库(MIB)演变为标准化协议。它属于应用层协议,基于UDP传输,设计目标是简单性和扩展性,使管理员能够集中管理不同厂商的设备。以简单性和扩展性为核心设计特性,主要由SMI、MIB和SNMP三部分组成。
本文基于维谛动环设备做标准对接,基础框架以spingboot2为主,其他请参照做修改适配。
更多有关snmp详细的知识说明,请参阅如下文案:
一.snmp基础知识
注意:(以下snmp基础知识来源如下连接:https://zhuanlan.zhihu.com/p/20678893050)
1.snmp核心组件和架构

2.管理信息库(MIB)树形结构
管理信息库(MIB)是一个层次化的数据库,用于存储被管理设备的各种资源信息。这些信息以对象实例(即变量)的形式组织,每个代理都维护着一个独特的MIB。其采用树形结构,其根节点位于最顶端,且根节点本身没有名称。如下图所示,这是MIB的一个部分,也被称为对象命名树。

3.snmp版本介绍
SNMP有SNMPv1,SNMPv2c和SNMPv3三种版本。

二.配置使用snmp接收处理数据
1.springboot项目引入snmp4j的pom信息

<dependency>
<groupId>org.snmp4j</groupId>
<artifactId>snmp4j</artifactId>
<version>2.5.11</version>
</dependency>
2.snmp基础配置以及mib-oid映射对象
a.snmp基础配置
###SNMP配置
snmp:
##设备IP
target-ip: 127.0.0.1
port: 161
##团体名称
community: public
timeout: 3000
##重试次数
retries: 2
##私有MIB基础OID
base-oid: .1.3.6.1.4.1
/**
* SNMP配置类
*
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "snmp")
public class SnmpConfig {
//RDU501设备IP
private String targetIp;
private int port;
//团体名
private String community;
private int timeout;
//重试
private int retries;
//维谛私有MIB基础OID
private String baseOid;
}
b.mib-oid映射对象

/*
* Mib-oid映射对象(设备CSV文件数据)
*
*/
@Data
public class MibMappingObj implements Serializable {
//序号
private Integer index;
//设备类型ID
private String deviceTypeId;
private String deviceId; //设备ID
private String deviceName; //设备名称
private String oidStr; // OID参数
private String signalId; //信号ID
private String mqSgId; //消息服务信号ID
private String signalCnName; // 信号中文名称
private String signalEnName; // 信号英文名称
private String unitName; //单位名称
private Integer snmpPrecision; //SNMP精度
private String cnState; //状态量中文名
private String enState; //状态量英文名
private Integer signalType; //信号类型
/*
private String mibSignalName; // MIB信号名称
private String suffixOid; // Suffix OID
private String index; // 索引
private String signalType; // 信号类型: 0只读, 1可写, 2设置参数
private String flag; // 标记
*/
// 获取完整OID
public String getFullOid(String baseOid) {
return baseOid + "." + oidStr + "." + index;
}
// 判断是否为有效信号
public boolean isValidSignal() {
return signalId == null || "".equals(signalId) || "-9999".equals(signalId);
}
//判断是不是有效的单位
public boolean isValidUnit() {
return unitName == null || "".equals(unitName)
|| "NA".equals(unitName) || "-".equals(unitName);
}
}
3.初始化配置以及采集数据(支持批量采集)
@Slf4j
@Service
@RequiredArgsConstructor
public class SnmpService {
private final SnmpConfig snmpConfig;
private Snmp snmp;
private Target target;
/**
* 初始化SNMP连接
*
*/
public void init() throws IOException {
TransportMapping<UdpAddress> transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
target = new CommunityTarget();
((CommunityTarget) target).setCommunity(new OctetString(snmpConfig.getCommunity()));
target.setVersion(SnmpConstants.version2c);
target.setAddress(new UdpAddress(snmpConfig.getTargetIp() + "/" + snmpConfig.getPort()));
target.setTimeout(snmpConfig.getTimeout());
target.setRetries(snmpConfig.getRetries());
log.info("SNMP初始化完成: snmpConfig={}", snmpConfig.toString());
}
/**
* 采集单个OID的值
*
*/
public String getValue(String oid) {
try {
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(oid)));
pdu.setType(PDU.GET);
ResponseEvent response = snmp.send(pdu, target);
if (response != null && response.getResponse() != null) {
VariableBinding vb = response.getResponse().get(0);
log.info("SnmpService.getValue()————》采集单个OID的解析结果: {}", vb.toString());
if (vb.getVariable() != null) {
return vb.getVariable().toString();
}else {
log.warn("SnmpService.getValue()————》采集单个OID获取数据异常:oid={},vb={}",oid,vb.toString());
}
}else {
log.warn("SnmpService.getValue()————》采集单个OID响应异常OID:{}",oid);
}
} catch (Exception e) {
e.printStackTrace();
log.warn("SnmpService.getValue()采集失败————》OID: {}, 错误信息: {}", oid, e.getMessage());
}
return null;
}
/**
* 批量采集设备数据
*
*/
public List<DeviceDataObj> collectData(List<MibMappingObj> mappings, String deviceTypeName) {
List<DeviceDataObj> results = new ArrayList<>();
for (MibMappingObj mapping : mappings) {
if (!mapping.isValidSignal()) {
continue; // 跳过无效信号
}
try {
String oid = mapping.getFullOid(snmpConfig.getBaseOid());
String value = getValue(oid);
//采集完成后封装数据,根据实际业务自定义
if (value != null) {
DeviceDataObj data = new DeviceDataObj();
data.setDeviceId(mapping.getDeviceId());
data.setDeviceTypeId(mapping.getDeviceTypeId());
data.setDeviceTypeName(deviceTypeName);
data.setSignalName(mapping.getSignalEnName());
data.setSignalId(mapping.getSignalId());
data.setValue(value);
data.setCollectTime(new Date());
results.add(data);
log.debug("采集成功 - 设备:{} 信号:{} 值:{}",
mapping.getDeviceId(), mapping.getSignalEnName(), value);
}
} catch (Exception e) {
log.warn("采集异常 - 设备:{} 信号:{}",
mapping.getDeviceId(), mapping.getSignalEnName(), e);
}
}
return results;
}
}
三.windows安装配置snmp服务
1.安装可选功能snmp服务
打开【win+i】快捷键打开设置,在应用菜单下搜索【可选功能】,在打开的弹窗菜单中选择【查看可用功能】,搜索【snmp】即可看到【简答网络协议】选择安装即可。


2.设置snmp相关服务的配置和应用
通过【win+r】快捷键打开运行命令弹窗,输入【services.msc】命令后打开【服务菜单】,然后找到【snmp】服务,双击打开对应的配置菜单,按照如下配置即可

四.MIB Browser网络管理工具使用调试代码教程
1.官方下载对应系统版本适合自己的安装包自行安装即可
官网下载地址:https://www.ireasoning.com/download.shtml

2.配置snmp连接服务,并测试oid取值
注意:
也可以加载标准mibs文件,也会在树结构中展示相应系统配置信息,点击对应节点即可获取相关数据


五.在linux系统下,通过snmpwalk命令测试验证snmp服务和数据采集
1.在ubuntu22.04系统下安装snmpwalk
###更新你的系统
sudo apt update
sudo apt upgrade
###这个命令将安装包括snmpwalk在内的所有SNMP相关工具
sudo apt install snmp
###验证安装
snmpwalk -v 2c -c public localhost
2.测试验证snmp服务和数据采集
注意,非常重要!!!:
通过snmpwalk命令验证时,如果响应消息出现【Timeout: No Response。。。】这种问题,一般可检查网络是否连通,snmp服务是否需要设置白名单,snmp版本是否正确以及社区密钥是否配置正确。
###验证snmpwalk获取不同oid的采集值
snmpwalk -v 2c -c public 192.168.2.13 .1.3.6.1.2.1.6.2.0



被折叠的 条评论
为什么被折叠?



