SNMP协议

SNMP协议

SNMP协议概述

SNMP,即简单网络管理协议,是一种广泛使用的网络管理协议。它允许网络管理员监控和管理网络设备,如服务器、工作站、交换机、路由器等。SNMP是应用层协议,基于UDP协议。使用端口161进行数据传输,而trap消息则使用端口162。

Trap消息:用一句来说的话,SNMP trap就是被管理设备主动发送信息给NMS的一种机制。当被管理设备出现了性能问题,甚至是网络设备宕机或是接口不可用时,Agent需要主动发送消息通知NMS。假如在特定事件出现时,不是由Agent主动通知NMS,那么NMS必须不断的对Agent进行轮询,这是非常浪费计算资源的方法。正如人们用中断通知CPU数据的到达,而不是让CPU进行轮询一样。Trap通知是更加合理的选择。

广义的trap即SNMP Trap,指被管理设备(代理)上报的陷阱报文,表明设备发送故障或是变更的主动通知。SNMP trap的形式可分为Trap和inform Request(简称Inform)两种:

Trap是发送给SNMP管理者的通知网络状况的警告信息。
Inform是需要SNMP管理者确认接受的Trap。

SNMP通知可以用于指示网络中出现的不正确用户授权、重启、连接关闭、设备通信中断或其它异常事件。与inform相比较,Trap通知方式为不可靠传输,因为接受者在收到一条Trap通知后无需回复任何确认信息,发送者无法知道Trap通知是否已经被正确接收。与此相应,当SNMP管理者收到一条Inform通知后它需要向发送者回复一条确认信息,使用的是SNM应答数据包(PDU)。如果SNMP管理者没有接收到Inform通知,它将不会发送任何应答,所以当发送者无法接收到期望的应答时,它将再次发送一条Inform通知给SNMP管理者。这种方式保证了Inform通知方式可以较有效保证地把通知发送到期望的目的地。

SNMP Trap使用的端口 服务器用的UDP162端口。Agent使用的是UDP161端口。
在这里插入图片描述

SNMP协议的主要特点

简单性:SNMP的设计目标是易于实现、配置和维护的。

扩展性:通过MIB(管理信息库)的定义,SNMP可以管理各种类型的网络设备。

异构网络支持:SNMP能够在不同的厂商和不同的类型的网络设备上运行。

SNMP协议的主要组件

-管理站(Manager或是NMS):负责发送请求并接收来自代理的相应和通知。

-代理(Agent):运行在被管理设备上,负责了网络设备上可以被管理的信息结构。

-MIB(Management Informnet base):定义了网络设备上可以被管理的信息结构。SNMP中的MIB是一种树状数据库,MIB管理的对象,就是树的端节点,每个节点都有唯一位置和唯一名字。IETF规定管理信息库对象识别符(OID,Object Identifier)唯一指定,其命名规则就是父节点的名字作为子节点名字的前缀。

-SNMP协议,定义了网络管理者如何对代理进程的MIB对象进行读写操作,操作包括:GET、SET、GETNEXT和Trap等操作,用于管理站和代理之间的通信。

SNMP是管理进程(NMS)和代理进程(Agent)之间的通信协议。它规定了在网络环境中对设备进行监视和管理的标准化管理框架、通信的公共语言、相应的安全和访问控制机制。网络管理员使用SNMP功能可以查询设备信息、修改设备的参数值、监控设备状态、自动发现网络故障、生成报告等。

SNMP具有以下技术优点

基于TCP/IP互联网的标准协议,传输层协议一般采用UDP。

自动化网络管理。网络管理员可以利用SNMP平台在网络上的节点检索信息、修改信息、发现故障、完成故障诊断、进行容量规划和生成报告。

屏蔽不同设备的物理差异,实现对不同厂商产品的自动化管理。SNMP只提供最基本的功能集,使得管理任务与被管设备的物理特性和实际网络类型相对独立,从而实现对不同厂商设备的管理。

简单的请求—应答方式和主动通告方式相结合,并有超时和重传机制。

报文种类少,报文格式简单,方便解析,易于实现。

SNMPv3版本提供了认证和加密安全机制,以及基于用户和视图的访问控制功能,增强了安全性。

注意:在使用SNMP协议与设备进行通信,前提记得开启设备对于SNMP协议的支持。

代码示例

引入依赖

<dependency>
    <groupId>org.snmp4j</groupId>
    <artifactId>snmp4j</artifactId>
    <version>2.7.0</version>
</dependency>

https://mvnrepository.com/artifact/org.snmp4j/snmp4j
目前最新版本3.8.2,目前以2.7.0版本为例。

基础OID工具类

import java.math.BigDecimal;

/**
 * snmp协议工具类配置文件
 */
public class SnmpConfig
{
    private SnmpConfig(){}

    /**
     * get cpu描述信息
     */
    public static final String SNMPGET_CPUDESC=".1.3.6.1.2.1.1.1.0.255.1";

    /**
     * walk 网络接口描述
     */
    public static final String SNMPWALK_IFDESCR=".1.3.6.1.2.1.2.2.1.2";

    /**
     * walk 接口物理地址
     */
    public static final String SNMPWALK_IFPHYSADDRESS=".1.3.6.1.2.1.2.2.1.6";

    /**
     * get IO负载
     */
    public static final String SNMPGET_IOLOAD=".1.3.6.1.2.1.1.1.0.255.0";

    /**
     * 硬盘大小
     */
    public static final String SNMPGET_DSKTOTAL=".1.3.6.1.4.1.2021.9.1.6";

    /**
     * walk cpu 负载
     */
    public static final String SNMPWALK_HRPROCESSLOAD=".1.3.6.1.2.1.25.3.3.1.2";

    /**
     * walk cpu 空闲率
     */
    public static final String SNMPWALK_SSCPUIDLE=".1.3.6.1.4.1.2021.11.11.0";

    /**
     * walk 存储设备描述
     */
    public static final String SNMPWALK_HRSTORAGEDESCR=".1.3.6.1.2.1.25.2.3.1.3";
    /**
     * walk 存储设备描述
     */
    public static final String SNMPWALK_AHU=".1.3.6.1.2.1.25.2.3.1.4";
    /**
     * walk 存储设备描述
     */
    public static final String SNMPWALK_AUR=".1.3.6.1.2.1.25.2.3.1.5";

    /**
     *walk 存储设备使用大小
     * 内存使用多少,跟总容量相除就是占用率
     */
    public static final String SNMPWALK_HRSTORAGEUSED=".1.3.6.1.2.1.25.2.3.1.6";
    /**
     *walk 内存占用
     * 各个进程占用的内存
     */
    public static final String SNMPWALK_MEMORY_WIN=".1.3.6.1.2.1.25.5.1.1.2";

    /**
     *walk 存储设备使用率
     *
     */
    public static final String SNMPWALK_DSKPERCENT=".1.3.6.1.4.1.2021.9.1.9";

    /**
     * get 获取内存大小
     */
    public static final String SNMPGET_HRMEMORYSIZE=".1.3.6.1.2.1.25.2.2.0";

    /**
     * 获取机器名
     */
    public static final String SNMPWALK_SYSNAME=".1.3.6.1.2.1.1.5";

    /**
     * 性能参数ID-cpu使用率
     */
    public static final Integer PERFORMANCE_PARAM_CPUUSAGE=1;

    /**
     * 性能参数ID-内存使用率
     */
    public static final Integer PERFORMANCE_PARAM_MEMORYUSAGE=2;

    /**
     * 性能参数ID-io带宽占用率
     */
    public static final Integer PERFORMANCE_PARAM_IOUSAGE=3;

    /**
     * decimal 类型1024,用于除法计算
     */
    public static final BigDecimal DEVIDE_NUM=new BigDecimal("1024");

    /**
     * get方式获取内存大小
     */
    public static final String GET_MEMORY="1.3.6.1.2.1.25.2.2.0";

    /**
     * 获取系统描述
     */
    public static final String SYS_DSC="1.3.6.1.2.1.1.1.0";

    /**
     * 获取网络接口数量
     */
    public static final String IF_NUM="1.3.6.1.2.1.2.1.0";

    /**
     * 获取cpu核数
     */
    public static final String CPU_NUM="1.3.6.1.2.1.25.3.3.1.2";

}

SNMP信息采集工具类

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.List;

/**
 * snmp协议工具类
 * 获取服务器cpu,内存,及硬盘占用
 */
public class SnmpUtil
{
    private static     Logger          logger = LogManager.getLogger(SnmpUtil.class);
    private static Snmp            snmp   = null;
    private        CommunityTarget target;
    @SuppressWarnings("squid:S3010")
    public SnmpUtil(String intranetDeviceIp, Integer snmpPort) throws IOException
    {
        if (snmp == null)
        {
            snmp = new Snmp(new DefaultUdpTransportMapping());
            snmp.listen();
        }
        //初始化CommunityTarget
        target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setVersion(SnmpConstants.version2c);
        target.setAddress(new UdpAddress(intranetDeviceIp + "/" + snmpPort));
        target.setTimeout(1000);
        target.setRetries(1);
    }

    private ResponseEvent snmpGet(String oid)
    {
        PDU pdu = new PDU();
        pdu.addOID(new VariableBinding(new OID(oid)));
        ResponseEvent re=null;
        try
        {
            re = snmp.get(pdu, target);
        }catch (Exception e){
            logger.info("snmpGet 异常"+e.getMessage());
        }
        return re;
    }

    private List<TableEvent> snmpWalk(String oid)
    {
        TableUtils           utils      = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK));
        OID[] columnOid = new OID[]{new OID(oid)};
        return utils.getTable(target, columnOid, null, null);
    }

    /**
     * 获取cpu负载
     * @return
     */
    public BigDecimal getCpuUsage()
    {
        List<TableEvent> list  = snmpWalk(SnmpConfig.SNMPWALK_HRPROCESSLOAD);
        BigDecimal            usage = new BigDecimal("0");
        for (TableEvent tableEvent : list)
        {
            try
            {
                String s=tableEvent.toString().split("=")[3].split("]")[0].trim();
                if (!"-4,exception".equals(s)){
                    usage=usage.add(new BigDecimal(tableEvent.toString().split("=")[3].split("]")[0].trim()));
                }else {
                    return new BigDecimal("-1");
                }
            }
            catch (Exception e)
            {
                logger.info("获取cpu负载失败"+e.getMessage());
                return new BigDecimal("-1");
            }
        }
        usage = usage.divide(new BigDecimal(list.size()),2,BigDecimal.ROUND_HALF_UP);
        return usage;
    }

    /**
     * 获取cpu使用率
     * @return
     */
    public BigDecimal getCpu()
    {
        BigDecimal    totalSize;
        ResponseEvent responseEvent = snmpGet(SnmpConfig.SNMPWALK_SSCPUIDLE);
        if(responseEvent!=null&&responseEvent.getResponse()!=null){
            totalSize=new BigDecimal(responseEvent.getResponse().toString().split("=")[4].split("]")[0].trim());
        }else {
            return new BigDecimal("-1");
        }
        return new BigDecimal("100").subtract(totalSize);
    }

    /**
     * 获取磁盘占用率
     * @return
     */
    public BigDecimal getDiskUsageForWindows()
    {
        BigDecimal multiply=new BigDecimal("-1");
        try
        {
            BigDecimal diskSize = getDiskSize();
            BigDecimal diskUsed = getDiskUsed();
            if (BigDecimal.ZERO.compareTo(diskSize)<0&&BigDecimal.ZERO.compareTo(diskUsed)<0){
                multiply = getDiskUsed().divide(getDiskSize(), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100));
            }
        }catch (Exception e){
            logger.info("获取windows磁盘占用异常"+e.getMessage());
        }

        return multiply;
    }
    /**
     * 获取磁盘占用率
     * @return
     */
    public BigDecimal getDiskUsage()
    {
        BigDecimal totalSize=null;
        //org.snmp4j.util.TableEvent[index=null,vbs=null,status=-1,exception=null,report=null]
        List<TableEvent> tableEvents = snmpWalk(SnmpConfig.SNMPWALK_DSKPERCENT);
        if(tableEvents.isEmpty()){
            totalSize = getDiskUsageForWindows();
            return totalSize;
        }
        for(int i=0;i<tableEvents.size();i++){
            if ("-1,exception".equals(tableEvents.get(i).toString().split("=")[3].split("]")[0].trim())){
                return  new BigDecimal("-1");
            }
            String s=tableEvents.get(i).toString().split("=")[3].split("]")[0].trim();
            if (!"-4,exception".equals(s)){
                totalSize= new BigDecimal(tableEvents.get(i).toString().split("=")[3].split("]")[0].trim());
            }else {
                return new BigDecimal("-1");
            }
        }

        return totalSize;
    }

    /**
     * 获取内存使用率
     * @return
     */
    public BigDecimal getMemoryUsage(){
        BigDecimal usage;
        BigDecimal totalSize;
        try
        {
            ResponseEvent event = snmpGet(SnmpConfig.SNMPGET_HRMEMORYSIZE);
            if (event != null && event.getResponse() != null)
            {
                totalSize = new BigDecimal(event.getResponse().toString().split("=")[4].split("]")[0].trim());
                usage = getMemoryUsed();
                return usage.multiply(new BigDecimal("100")).divide(totalSize, 0, BigDecimal.ROUND_HALF_UP);
            }
            else
            {
                return new BigDecimal("-1");
            }
        }catch (Exception e){
            logger.info("获取内存使用率失败"+e.getMessage());
            return new BigDecimal("-1");
        }
    }


    /**
     * 获取内存已使用
     * @return
     */
    public BigDecimal getMemoryUsed(){
        List<TableEvent> list=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEDESCR);
        int index=0;
        BigDecimal usedMemory=new BigDecimal("0");
        for(int i=0;i<list.size();i++){
            String trim = list.get(i).toString().split("=")[3].split("]")[0].trim();
            if(trim.contains("Physical memory")){
                //linux系统
                index=i;
                List<TableEvent> usedList=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED);
                usedMemory= new BigDecimal(usedList.get(index).toString().split("=")[3].split("]")[0].trim());
            }else if (trim.contains("Physical Memory")){
                //windows系统
                List<TableEvent> list1=snmpWalk(SnmpConfig.SNMPWALK_MEMORY_WIN);
                BigDecimal re=new BigDecimal("0");
                for (int j=0;j<list1.size();j++){
                    String trim1 = list1.get(j).toString().split("=")[3].split("]")[0].trim();
                    BigDecimal b = new BigDecimal(trim1);
                    re=re.add(b);
                }
                return re;
            }else  if(trim.contains("Memory buffers")){
                //linux系统
                index=i;
                List<TableEvent> usedList=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED);
                usedMemory= usedMemory.subtract(new BigDecimal(usedList.get(index).toString().split("=")[3].split("]")[0].trim()));
            }else  if(trim.contains("Cached memory")){
                //linux系统
                index=i;
                List<TableEvent> usedList=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED);
                usedMemory= usedMemory.subtract(new BigDecimal(usedList.get(index).toString().split("=")[3].split("]")[0].trim()));
            }
        }
        return usedMemory;

    }

    /**
     * 获取磁盘
     * @return
     */
    public BigDecimal getDiskSize(){
        List<TableEvent> list=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEDESCR);
        BigDecimal diskSize=new BigDecimal(-1);
        if (!list.isEmpty()){
            diskSize=new BigDecimal("0");
            List<TableEvent> usedList1=snmpWalk(SnmpConfig.SNMPWALK_AHU);
            List<TableEvent> usedList2=snmpWalk(SnmpConfig.SNMPWALK_AUR);
            for(int i=0;i<list.size();i++){
                boolean re=list.get(i).toString().split("=")[3].split("]")[0].trim().contains(":")||list.get(i).toString().split("=")[3].split("]")[0].trim().contains("/");
                if(re){
                    diskSize=diskSize.add(new BigDecimal(usedList1.get(i).toString().split("=")[3].split("]")[0].trim()).multiply(new BigDecimal(usedList2.get(i).toString().split("=")[3].split("]")[0].trim())).divide(new BigDecimal("1073741824"),2,BigDecimal.ROUND_HALF_UP));
                }
            }
        }
        return diskSize;
    }

    /**
     * 获取磁盘已使用
     * @return
     */
    public BigDecimal getDiskUsed(){
        List<TableEvent> list=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEDESCR);
        BigDecimal diskSize=new BigDecimal(-1);
        if (!list.isEmpty()){
            diskSize=new BigDecimal("0");
            List<TableEvent> usedList1=snmpWalk(SnmpConfig.SNMPWALK_AHU);
            List<TableEvent> usedList2=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED);
            for(int i=0;i<list.size();i++){
                boolean re=list.get(i).toString().split("=")[3].split("]")[0].trim().contains(":")||list.get(i).toString().split("=")[3].split("]")[0].trim().contains("/");
                if(re){
                    diskSize=diskSize.add(new BigDecimal(usedList1.get(i).toString().split("=")[3].split("]")[0].trim()).multiply(new BigDecimal(usedList2.get(i).toString().split("=")[3].split("]")[0].trim())).divide(new BigDecimal("1073741824"),2,BigDecimal.ROUND_HALF_UP));
                }
            }
        }
        return diskSize;
    }

    /**
     * 获取IO负载
     * @return
     */
    public Float getIOUsage(){
        ResponseEvent event=snmpGet(SnmpConfig.SNMPGET_IOLOAD);
        if(event!=null&&event.getResponse()!=null){
            float usage=Float.parseFloat(event.getResponse().toString().split("=")[4].split("]")[0].trim());
            if(usage>1){
                return usage;
            }else{
                return usage*100;
            }
        }
        return null;
    }

    /**
     * 获取性某性能参数数据
     * @param parameterId
     * @return
     */
    public Object getData(Integer parameterId) {
        Object data=null;
        try{
            if(parameterId.equals(SnmpConfig.PERFORMANCE_PARAM_CPUUSAGE)){
                data=getCpuUsage();
            }else if(parameterId.equals(SnmpConfig.PERFORMANCE_PARAM_MEMORYUSAGE)){
                data=getMemoryUsage();
            }else if(parameterId.equals(SnmpConfig.PERFORMANCE_PARAM_IOUSAGE)){
                data=getIOUsage();
            }
        }catch(Exception e){
            logger.info("获取性能参数异常"+e.getMessage());
        }
        return data;
    }

    /**
     * 获取设备物理地址
     * @return
     */
    public String getMacAddress(){
        try
        {
            List<TableEvent> list  = snmpWalk(SnmpConfig.SNMPWALK_IFDESCR);
            int              index = 0;
            for (int i = 0; i < list.size(); i++)
            {
                if (list.get(i).toString().split("=")[3].split("]")[0].trim().contains("eth"))
                {
                    index = i;
                }
            }
            List<TableEvent> ifAddressList = snmpWalk(SnmpConfig.SNMPWALK_IFPHYSADDRESS);
            return ifAddressList.get(index).toString().split("=")[3].split("]")[0].trim();
        }catch (Exception e){
            logger.info("获取物理地址失败"+e.getMessage());
            return "failure";
        }
    }

    /**
     * 获取设备内存大小  单位为GB
     * @return
     */
    public String getMemoryDesc() {
        ResponseEvent event         =snmpGet(SnmpConfig.SNMPGET_HRMEMORYSIZE);
        Long          bytes         =Long.parseLong(event==null?"0":event.getResponse().toString().split("=")[4].split("]")[0].trim());
        float         gb            =bytes/1024.0f/1024.0f;
        DecimalFormat decimalFormat =new DecimalFormat(".00");
        return decimalFormat.format(gb)+"GB";
    }

    /**
     * @throws IOException
     * 获取cpu描述信息
     * @return
     */
    public String getCpuDesc() throws IOException {
        ResponseEvent event=snmpGet(SnmpConfig.SNMPGET_CPUDESC);
        return event==null? "":event.getResponse().toString().split("=")[4].split("]")[0].trim().split(":")[1].trim();
    }

    /**
     * 获取存储设备大小 (空盘空间不足百分百)
     * @param deviceCode
     * @return
     */
    public BigDecimal getDiskSize(String deviceCode){

        List<TableEvent> list = snmpWalk(SnmpConfig.SNMPGET_DSKTOTAL);
        BigDecimal diskSize=new BigDecimal(-1);
        if (list!=null){
            try
            {
                for (TableEvent tableEvent:list){
                    diskSize=new BigDecimal(tableEvent.toString().split("=")[3].split("]")[0].trim()).divide(SnmpConfig.DEVIDE_NUM).divide(SnmpConfig.DEVIDE_NUM,2,RoundingMode.HALF_UP);
                }
            }catch (Exception e){
                logger.info("获取磁盘大小失败"+e.getMessage());
            }
        }
        if (BigDecimal.ZERO.compareTo(diskSize)>0){
            diskSize = getDiskSize();
        }
        return diskSize;
    }



    /**
     * 获取磁盘描述
     * @param deviceCode
     * @return
     * @throws IOException
     */
    public BigDecimal getDiskDesc(String deviceCode) {
        return getDiskSize(deviceCode).divide(SnmpConfig.DEVIDE_NUM,2,RoundingMode.HALF_UP).divide(SnmpConfig.DEVIDE_NUM,2,RoundingMode.HALF_UP);
    }

    /**
     * snmp协议检测
     */
    public boolean snmpCheck() {
        ResponseEvent re=snmpGet(".1.3.6.1.4.1.2021.255.1");
        return re == null || re.getResponse() != null;
    }

    /**
     * 获取机器名
     * @return
     */
    public String getSysName(){
        String name=null;
        try{
            List<TableEvent> list = snmpWalk(SnmpConfig.SNMPWALK_SYSNAME);
            if (list!=null){
                for (TableEvent tableEvent:list){
                    name=(tableEvent.toString().split("=")[3].split("]")[0].trim());
                }
            }
        }catch (Exception e){
            logger.info("获取机器名失败"+e.getMessage());
        }
        return name;
    }

    /**
     * 获取内存总大小(实际值)
     * @return
     */
    public BigDecimal getMemoryTotalSize(){
        try
        {
            ResponseEvent event = snmpGet(SnmpConfig.GET_MEMORY);
            if (event!=null&&event.getResponse()!=null){
                String trim = event.getResponse().toString().split("=")[4].split("]")[0].trim();
                return new BigDecimal(trim).divide(SnmpConfig.DEVIDE_NUM,2, RoundingMode.HALF_UP).divide(SnmpConfig.DEVIDE_NUM,2, RoundingMode.HALF_UP);
            }else {
                throw new RuntimeException("获取内存信息失败");
            }
        }
        catch (Exception e)
        {
            logger.info("获取内存总大小失败"+e.getMessage());
        }
        return new BigDecimal("-1");
    }

    /**
     * 获取系统描述
     * @return
     */
    public String getSysDsc(){
        try
        {
            ResponseEvent event = snmpGet(SnmpConfig.SYS_DSC);
            if (event!=null&&event.getResponse()!=null){
                return event.getResponse().toString().split("=")[4].split("]")[0].trim();
            }else {
                throw new RuntimeException("获取系统描述信息失败");
            }
        }
        catch (Exception e)
        {
            logger.info("获取系统描述信息失败"+e.getMessage());
        }
        return "failure";
    }
    /**
     * 获取接口数
     * @return
     */
    public Integer getIfNumber(){
        try
        {
            ResponseEvent event = snmpGet(SnmpConfig.IF_NUM);
            if (event!=null&&event.getResponse()!=null){
                String trim = event.getResponse().toString().split("=")[4].split("]")[0].trim();
                return Integer.parseInt(trim);
            }else {
                throw new RuntimeException("获取接口信息失败");
            }
        }
        catch (Exception e)
        {
            logger.info("获取接口数量失败"+e.getMessage());
        }
        return -1;
    }

    /**
     * 获取cpu核数(n个cpu有n条数据)
     * @return
     */
    public Integer getCpuNum(){
        List<TableEvent> list = snmpWalk(SnmpConfig.CPU_NUM);
        Integer num=-1;
        if (list!=null){
                num=list.size();
        }
        return num;
    }


    public static void main(String[] args) throws IOException
    {
        String   snmpIp   = "127.0.0.1";
        Integer  snmpPort = 161;
        SnmpUtil snmpUtil = new SnmpUtil(snmpIp, snmpPort);

        System.out.println("机器名称"+snmpUtil.getSysName());
        System.out.println("磁盘大小 "+ snmpUtil.getDiskSize("devide"));
        System.out.println("物理地址"+snmpUtil.getMacAddress());
        System.out.println("cpu "+snmpUtil.getCpuUsage());
     }
 }
03-08
### SNMP协议介绍 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于管理系统节点的标准协议,这些节点可以是服务器、工作站、路由器或其他任何连接到TCP/IP网络的设备。通过该协议可获取有关被管对象的信息并对其进行配置。 #### 协议版本演进 SNMP协议经历了几个主要版本的发展: - **SNMPv1**:最早的版本,在安全性上存在不足之处。 - **SNMPv2c**:在功能上有一定增强,但仍沿用了社区字符串作为认证方式,因此也存在一定安全隐患[^1]。 - **SNMPv3**:针对前两个版本的安全缺陷进行了大幅改进,增加了基于用户的认证模式以及数据加密等功能,极大地提高了通信过程中的安全性。 鉴于此,当前环境下建议优先选用SNMPv3来保障网络安全性能[^2]。 ### 应用场景 作为一个广泛应用的技术标准,SNMP对于构建高效稳定的互联网基础设施有着不可替代的作用。它不仅支持基本的状态监测,还能执行远程控制命令,从而简化了大规模分布式系统的运维工作量。具体来说,其应用场景包括但不限于以下几个方面[^3]: - 实时监控网络流量状况; - 自动化硬件资源调配; - 故障预警与快速响应处理; - 配置变更跟踪记录; 为了使上述操作得以顺利实施,需确保目标设备已启用对SNMP的支持,并正确设置了访问权限等相关参数[^4]。 ```xml <dependency> <groupId>org.snmp4j</groupId> <artifactId>snmp4j</artifactId> <version>2.7.0</version> </dependency> ``` 以上XML片段展示了如何利用Maven项目结构引入`Snmp4J`库以便于后续开发过程中调用SNMP接口函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值