java对接物联网设备(二)——java配置读取snmp协议数据,同时包含windows和linux测试SNMP服务完整使用手册以及MIB Browser网络管理工具使用教程

SNMP(简单网络管理协议)是一种广泛应用于IP网络中的标准协议,主要用于监控和管理网络设备(如路由器、交换机、服务器等)。‌最初是基于简单网关监控协议(SGMP)发展而来,通过引入管理信息结构(SMI)和管理信息库(MIB)演变为标准化协议。‌它属于应用层协议,基于UDP传输,设计目标是简单性和扩展性,使管理员能够集中管理不同厂商的设备。以简单性和扩展性为核心设计特性,主要由SMI、MIB和SNMP三部分组成。

本文基于维谛动环设备做标准对接,基础框架以spingboot2为主,其他请参照做修改适配。

更多有关snmp详细的知识说明,请参阅如下文案:

SNMP基础全解析:网络管理新手必读

SNMP介绍及使用

SNMP及SNMP Trap对接指南

Windows下安装SNMP服务做测试验证

全面解析MIB Browser网络管理工具实战

一.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值