Java通过SNMP4J管理设备

news2024/11/27 12:56:16

一、Windows开启SNMP服务

这里以Windows11为例:

1、安装SNMP服务

(1)通过win+x快捷键打开电脑“设置”,然后在“应用”中选择”可选功能“。

(2)点击”可选功能“的”查看功能“

(3)找到并勾选“WMI SNMP 供应商",再点击”下一步“。这里借用下百度的图,因为本人已经安装好。

(4)安装”WMI SNMP 供应商",再点击“安装”,最后等待安装完成即可。

(5)安装完之后即可看到。

至此,SNMP已经安装完毕。接下来就是做一些基础配置,这样才能真正的通过Java代码获取到设备的信息。

2、配置SNMP服务

(1)打开服务,找到SNMP。

(2)双击SNMP服务,选择“安全”。然后配置社区名称和接收哪些主机的SNMP报文,如下图所示。

至此,SNMP的配置彻底完成。接下来要做的就是通过代码获取设备信息。

二、代码实现

(1)引入SNMP4J的jar包

如果是Maven工程,直接引入依赖。

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

如果是在IDEA的lib目录下引入jar包,则先将下载的jar包放入lib目录下,然后选中jar包,右键选择Add as Library即可。

这里给出maven的网址:https://mvnrepository.com/

对于一些jar包的下载,也可以通过该网址去下载。

(2)代码实现

只要和其他电脑在同一个局域网,并且其他电脑开启了SNMP服务,那么就可以通过更改IP地址,实现对与之相连的局域网内的所有主机的信息的获取。而通过更改不同的OID,就可以实现对主机的其他信息的获取。

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;

import java.io.IOException;

/**
 * 获取设备信息
 *
 * @author zengLingYao
 * @date 2021/12/02
 */
public class Test {
    /**
     * 获取系统基本信息
     */
    public final static String SYS_DESC = "1.3.6.1.2.1.1.1";
    /**
     * 获取机器名
     */
    public final static String SYS_NAME = "1.3.6.1.2.1.1.5";
    /**
     * 监控时间
     */
    public final static String SYS_UPTIME = "1.3.6.1.2.1.1.3";

    public static void main(String[] args) {
        try {
            System.out.println("基本信息:"+getMessageByIpAndOid("192.168.1.111",SYS_DESC));
            System.out.println("获取机器名:"+getMessageByIpAndOid("192.168.1.111",SYS_NAME));
            System.out.println("监控时间:"+getMessageByIpAndOid("192.168.1.111",SYS_UPTIME));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static String getMessageByIpAndOid(String ip, String oid) throws Exception{
        String variableString = "";
        try{
            //设定CommunityTarget
            CommunityTarget myTarget = new CommunityTarget();
            //机器的地址
            Address address = GenericAddress.parse("udp:"+ip+"/161");
            //设定地址
            myTarget.setAddress(address);
            //设置snmp共同体
            myTarget.setCommunity(new OctetString("public"));
            //设置超时重试次数
            myTarget.setRetries(2);
            //设置超时的时间
            myTarget.setTimeout(5*60);
            //设置使用的snmp版本
            myTarget.setVersion(SnmpConstants.version2c);
            //设定采取的协议
            TransportMapping<UdpAddress> transport = new DefaultUdpTransportMapping();
            //调用TransportMapping中的listen()方法,启动监听进程,接收消息,由于该监听进程是守护进程,最后应调用close()方法来释放该进程
            transport.listen();
            //创建SNMP对象,用于发送请求PDU
            Snmp protocol = new Snmp(transport);
            //创建请求pdu,获取mib
            PDU request = new PDU();
            //调用的add方法绑定要查询的OID
            request.add(new VariableBinding(new OID(oid)));
            //调用setType()方法来确定该pdu的类型
            request.setType(PDU.GETNEXT);
            //调用 send(PDU pdu,Target target)发送pdu,返回一个ResponseEvent对象
            ResponseEvent responseEvent = protocol.send(request, myTarget);
            //通过ResponseEvent对象来获得SNMP请求的应答pdu,方法:public PDU getResponse()
            PDU response=responseEvent.getResponse();
            //输出
            if(response != null){
                //通过应答pdu获得mib信息(之前绑定的OID的值),方法:VaribleBinding get(int index)
                VariableBinding vb = response.get(0);
                System.out.println(vb);
                variableString = String.valueOf(vb.getVariable());
                //调用close()方法释放该进程
                transport.close();
            }

        }catch(IOException e){
            e.printStackTrace();
        }
        return variableString;
    }

}

执行结果如下:

以上就是整个的配置和代码获取的过程。还有一个注意点就是:如果是局域网内的设备信息采集,需要将管理站的信息配置在SNMP服务的IP地址列表中,如下图:

管理站即运行代码的电脑的IP地址是:192.168.1.101,而被管理站的IP地址是192.168.1.111.因此在被管理站的SNMP服务中配置了管理站的IP地址。

也可以直接将被管理站的SNMP服务直接设置为“接受来自任何主机的SNMP数据包”,如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/364587.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】sql中explain解释和应用

这里写目录标题学习原因MySQL中explain的使用和用法解释explain的使用explain 运行结果的意义文字展示表格展示参考资料&#xff1a;结束语学习原因 在对sql的优化过程中使用了explain对指定的sql进行查看它的运行效果&#xff0c;以便找出sql的性能特点并进行优化 MySQL中ex…

20230222解决在WIN7下的UltraEdit9不能新建文件但是可以打开TXT文件

20230222解决在WIN7下的UltraEdit9不能新建文件但是可以打开TXT文件 2023/2/22 17:34 UltraEdit-32 Cannot edit file Cant create tempory file 确定 解决方式&#xff1a; C:\Users\Administrator\AppData\Local\Temp目录下的内容清除即可。 Temp文件夹竟然写满了&#xff…

Python进阶知识

目录 一、装饰器和闭包 1、装饰器 decorator 2、闭包 closure 二、迭代器与生成器 二、面向对象编程 1、概念 2、类和对象 2.1 概念 2.2 定义类和创建对象 2.3 __init__(self): 2.4 self的理解 3、魔术方法 3.1__str__() 3.2 __new__() 4、析构方法 5、类的继…

在CentOS-7.9配置vsftpd服务

文章目录一 vsftpd简介二 环境准备三 服务部署3.1 安装软件3.2 编写配置文件3.3 用户授权3.4 启动服务3.5 文件传输测试3.5.1 Windows到Linux3.5.2 filezilla3.5.3 从Linux到Linux一 vsftpd简介 FTP是 File Transfer Protocol 文件传输协议的简称。 VSFTP是 Very Security FTP…

【QT】史上最全最详细的QSS样式表用法及用例说明

目录1. Qt样式表语法2. 选择器2.1 可设置样式的部件2.2 选择器类型2.3 子控件2.4 伪状态3. 属性列表4. 冲突解决5. qss示例1. Qt样式表语法 Qt样式表支持各种属性、伪状态和子控件&#xff0c;可以自定义小部件的外观。 selector { attribute: value }selector:选择器&#xf…

Android Gradle 学习笔记(四)构建块基本单元掌握

本篇主要学习 Gradle 构建脚本的三个基本组建成&#xff1a; project 项目task 任务property 属性 我将会重点介绍 Task&#xff0c;因为它是所有基础中的基础&#xff0c; project 的知识更多和实战有关&#xff08;例如模块化&#xff09;&#xff0c;而 property 本身不过…

新手怎么快速学会并上手SQL语言?收藏版

SQL可以说是程序员、数据库管理员DBA、数据分析师等需要做数据处理和分析岗位最常用的程序语言了。 尤其是一些岗位&#xff0c;工作中并非以数据库为核心&#xff0c;只是偶尔用些数据不需要深度学习&#xff0c;不得不自己去做一些取数的事情&#xff0c;只要学会通过SQL取数…

PS_高低频和中性灰——双曲线

高低频 高低频磨皮&#xff1a;把皮肤分成两个图层&#xff0c;一层是纹理层也就是皮肤的毛孔。 一层是皮肤光滑层没有皮肤细节。 高频”图层为细节层&#xff0c;我们用图章工具修高频 “低频”图层为颜色层&#xff0c;我们用混合画笔修低频 原理&#xff1a;修颜色亮度光影…

用户投稿——详解我了解的 TDengine 以及它所在的时序数据库“战场”

作者&#xff1a;大数据模型本篇文章出自 2022 年“用 TDengine&#xff0c;写 TDengine”征文投稿活动。因为工作的关系&#xff0c;最近几年我接触到过各种国产数据库&#xff0c;唯独对 TDengine 念念不忘。在众多数据库中&#xff0c;TiDB 一枝独秀&#xff0c;OceanBase 出…

渗透中超全的Google hack语法

inurl:Login 将返回url中含有Login的网页intitle:后台登录管理员 将返回含有管理员后台的网页intext:后台登录 将返回含有后台的网页inurl:/admin/login.php 将返回含有admin后台的网页inurl:/phpmyadmin/index.php 将返回含有phpmyadmin后台的网页site:http://baidu.com inur:…

OpenStack手动分布式部署Keystone【Queens版】

目录 Keystone简介 1、登录数据库配置&#xff08;在controller执行&#xff09; 1.1登录数据库 1.2数据库里创建keystone 1.3授权对keystone数据库的正确访问 1.4退出数据库 2、数据库导入Keystone表&#xff08;在controller执行&#xff09; 2.1安装httpd mod_wsgi 2.2备…

nn.Conv2d与nn.Conv3d介绍

nn.Conv2d 1&#xff09;输入的维度为&#xff1a; 2&#xff09;输出的维度为&#xff1a; 其中&#xff0c;Cout是由参数out_channels&#xff08;(int) – 卷积产生的通道数&#xff09;决定。 Hout和Wout计算如下&#xff1a; 3&#xff09;在池化层的计算&#xff1a; …

Windows服务器使用cwRsync实现同步

软件分为客户端和服务器端 实现目的&#xff1a;将服务端C:\tongbu目录中的文件定时同步到客户端C:\target目录中去。 cwRsyncServer&#xff08;服务端&#xff09;配置步骤 1.双击运行wRsyncServer_4.1.0_Installer.exe。 2.这里创建的账户是操作系统的&#xff0c;创建的…

canvas初体验

canvas介绍 Canvas 最初由Apple于2004 年引入&#xff0c;用于Mac OS X WebKit组件&#xff0c;为仪表板小部件和Safari浏览器等应用程序提供支持。后来&#xff0c;它被Gecko内核的浏览器&#xff08;尤其是Mozilla Firefox&#xff09;&#xff0c;Opera和Chrome实现&#x…

webpack实现静态资源缓存

一、配置缓存 我们使用 webpack 来打包我们的模块化后的应用程序&#xff0c;webpack 会生成一个可部署的/dist目录&#xff0c;然后把打包后的内容放置在此目录中。只要/dist目录中的内容部署到 server 上&#xff0c;client&#xff08;通常是浏览器&#xff09;就能够访问此…

OKR之剑·总结篇01:如何开好一场OKR复盘会

作者&#xff1a;vivo 互联网平台产品研发团队 本文是《OKR 之剑》系列之总结第 1 篇—— OKR复盘是OKR生命周期中的重要环节&#xff0c;起着承上启下的重要作用。本篇将和你一起探讨什么是OKR复盘、为什么要进行OKR复盘&#xff0c;接着向你展示团队在OKR复盘方面的实践和改…

【MyBatis】代理开发核心配置文件介绍(二)

&#x1f697;MyBatis学习第二站站~ &#x1f6a9;起始站&#xff1a;MyBatis概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;数据库学习之旅 &#x1f44d;希望您能有所收获 一.Mapper代理开发 (1) 引入 在上一篇中我们有提到一点&#xff0c;MyBatis可以…

Linux原来是这么管理内存的(最透彻的一篇)

Linux 内存管理模型非常直接明了&#xff0c;因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux&#xff0c;下面我们就来认识一下 Linux 内存管理是如何实现的。 基本概念 每个 Linux 进程都会有地址空间&#xff0c;这些地址空间由三…

堆的概念和结构以及堆排序

前言 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储&#xff0c;需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事&#xff0c…

Sofa-jraft的Rpc调用服务端分析

在sofa-jraft中&#xff0c;关于RPC的服务端是RpcServer在RpcServer中的init方法中&#xff1a;初始化了连接事件监听器&#xff0c;这个里面就是一个map&#xff0c;然后可以添加事件监听的处理器&#xff0c;初始化userProcessors, codec 是一个编码和解码器的工厂&#xff0…