在进行SNMP协议调用之前,要先保证主机和目的机器可以通信,可以用ping工具来尝试连通性,如果可以通信,可直接跳转到第二章节和第三章节查看协议的调用;如果不能通信,即不在同一个网段,那么需要先按照第一章节的步骤设置路由表,再根据第二章节和第三章节的步骤实现协议的调用

1. 设置路由表


1.1 原理


如果windows所在网段和lxd容器【即SNMP协议需要访问的设备】所在网段不一致,我们不能直接访问,则需要进行路由表的设置

以如下ip地址为例,进行路由表的设置,其中

  • windowsip地址为192.168.31.224
  • Linux服务器的ip地址为192.168.31.104
  • Linux服务器中lxd容器的ip地址为10.137.5.86,网关地址通过route -n查看后得知为10.137.5.1

所以思路为:

每当windows访问容器的时候,将流量转发到服务器中

同理,容器回复windows的时候,因为网关本身可以和服务器连通,所以流量转发到网关中即可

1.2 设置


windows中的设置

# 查看路由表
route print
# 将访问ip地址为10.137.5.86,且掩码为255.255.255.255的流量转发到192.168.31.104中
route add 10.137.5.86 mask 255.255.255.255 192.168.31.104
# 删除路由表
route delete 10.137.5.86 mask 255.255.255.255 192.168.31.104

lxd容器中的设置

# 查看路由表
ip route
# 将访问ip地址为192.168.31.224/32的流量转发到10.137.5.1中
ip route add 192.168.31.224/32 via 10.137.5.1
# 删除路由表
ip route del 192.168.31.224/32 via 10.137.5.1

此时,我们才可以保证windows访问lxd容器

2. Java实现SNMP简单操作


2.1 导入依赖

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

2.2 设置连接


建立一个类来存储常见oid

//定义snmp类,存储常量
public class MySnmp {//设备描述信息public final String Sys_Desc = "1.3.6.1.2.1.1.1";//设备开启时间public final String Sys_Up_Time = "1.3.6.1.2.1.1.5";//设备名称public final String Sys_Name = "1.3.6.1.2.1.1.3";//网卡接口速率public final String If_Speed = "1.3.6.1.2.1.2.2.1.5.126";//网卡接口当前时刻进流量public final String If_In_Octets = "1.3.6.1.2.1.2.2.1.10.126";//网卡接口当前时刻出流量public final String If_Out_Octets = "1.3.6.1.2.1.2.2.1.16.126";
}

建立连接以及传参函数

//用来获取设备信息
public class GetMessage {public String getMessageByIpAndOid(String ip,String oid) throws IOException {String result = null ;// 1. 创建 SNMP 管理器CommunityTarget target = new CommunityTarget();target.setCommunity(new OctetString("public"));target.setAddress(GenericAddress.parse("udp:"+ip+"/161"));target.setRetries(2);target.setTimeout(1000);TransportMapping<UdpAddress> transport = new DefaultUdpTransportMapping();Snmp snmp = new Snmp(transport);snmp.listen();// 2. 创建 OIDOID oid1 = new OID(oid);// 3. 发送 SNMP 请求并处理响应PDU pdu = new PDU();pdu.add(new VariableBinding(oid1));pdu.setType(PDU.GETNEXT);ResponseEvent event = snmp.send(pdu, target);PDU response = event.getResponse();if (response == null) {System.out.println("没有得到响应");} else {result = String.valueOf(response.get(0).getVariable());}// 4. 关闭 SNMP 管理器snmp.close();return result;}
}

2.3 测试获取信息


public class Test {public static void main(String[] args) throws IOException {MySnmp mySnmp = new MySnmp();GetMessage getMessage = new GetMessage();System.out.println("获取容器信息:"+getMessage.getMessageByIpAndOid("10.137.5.86",mySnmp.Sys_Desc));System.out.println("获取容器名称:"+getMessage.getMessageByIpAndOid("10.137.5.86",mySnmp.Sys_Name));System.out.println("获取容器开启时长:"+getMessage.getMessageByIpAndOid("10.137.5.86",mySnmp.Sys_Up_Time));System.out.println("获取容器eth0网口当前速率:"+getMessage.getMessageByIpAndOid("10.137.5.86",mySnmp.If_Speed));System.out.println("获取容器eth0网口当前时刻进流量:"+getMessage.getMessageByIpAndOid("10.137.5.86", mySnmp.If_In_Octets));System.out.println("获取容器eth0网口当前时刻出流量:"+getMessage.getMessageByIpAndOid("10.137.5.86", mySnmp.If_Out_Octets));}
}

3. Java实现SNMP流量监控


第二章节实现了利用snmp的简单操作,本章节介绍如何实现流量监控

思路如下:

  1. 创建io流用来写入日志文件
  2. for循环连续读取当前时刻流量
  3. 利用线程进行休眠来控制读取时间间隔
  4. 将流量写入日志文件并且刷新
//实现流量监控
public class TrafficMonitoring {public void getTrafficMonitoring(int time) throws IOException {//获取oidMySnmp mySnmp = new MySnmp();//输入流FileOutputStream fos = null;OutputStreamWriter writer = null;BufferedWriter bf = null;//根据oid获取结果GetMessage getMessage = new GetMessage();try {//表示内容的追加fos = new FileOutputStream("src/main/java/org/example/logFile.log",true);writer = new OutputStreamWriter(fos);bf = new BufferedWriter(writer);bf.write("====================切割线==========================\n");//格式化当前时间SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for (int i = 0 ; i<time ; i++) {Date date = new Date(System.currentTimeMillis());//获得当前时间String nowTime = formatter.format(date);//活得当前流量String If_In_Octets = getMessage.getMessageByIpAndOid("10.137.5.86", mySnmp.If_In_Octets);String If_Out_Octets = getMessage.getMessageByIpAndOid("10.137.5.86", mySnmp.If_Out_Octets);bf.write(nowTime+"-"+"If_In_Octets:"+If_In_Octets+"bytes,If_Out_Octets:"+If_Out_Octets+"bytes\n");Thread.sleep(1000);}bf.flush();System.out.println(time+"秒内的流量监控完毕,请查看日志文件");} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {if (fos != null) {fos.close();}if (writer != null) {writer.close();}if (bf != null) {bf.close();}}}
}

Java基于Snmp4j库实现SNMP协议的调用相关推荐

  1. Java基于socket服务实现UDP协议的方法

    转载自 Java基于socket服务实现UDP协议的方法 这篇文章主要介绍了Java基于socket服务实现UDP协议的方法,通过两个简单实例分析了java通过socket实现UDP发送与接收的技巧, ...

  2. Java基于TCP(Socket)协议的网络语音聊天

    Java基于TCP协议的网络语音聊天 本聊天是基于tcp协议进行的,其本质为:本地录音->将录音通过网络编程转发给他人->他人进行录音的播放. 所需知识:多线程,基于tcp协议的网络编程 ...

  3. freertos 基于lwip实现的snmp协议

    1.snmp 应用层网络管理协议 2.基于udp实现 3.snmp协议主要功能包括 服务端发送get 读请求节点的udp数据包 客服端设备主动进行trap上报数据 4.下图是PC机作为服务端发送get ...

  4. 基于libusb库、uac协议,获取Audio声音数据

    android_usbaudio 基于libusb,实现无驱动获取USBAudio 期望实现的功能: 通过libusb获取USBAudio数据,无需SELinux声卡权限 部分摄像头无法获取音频问题解 ...

  5. Java基于nfs-client包实现NFS协议连接linux服务器进行文件上传与下载操作源码

    添加依赖 // https://mvnrepository.com/artifact/com.emc.ecs/nfs-clientcompile group: 'com.emc.ecs', name: ...

  6. 一个基于 osip 库的 UAC 和 UAS 的代码整理(转)

    从网上搞了一个基于osip 库的 SIP 协议的简单的 UAC 代理客户端和 UAS 代理服务器端,并进行了编译连接,代码整理后如下: ----------- UAC 代理客户端的代码整理 ----- ...

  7. SNMP4J(通过java实现SNMP协议)

    目录 一.介绍SNMP(Simple Network Management Protocol) 二.SNMP 消息和目标 三.发送 SNMP 消息 四.接收 SNMP 消息 五.实战案例 1.添加po ...

  8. java 通过snmp协议获取物理机CPU、内存容量及使用率,存储的容量及使用率

    java 用snmp协议获取物理机CPU.内存容量及使用率,存储的容量及使用率,java获取trap告警 一.SNMP简介 1.什么是snmp 二.SNMP获取信息步骤 1.开启SNMP 2.MIB文 ...

  9. java snmp协议 获取数据

    最近工作内容涉及到snmp协议相关内容,由于第一次接触,又没有实际的环境测试,写出来的东西自己都不确定能不能用,直到最近有环境后,花了一段时间才搞定. 写下这篇文章,只是给和我之前一样的小白指点一波, ...

最新文章

  1. sql-case when 条件1 then 取值1 when 条件2 then 取值2 else 取值3 end
  2. 从0到1构建大数据生态系列1:数据蛮荒中的拓荒之举
  3. Python 基础篇-简单的异常捕获
  4. 【视频课】业界最强数据增强库使用与人脸图像超分辨实践!
  5. 连载:阿里巴巴大数据实践—数据开发平台
  6. 利用计算机进行绘制建筑图纸,工程计算机制图.pdf
  7. opencv之cv::Mat像素遍历
  8. 基于SOLIDWORKS Simulation的有限元分析法实例应用
  9. 毕达哥拉斯定理/勾股定理
  10. 在浏览器中打开shell,连接linux
  11. 华为交换机系统版本升级(S7706)
  12. SwiftUI基础之Text格式化显示小数specifier
  13. 用Java实现简单画板
  14. 楚留香ai识别人脸_楚留香手游AI捏脸怎么弄_楚留香手游AI捏脸方法步骤_玩游戏网...
  15. java8(三)Stream API
  16. JNLP和java web start
  17. 腾讯企业邮箱:创建邮件授权码
  18. CentOS 7 could not retrieve mirrorlist http://.......解决
  19. EDA(电子设计自动化) 河北大学实验
  20. Overload和Override的区别?

热门文章

  1. 使用mmap 修改用户空间文件
  2. 怎样有效降低测试的轮次?
  3. 9月5日朵朵去了医院,病毒性感冒,今天就不去幼儿园了
  4. mysql自定义函数IsNumeric
  5. 【DP】探索数字迷塔
  6. C语言数组之斐波那契数列
  7. java 分行符_java换行符有哪些
  8. 川大计算机学院夏令营感谢,计算机专业暑期夏令营之行总结
  9. mini2440 u-boot linux 内核启动,mini2440之U-Boot使用及移植详细手册
  10. 零门槛免费WiFi背后中国平安的野心