SNMP4J的使用及项目搭建

SNMP协议

SNMP的基本思想:为不同种类的设备、不同厂家生产的设备、不同型号的设备,定义为一个统一的接口和协议,使得管理员可以是使用统一的外观面对这些需要管理的网络设备进行管理。通过网络,管理员可以管理位于不同物理空间的设备,从而大大提高网络管理的效率,简化网络管理员的工作。
简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议。SNMP协议应用广泛,使用简单。一套完整的SNMP系统主要包括管理信息库(MIB)、管理信息结构(SMI)及SNMP报文协议。
SNMP规定了5种协议数据单元:
1.get-request操作:从代理进程处提取一个或多个参数值。
2.get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数 值。
3.set-request操作:设置代理进程的一个或多个参数值。
4.get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。
5.trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
snmpwalk工具操作参数
snmpwalk [版本] [权限] [IP] [OID] [参数(Integer或string)]
snmpwalk操作示例:

snmpwalk -v2c public 192.168.0.107 .1.3.6.1.4.1.532.2.1.2.1.5. 11

snmp对象结构
在这里插入图片描述

snmp4J

snmp4J是Java对于snmp协议的一个开源项目,目前使用的是对应Java8的snmp4j依赖:

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

snmp4J主要分为几大对象结构

  1. snmp对象 ,可以看成一个代理人,ResponseEvent response=snmp.send(pdu, target)方法用来传递消息,返回数据;
  2. target对象 ,目标参数封装,设置目标参数的地址,协议版本,超时、重传等;
  3. pdu对象 ,pdu.add(VariableBinding)添加要发送的数据,比如oid和integer、string参数;
  4. ResponseEvent对象 ,返回参数封装;
  5. VariableBinding对象 数据绑定,然后添加到pdu;
  6. TransportMapping snmp对象初始化参数,默认为DefaultUdpTransportMapping,new snmp(TransportMapping);

MIB BROWSER

在这里插入图片描述

snmp4J使用

案例:

项目Value
设备远程智能pdu,接口文档,MIB库
调试工具MIB BROWSER
协议SNMP协议
SNMP框架SNMP4J
项目框架springboot

1.将电脑与设备的网络连通,能访问设备的内部网页,使用MIB BROWSER导入设备的MIB库,调试get,set,getnext各种操作。
2.新建一个springboot项目,导入SNMP4J依赖,创建SNMPUtil工具类,创建定时任务,一分钟获取一次数据

package com.example.demo.task;


import com.example.demo.config.ParamsConfig;
import com.example.demo.util.SnmpUtil;
import lombok.extern.slf4j.Slf4j;
import org.snmp4j.PDU;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Vector;

@Component
@Slf4j
public class PduTask {
  @Autowired
  private ParamsConfig paramsConfig;//配置参数
  @Scheduled(fixedRate = 60000)//每分钟执行一次    
  @Async
  public void getPduInfo() {
      log.info("获取pdu数据:开始");
      int ver2c = SnmpConstants.version2c;//snmp2协议
      SnmpUtil snmpUtil=new SnmpUtil(ver2c);
      PDU pdu = new PDU();
      //PDU pdu = new ScopedPDU();
      // 设置要获取的对象ID,这个OID代表远程计算机的名称
      OID oid1 = new OID(paramsConfig.temp_oid);//温度
      OID oid2 = new OID(paramsConfig.humi_oid);//湿度
      OID oid3 = new OID(paramsConfig.smoke_oid);//烟感
      OID oid4 = new OID(paramsConfig.voltage_oid);//电压
      OID oid5 = new OID(paramsConfig.current_oid);//电流
      pdu.add(new VariableBinding(oid1));
      pdu.add(new VariableBinding(oid2));
      pdu.add(new VariableBinding(oid3));
      pdu.add(new VariableBinding(oid4));
      pdu.add(new VariableBinding(oid5));
      // 设置报文类型
      pdu.setType(PDU.GET);
      try {
          String addr=paramsConfig.transfer_protocol+":"+paramsConfig.snmp_ip+"/"+paramsConfig.snmp_port;
        
          ResponseEvent response=snmpUtil.sendMessage(false, true, pdu, addr,new OctetString("public"));//192.168.1.233 WinServer2008服务器
          Vector<? extends VariableBinding> list =response.getResponse().getVariableBindings();
          System.out.println("Synchronize(同步) message(消息) from(来自) "
                  + response.getPeerAddress() + "\r\n" + "request(发送的请求):"
                  + response.getRequest() + "\r\n" + "response(返回的响应):"
                  + list.get(0).getVariable().toString().substring(0,4)+"\r\n"+
                  list.get(1).getVariable().toString().substring(0,4)+"\r\n"+
                  list.get(2).getVariable()+"\r\n"+
                  list.get(3).getVariable()+"\r\n"+
                  list.get(4).getVariable());

          log.info("发送数据--------------------------------------------");
      } catch (IOException e) {
          e.printStackTrace();
      }
      log.info("定时获取探测站Info:结束");
  }
}

返回数据

Synchronize(同步) message(消息) from(来自) 192.168.0.107/161
request(发送的请求):GET[requestID=292621635, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.4.1.532.2.2.1.1.4.1 = Null; 1.3.6.1.4.1.532.2.2.1.1.5.1 = Null; 1.3.6.1.4.1.532.2.4.1.1.5.4 = Null; 1.3.6.1.4.1.532.2.1.1.1.3.1 = Null; 1.3.6.1.4.1.532.2.1.1.1.4.1 = Null]]
response(返回的响应):25.2
63.1
0
223.1
0.0

至此snmp4j的使用就完成了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 SNMP4J 绘制网络拓扑,您需要了解 SNMP4J 库和 Java 图形用户界面(GUI)编程。以下是一个简单的示例代码: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; import org.snmp4j.*; import org.snmp4j.smi.*; import org.snmp4j.transport.*; import org.snmp4j.util.*; public class NetworkTopology extends JFrame implements ActionListener { private static final long serialVersionUID = 1L; private JTextField textField; private JButton button; private JPanel panel; public NetworkTopology() { super("Network Topology"); textField = new JTextField(20); button = new JButton("Get Topology"); panel = new JPanel(); button.addActionListener(this); panel.add(textField); panel.add(button); add(panel); setSize(300, 100); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } public static void main(String[] args) { new NetworkTopology(); } public void actionPerformed(ActionEvent e) { if (e.getSource() == button) { DefaultTreeModel model = new DefaultTreeModel(new DefaultMutableTreeNode("Network Topology")); Snmp snmp = null; try { TransportMapping<? extends Address> transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); transport.listen(); PDU pdu = new PDU(); pdu.setType(PDU.GETNEXT); pdu.add(new VariableBinding(new OID("1"))); boolean finished = false; while (!finished) { ResponseEvent response = snmp.send(pdu, new CommunityTarget(new UdpAddress(textField.getText()), new OctetString("public"))); if (response.getResponse() == null) { finished = true; } else { VariableBinding vb = response.getResponse().get(0); if (vb.getOid().startsWith(new OID("1"))) { model.insertNodeInto(new DefaultMutableTreeNode(vb.getVariable().toString()), (MutableTreeNode) model.getRoot(), 0); pdu.setRequestID(new Integer32(0)); pdu.set(0, vb); } else { finished = true; } } } } catch (Exception ex) { ex.printStackTrace(); } finally { if (snmp != null) { try { snmp.close(); } catch (Exception ex) { ex.printStackTrace(); } } } JTree tree = new JTree(model); JScrollPane scrollPane = new JScrollPane(tree); panel.removeAll(); panel.add(scrollPane); revalidate(); repaint(); } } } ``` 该代码使用 SNMP4J 库检索网络拓扑。当用户单击 "Get Topology" 按钮时,它将使用 SNMP 协议检索网络拓扑,并将其显示在树中。您需要替换 "textField.getText()" 中的 IP 地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值