IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java使用-Snmp4j接口-操作SNMP简单网路协议 -> 正文阅读

[Java知识库]Java使用-Snmp4j接口-操作SNMP简单网路协议

Java使用-Snmp4j接口-操作SNMP简单网路协议

前言:这篇文章实现了 查询单个OID 和 同时查询多个OID。
如有错误或建议,非常感谢提出。

需要接口帮助文档可在我的资源中自行下载。

SpringBoot操作Snmp

1. 导入依赖

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

2. 认识主要的类和接口

2.1、Snmp类

? 该类是Snmp4j核心类,负责Snmp报文的接收个发送。它提供了发送和接收PDU的方法,所有的PDU类型都可以采用同步或者异步的方式被发送。

2.2、PDU类和ScopedPDU类

? 该类是Snmp报文单元的抽象,其中PDU类适用于SNMPv1和SNMPv2c。ScopedPdu\DU类继承于PDU类,适用于SNMPv3。

2.3、Target接口和CommunityTarget类以及UserTarget类

? 对应于SNMP代理的地址信息,包括IP地址和端口号(161)。其中Target接口适用于SNMPv1和SNMPv2c。CommunityTarget类实现了Target接口,用于SNMPv1和SNMPv2c这两个版本,UserTarget类实现了Target接口,适用于SNMPv3。

2.4、TransportMapping接口

? 该接口代表了Snmp4j所使用的传输协议。这也是Snmp4j一大特色的地方。按照PFC的规定,Snmp是只使用UDP作为传输层协议的。而Snmp4j支持管理端和代理端使用UDP或者TCP进行传输,该连接由两个子接口。

2.5、Snmp、Target、PDU之间的关系

Target代表远程设备或者远程实体,PDU代表管理端同Target通信的数据,Snmp就代表管理者管理功能(起始就是数据的收发)的具体执行者。

举个栗子:Target就是你远方的恋人,PDU就是你们之间传递的情书,而Snmp就是负责帮你寄信收信的邮差。

3.Snmp4j的两种消息发送模式

SNMP4J支持两种消息发送模式:同步发送模式和异步发送模式。

同步发送模式也称阻塞模式。当管理端发送出一条消息之后,线程会被阻塞,直到收到对方的回应或者时间超时。同步发送模式编程较为简单,但是不适用于发送广播消息。

异步发送模式也称非阻塞模式。当程序发送一条消息之后,线程将会继续执行,当收到消息的回应的时候,程序会对消息作出相应的处理。要实现异步发送模式,需要实例化一个实现了ResponseListener接口的类的对象。ResponseListener接口中有一个名为onResponse的函数。这是一个回调函数,当程序收到响应的时候,会自动调用该函数。由该函数完成对响应的处理。

4.简单的代码实现

package com.example.util;

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.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;

import java.io.IOException;
import java.util.List;

public class Snmp4jUtil {
    public static final int DEFAULT_VERSION = SnmpConstants.version2c;
    public static final String DEFAULT_PROTOCOL = "udp";
    public static final int DEFAULT_PORT = 161;
    public static final long DEFAULT_TIMEOUT = 3 * 1000L;
    public static final int DEFAULT_RETRY = 3;

    /**
     * 创建对象 CommunityTarget,用于返回 target
     * */
    public static CommunityTarget createDefault(String ip,String community){
        //生成目标地址对象
        Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip + "/" + DEFAULT_PORT);  // 例:udp:192.168.47.140/161
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString(community));
        target.setAddress(address);
        target.setVersion(DEFAULT_VERSION);
        target.setTimeout(DEFAULT_TIMEOUT);
        target.setRetries(DEFAULT_RETRY);
        return target;
    }

    /**
     * 根据OID获取单条数据
     * */
    public static void snmpGet(String ip,String community,String oid) throws IOException {
        CommunityTarget target = createDefault(ip, community);

        Snmp snmp = null;
        try{
            PDU pdu = new PDU();
            pdu.add(new VariableBinding(new OID(oid)));
            //明确SNMP在传输层所使用的协议
            DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
            snmp = new Snmp(transport);
            //开始监听SNMP消息
            snmp.listen();

            System.out.println("------>发送PDU<------");
            //设置报文类型
            pdu.setType(PDU.GET);
            ResponseEvent respEvent = snmp.send(pdu, target);
            System.out.println("PeerAddress:" + respEvent.getPeerAddress());
            PDU response = respEvent.getResponse();

            if(response == null){
                System.out.println("ERROR: <response is null, request time out>");
            } else {
                System.out.println("响应的PDU大小为:[" + response.size() + "]");
                for (int i = 0; i < response.size(); i++) {
                    VariableBinding vb = response.get(i);
                    System.out.println("请  求  的 OID:[" + vb.getOid() + "]");
                    System.out.println("获取OID对应的值:[" + vb.getVariable() + "]");
                }
            }
            System.out.println("----------结果:成功!!!");
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("SNMP Get Exception:" + e);
        }finally {
            if (snmp != null) {
                try { snmp.close(); }
                catch (IOException ex1) { snmp = null; }
            }
        }
    }

    /**
     * 根据OID列表,一次获取多条OID数据,并且以List形式返回
     * */
    public static void snmpGetList(String ip, String community, List<String> oidList){
        CommunityTarget target = createDefault(ip, community);

        Snmp snmp = null;
        try{
            PDU pdu =new PDU();
            for (String oid : oidList) {
                pdu.add(new VariableBinding(new OID(oid)));
            }

            DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
            snmp = new Snmp(transport);
            snmp.listen();

            System.out.println("------>发送PDU<------");
            pdu.setType(PDU.GET);//设置报文类型
            ResponseEvent respEvent = snmp.send(pdu, target);
            System.out.println("PeerAddress:" + respEvent.getPeerAddress());
            PDU response = respEvent.getResponse();

            if(response == null){
                System.out.println("ERROR: <response is null, request time out>");
            } else {
                System.out.println("响应的PDU大小为:[" + response.size() + "]");
                for (int i = 0; i < response.size(); i++) {
                    VariableBinding vb = response.get(i);
                    System.out.println("请  求  的 OID:[" + vb.getOid() + "]");
                    System.out.println("获取OID对应的值:[" + vb.getVariable() + "]");
                }
            }
            System.out.println("----------结果:成功!!!");


        }catch(Exception e){
            e.printStackTrace();
            System.out.println("SNMP Get Exception:" + e);
        }finally {
            if (snmp != null) {
                try { snmp.close(); }
                catch (IOException ex1) { snmp = null; }
            }
        }
    }






}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章           查看所有文章
加:2021-12-20 17:53:01  更:2021-12-20 17:53:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:29:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码