环境:java+gradle+snmp4j

编译器idea

进入正题

首先,我们编写一个snmp接收类

package main.snmp.util;import org.snmp4j.*;
import org.snmp4j.mp.StateReference;
import org.snmp4j.mp.StatusInformation;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.transport.DefaultTcpTransportMapping;/*** snmp trap和inform接收类*/
public class InformReceiver implements CommandResponder {private int port;private Snmp snmp;public InformReceiver(int port){this.port = port;}/*** 完成初始化并启动监听*/public void startListener() {try {TransportMapping transport = new DefaultTcpTransportMapping(new TcpAddress(port));snmp = new Snmp(transport);snmp.addCommandResponder(this);snmp.listen();} catch (Exception e) {e.printStackTrace();}}/*** 处理接收到的消息*/@Overridepublic void processPdu(CommandResponderEvent event) {System.out.print("receive Message :");PDU pdu = event.getPDU();System.out.println(pdu);if(pdu.getType()==PDU.INFORM) {//如果是Inform消息,需要回应,如果不回应,那么客户端就会重复inform消息pdu.setErrorIndex(0);pdu.setErrorStatus(0);pdu.setType(PDU.RESPONSE);StatusInformation statusInformation = new StatusInformation();StateReference ref = event.getStateReference();try {event.getMessageDispatcher().returnResponsePdu(event.getMessageProcessingModel(),event.getSecurityModel(), event.getSecurityName(),event.getSecurityLevel(), pdu,event.getMaxSizeResponsePDU(), ref, statusInformation);} catch (MessageException ex) {ex.printStackTrace();}}}
}

接着,我们再编写一个snmp发送类

package main.snmp.util;import org.snmp4j.*;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultTcpTransportMapping;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;/*** snmp发送类,发送trap和inform*/
public class InformSender {private Snmp snmp;public void Connect() throws IOException {TransportMapping<?> mapping = new DefaultTcpTransportMapping();snmp = new Snmp(mapping);}/*** 获取时间参数* @param currentTime* @return*/private static  Variable getSysUpTimeVariable(long currentTime){TimeTicks result = new TimeTicks(0);long i = 0L;if(i == 0L || currentTime == 0L){}else{result.setValue((currentTime - i)/10);}return result;}/*** 获取目标地址* @param address* @param community* @return*/public static Target getTargetV2(final String address, final String community){Address targetAddress = GenericAddress.parse(address);String str = community==null?"":community;Target target = new CommunityTarget(targetAddress, new OctetString(str));target.setAddress(targetAddress);target.setRetries(3);       //当发送trap的时候不生效,发送Inform的时候会生效target.setTimeout(1 * 1000);//等待回应时间target.setVersion(SnmpConstants.version2c);return target;}/*** 构造一个参数列表,用来测试发送数据*/private List<VariableBinding> getVariable(){List<VariableBinding> variables = new ArrayList<>();VariableBinding upTimeVB = new VariableBinding();upTimeVB.setOid(SnmpConstants.sysUpTime);Variable upTimeVar = getSysUpTimeVariable(System.currentTimeMillis());upTimeVB.setVariable(upTimeVar);variables.add(upTimeVB);return variables;}public boolean sendInform(Target target) throws IOException {List<VariableBinding> variables = getVariable();return sendInform(target, variables);}/*** 发送inform消息* @param target* @param variables* @return* @throws IOException*/private boolean sendInform(Target target, List<VariableBinding> variables) throws IOException {PDU pdu = new PDU();for(VariableBinding vb : variables) {pdu.add(vb);}ResponseEvent response = snmp.inform(pdu, target);if(response==null)return true;if(response.getResponse()==null)return false;if(response.getError()!=null)return false;return true;}public boolean sendTrap(Target target) throws IOException {List<VariableBinding> variables = getVariable();return sendTrap(target, variables);}/*** 发送trap消息* @param target* @param variables* @return* @throws IOException*/private boolean sendTrap(Target target, List<VariableBinding> variables) throws IOException {PDU pdu = new PDU();pdu.setType(PDU.TRAP);for(VariableBinding vb : variables) {pdu.add(vb);}snmp.send(pdu, target);return true;}
}

最后,我们再编写一个测试类

package main;import main.snmp.util.InformReceiver;
import main.snmp.util.InformSender;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.OctetString;import java.io.IOException;
import java.util.List;public class Main {public static void main(String[] args){//在本机10062端口启动监听InformReceiver receiver = new InformReceiver(10062);receiver.startListener();System.out.println("snmp start listener");try {Thread.sleep(1000);} catch (InterruptedException e) { }InformSender sender = new InformSender();try {sender.Connect();Target target = InformSender.getTargetV2("tcp:127.0.0.1/10062","");//发送informboolean result = sender.sendInform(target);if(result==true)System.out.println("snmp send inform succ.");elseSystem.out.println("snmp send inform fail.");//发送trap,trap只管发送不管结果result = sender.sendTrap(target);if(result)System.out.println("snmp send trap succ.");elseSystem.out.println("snmp send trap fail.");} catch (IOException e) {e.printStackTrace();}try {Thread.sleep(2000);} catch (InterruptedException e) { }}
}

程序的运行结果

如果需要工程,可以去github下载,下载链接是https://github.com/skyfinging/snmp-Inform-demo

使用java编写snmp inform 发送与接收示例相关推荐

  1. Android Java使用JavaMail API发送和接收邮件的代码示例

    JavaMail是Oracle甲骨文开发的Java邮件类API,支持多种邮件协议,这里我们就来看一下Java使用JavaMail API发送和接收邮件的代码示例 使用Javamail发送邮件,必需的j ...

  2. java activeMQ消息的发送与接收

    java activeMQ消息的发送与接收 activemq是我们经常用到的消息队列之一,比如说速度快,对spring的很好的支持,支持多种协议等等,今天我们就来看一下activeMQ消息的发送与接收 ...

  3. snmp trap发送及接收

    在进行winsnmp及其它snmp api进行snmp开发时,基本上都会有一个接收trap的功能.对于初学者来说,即使了解了不少snmp的知识,但如果没有亲自实现出结果,对它的理解还是有欠缺的.snm ...

  4. java kafka消息的发送与接收

    java kafka消息的发送与接收 消息队列在java EE级开发是很常用到的工具之一,在众多消息队列当中,active mq与kafka相对比较受开发者的喜爱,那么kafka是怎样实现消息的发送与 ...

  5. Java中的TCP发送和接收数据

    一.发送数据 一.Java中的TCP通信 Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信 Java为客户端提供了S ...

  6. hal 双串口同时接收丢失数据_【STM32Cube_06】使用USART发送和接收数据(查询模式)...

    寻求更简洁舒适的阅读体验,请移步Mculover666的个人博客: [STM32Cube_06]使用USART发送和接收数据(查询模式)​www.mculover666.cn 本篇文章主要介绍如何使用 ...

  7. java多播_Java多播发送数据,未接收

    我正在用 Java编写一个类,用于大大简化多播过程.但是,我遇到了两个大问题: >该类发送数据(我可以使用我的网络监视器Wireshark进行验证),但同一组中的任何其他人都不会收到数据. &g ...

  8. java邮件接收_Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  9. 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...

    简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...

最新文章

  1. Hi3516ampp编译错误之ls: cannot access '/hiwork/osdrvhi3516a.C02': No such file or directory
  2. 第十七届全国大学生智能汽车竞赛 沁恒微电子芯片推荐
  3. 系统、网络运维好帮手:expect
  4. android edittext设置内容为空,android – 我将EditText的InputType设置为TYPE_NULL后无法更改...
  5. Linux文件锁学习-flock, lockf, fcntl
  6. docker jenkins 公钥_代码自动发布docker(20.10.1)+k8s(1.20.1)
  7. Oracle基础知识-SQL简单命令
  8. 图像处理论坛_【活动】CSIG菁英青云论坛第三期活动预告!!
  9. Linux nc命令详解
  10. python解析sql语句表名_python正则表达式匹配sql语句中的表名
  11. oracle 500,500 OOPS: cannot change directory问题
  12. EXCEL 2010学习笔记—— 动态图表
  13. 监控服务器ssh登录,并发送报警邮件
  14. 360随身wifi2驱动 v5.3.0.1035 官方版
  15. WordPress页面教程【2021】
  16. 路由器WIFI密码怎么设置?快速设置,只需1分钟
  17. 一篇让你熟练掌握Google Guava包(全网最全)
  18. MySQL数据库_(学生_教师_课程_成绩)表_练习
  19. RV1126RV1109 buildroot 增加串口屏测试
  20. iOS访问 self-signed(自签名) HTTPS

热门文章

  1. Jython、JRuby 和 Groovy
  2. 服务器和交换机如何连接以及配置
  3. 20190922 (3) 学习英语语法的基础句法(主语 1 )
  4. 【GitHub pages】关于404错误There isn‘t a GitHub Pages site here.
  5. vscode使用webpack打包
  6. 字节跳动进军云计算市场,火山引擎补齐IaaS业务空白
  7. Idea Debug调试指南笔记01
  8. iconv 转换文件编码
  9. 第四五周(3.28-4.10)进度及下周计划(4.10组会总结)
  10. C语言求1/1 - 1/2 +1/3 ...-1/100的和