`
diy8187
  • 浏览: 79547 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

OpenNMS扩展–基于JoeSNMP/MIB数据访问实现

阅读更多

OpenNMS扩展基于JoeSNMP/MIB数据访问实现

1. MIB访问流程及原理

JoeSNMPOpenNMS采用的SNMP API,已独立成为一个Open Source Framework,基于JoeSNMP可以对MIB网络数据进行相应的操作。JoeSNMP封装了多个对SNMP Get,Set等操作的处理。

l Get:用于读取设备MIB信息库中实例对象的单个值,GetOID表示对象实例值,

l Set:用于简单的设置MIB中可读写的对象实例值。

MIB访问的主流程图如下:

1. MIB访问的主流程图

首先根据自变量接收一个要访问的被管理对象主机名,并接收要查询的对象标识符的简略定义形式. 过程首先生成SNMP 报文,一旦报文生成,再把报文简单反转过来,发送出去.生成SNMP 报文后,建立代理地址,创建套接字连接,以便代理能将响应发回. 然后,SNMP 请求报文发给代理 ,等待一个响应的到来.因为SNMP 是工作在UDP 之上的,所以在SNMP 应用实体间通信时,无需先建立连接,这样虽降低了系统开销,UDP 传输是不可靠的,为此,网络管理站采取了相应的超时和重发策略. 系统在发出请求报文之后,启动超时计数器,等待响应的到来,并设置重发次数为3. 3 次之后仍没有收到响应,则关闭套接字,并返回一个接收失败错误代码. 反之,若确定收到一个响应,则调用一过程来把响应转换成为内部表示形式, 即对SNMP 报文进行译码. 再用已保存的Request-id与响应Request-id段进行比较,来验证这个报文是否是刚才发出的请求报文的响应. 若是,就调用另一个过程,把每段对象标识符的ASN.1表示形式转换成自己的内部形式,并显示其值

2. Get-Request/Set-Request步骤

实现SnmpHandler接口

写一个SnmpSet, SnmpGet, implement SnmpHandler,实现处理SNMP的方法:snmpReceivedPdu, snmpTimeoutErrortsnmpInternalError. 如:SnmpGet.java

public class SnmpGet implements SnmpHandler {

/**

* The log4j category used to log debug messsages and statements.

*/

private static final String LOG4J_CATEGORY = "SureTech.NMS";

public void snmpInternalError(SnmpSession session, int err, SnmpSyntax pdu) {

System.out.println("InternalError");

value ="Internal Error";

synchronized (session) {

session.notify();

}

}

public void snmpReceivedPdu(SnmpSession session, int command, SnmpPduPacket pdu) {

ThreadCategory.setPrefix(LOG4J_CATEGORY);

Category log = ThreadCategory.getInstance();

SnmpVarBind varBind = pdu.getVarBindAt(0);

value = varBind.getValue().toString();

if(log.isDebugEnabled()){

log.debug("Received value: " + varBind.getName() + "="

+ varBind.getValue());

}

synchronized (session) {

session.notify();

}

}

public void snmpTimeoutError(SnmpSession session, SnmpSyntax pdu) {

System.out.println("SnmpTimeout");

value ="Snmp Timeout";

synchronized (session) {

session.notify();

}

}

}

2.2创建SnmpPeer对象

创建一个SnmpPeer对象,需定义:

l AgentIP地址

l port (defaults to 161)

l retries (defaults to 3)

l timeout (defaults to .8 seconds)

如下在方法snmpGet方法中的红色代码片段:

/**

* The value of snmpget command.

*/

public String snmpGet(String host, String oid) throws SocketException,

UnknownHostException {

InetAddress remote = InetAddress.getByName(host);

SnmpPeer peer = new SnmpPeer(remote);

peer.setPort(161);

peer.setTimeout(5000);

peer.setRetries(1); // it is actually number of tries

SnmpParameters parms = peer.getParameters();

parms.setVersion(SnmpSMI.SNMPV2);

parms.setReadCommunity("public");

final SnmpSession session = new SnmpSession(peer);

session.setDefaultHandler(new SnmpGet());

SnmpVarBind[] vblist = { new SnmpVarBind(oid) };

SnmpPduRequest pdu = new SnmpPduRequest(

oid.endsWith(".0") ? SnmpPduPacket.GET : SnmpPduPacket.GETNEXT,

vblist);

pdu.setRequestId(1);

try {

synchronized (session) {

session.send(pdu);

session.wait();

}

} catch (InterruptedException e) {

// do nothing

} finally {

session.close();

}

return value;

}

2.3创建SnmpParameters对象

创建一个SnmpPeer对象,需定义:

l read community string (defaults to public)

l write community string (defaults to null)

l SNMP version to use (defaults to SNMPV1)

l AsnEncoder to use (defaults to BER)

SnmpParameters parms = peer.getParameters();

parms.setVersion(SnmpSMI.SNMPV2);

parms.setReadCommunity("public");

2.4创建SnmpSession对象,发送PDU

SnmpPeer创建一个SnmpSession对象,这样就创建一个“SnmpPortal”线程,此线程用来接受来自远程Agent的响应,也可以创建一个Quene来处理所有的SNMP请求。

final SnmpSession session = new SnmpSession(peer);

session.setDefaultHandler(new SnmpGet());

SnmpVarBind[] vblist = { new SnmpVarBind(oid) };

SnmpPduRequest pdu = new SnmpPduRequest(

oid.endsWith(".0") ? SnmpPduPacket.GET : SnmpPduPacket.GETNEXT,

vblist);

pdu.setRequestId(1);

try {

synchronized (session) {

session.send(pdu);

session.wait();

}

} catch (InterruptedException e) {

// do nothing

} finally {

session.close();

}

l 通过调用session.send(pdu)发送PDU请求到远程的Agent,开启一个新的线程发送请求和处理重试或超时。

l 调用session.wait()进行线程等待。

l SNMP session线程收到来自Agent的响应后会调用snmpTimeoutError方法,如果Agent没有在超时时间内响应,SNMP session线程将调用snmpTimeoutError方法,如果是内部发生了问题,则调用snmpInternalError方法。

l 线程唤醒,并继续处理。

2.5关闭Session

session.close();

分享到:
评论

相关推荐

    opennms.zh:OpenNMS 中文-开源

    opennms 中文 http://www.qoswork.com OpenNMS 官方文档 https://qoswork.github.io/odoc/

    opennms启动过程分析

    这些组件之间通过事件机制进行交互,以实现网络设备的自动发现、服务扫描、性能数据收集等功能。 二、OpenNMS 启动过程 OpenNMS 的启动过程可以分为以下几个步骤: 1. 首先,检查当前是否有 OpenNMS 在运行,如果...

    OpenNMS安装文档和试用报告

    首先,安装OpenNMS之前,确保你的系统是Linux,并且具备访问互联网的能力,因为我们将使用Yum包管理器进行安装。Yum是Red Hat和CentOS等系统中的默认包管理器,它可以自动处理依赖关系,使得安装过程更为便捷。 1. ...

    OpenNMS数据采集配置

    OpenNMS数据采集配置是这个系统中非常重要的一个环节,涉及到从网络设备中采集各种性能指标数据的过程,以及后续数据的存储、展示和告警的处理机制。接下来我们将详细介绍OpenNMS数据采集配置的相关知识点。 首先,...

    opennms-source.tar.gz_SNMP_openNMS

    《基于SNMP协议的OpenNMS网络管理平台详解》 在IT行业中,网络管理是至关重要的环节,而OpenNMS作为一款开源的网络管理系统,以其强大的功能和灵活的可扩展性,深受广大网络管理员的喜爱。"opennms-source.tar.gz_...

    opennms配置,功能手册

    1. **用户与权限**:OpenNMS支持多用户登录,并可配置不同级别的访问权限,以实现系统安全。 2. **节点管理**:通过自动发现或手动添加,你可以将网络中的设备添加为OpenNMS的监控节点。节点信息包括IP地址、主机名...

    PagerDuty-OpenNMS:PagerDuty-OpenNMS 是一个由 OpenNMS 运行的脚本,它调用 PagerDuty 集成 API 以使用 curl 创建事件

    PagerDuty-OpenNMS PagerDuty-OpenNMS 是一个由 OpenNMS 运行的脚本,它使用 curl 调用 PagerDuty 集成 API。配置配置本身并不过分复杂: 将附加的脚本放在 $OPENNMS_HOME/contrib/pagerduty 将 API 密钥从...

    OpenNMS安装、配置[归纳].pdf

    2. 可以使用sudo /usr/share/opennms/bin/runjava –s命令检查OpenNMS所使用的JRE。 四、运行OpenNMS安装程序 1. 运行OpenNMS安装程序,使用sudo /usr/share/opennms/bin/install –dis命令。 2. 等待一段时间,...

    opennms-1.6.5-1_new.rar_OpenN_openNMS_opennms-1_开源_网络管理

    openNMS1.6.5源码,最新稳定的版本。OpenNMS是第一个开发在开源模式下的企业级网络管理平台应用。OpenNMS的目标是成为一个真真的分布式、可升级的网络...数据收集 - 收集、保存和报表网络信息数据,并设定和触发门限值

    opennms1.12.5-1源码下载

    1. **Java和Spring框架**:OpenNMS主要使用Java语言开发,利用Spring框架来实现依赖注入和模块化设计,确保系统可扩展性和灵活性。 2. **JMS(Java消息服务)**:OpenNMS使用JMS来处理事件和通知,实现异步通信,...

    Opennms从源码编译安装指南

    export M2_HOME=/opennms/opennms/maven export PATH=$M2_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/java/jdk1.6.0_41/bin ``` 其余软件安装 接下来,需要安装其他...

    openNMS开源代码

    openNMS开源网管,OpenNMS是一个企业级基于Java/XML的分布式网络和系统监控管理平台-OpenNMS Open Source Network Management, OpenNMS is an enterprise-class based on the Java/XML distributed network and ...

    OpenNMS系统Newts数据存储方式配置

    OpenNMS是业界知名的开源网络监控平台,它支持多种数据存储方式,包括新出现的基于时间序列的Newts数据存储方式。Newts是构建在Apache Cassandra之上的一个时序数据库,它为OpenNMS提供了高效的数据存储解决方案。 ...

    OpenNMS安装相关问题

    服务启动后,通过Web界面访问OpenNMS进行管理。 ### 问题诊断与解决: 如果在安装或配置过程中遇到问题,可以通过查看OpenNMS的日志文件来诊断问题。日志文件通常位于`/var/log/opennms`目录下。此外,检查是否...

    joesnmp-0.3.4

    1. GET操作:在joesnmp中,开发者可以通过指定MIB对象的OID(Object Identifier,对象标识符)来获取数据。OID是SNMP中的唯一标识符,用于定位网络管理对象。例如,获取一个设备的系统描述信息,可以使用`get()`函数...

    应用开源OpenNMS实现网络监控和报警.docx

    OpenNMS是基于Java的开源网络管理软件,它可以监控分布式的异构系统和网络设备的运行状态,支持SNMP网络管理协议,确保管理的扩展性,功能全面,并且提供非常灵活的定制功能。OpenNMS的体系架构分为四层:被管理层、...

    snmp采集数据的java程序

    在Java编程环境中,我们可以利用库来实现SNMP协议的数据采集。这个项目就是这样一个例子,它是一个使用SNMP协议收集网络设备数据的Java程序。 首先,我们来看看`org.opennms.lib.joesnmp-2.0.1.jar`。这是一个...

    OpenNMS基于Minions分布式安装配置

    NULL 博文链接:https://yinbangmin.iteye.com/blog/2414070

    nextcloud:使用serverinfo应用程序监视nextcloud的配置模块

    通过提供的配置,将每5分钟收集一次指标,并使用已配置的存储策略(例如或基于的将其保存在OpenNMS中。要求具有serverinfo支持的Nextcloud候选发布版10 OpenNMS Horizo​​n /子午线与XML数据收集器插件一起安装将...

Global site tag (gtag.js) - Google Analytics