OpenNMS扩展–基于JoeSNMP/MIB数据访问实现
1. MIB访问流程及原理
JoeSNMP是OpenNMS采用的SNMP API,已独立成为一个Open Source Framework,基于JoeSNMP可以对MIB网络数据进行相应的操作。JoeSNMP封装了多个对SNMP Get,Set等操作的处理。
l Get:用于读取设备MIB信息库中实例对象的单个值,Get取OID表示对象实例值,
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, snmpTimeoutErrort和snmpInternalError. 如: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 Agent的IP地址
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 中文 http://www.qoswork.com OpenNMS 官方文档 https://qoswork.github.io/odoc/
这些组件之间通过事件机制进行交互,以实现网络设备的自动发现、服务扫描、性能数据收集等功能。 二、OpenNMS 启动过程 OpenNMS 的启动过程可以分为以下几个步骤: 1. 首先,检查当前是否有 OpenNMS 在运行,如果...
首先,安装OpenNMS之前,确保你的系统是Linux,并且具备访问互联网的能力,因为我们将使用Yum包管理器进行安装。Yum是Red Hat和CentOS等系统中的默认包管理器,它可以自动处理依赖关系,使得安装过程更为便捷。 1. ...
OpenNMS数据采集配置是这个系统中非常重要的一个环节,涉及到从网络设备中采集各种性能指标数据的过程,以及后续数据的存储、展示和告警的处理机制。接下来我们将详细介绍OpenNMS数据采集配置的相关知识点。 首先,...
《基于SNMP协议的OpenNMS网络管理平台详解》 在IT行业中,网络管理是至关重要的环节,而OpenNMS作为一款开源的网络管理系统,以其强大的功能和灵活的可扩展性,深受广大网络管理员的喜爱。"opennms-source.tar.gz_...
1. **用户与权限**:OpenNMS支持多用户登录,并可配置不同级别的访问权限,以实现系统安全。 2. **节点管理**:通过自动发现或手动添加,你可以将网络中的设备添加为OpenNMS的监控节点。节点信息包括IP地址、主机名...
PagerDuty-OpenNMS PagerDuty-OpenNMS 是一个由 OpenNMS 运行的脚本,它使用 curl 调用 PagerDuty 集成 API。配置配置本身并不过分复杂: 将附加的脚本放在 $OPENNMS_HOME/contrib/pagerduty 将 API 密钥从...
2. 可以使用sudo /usr/share/opennms/bin/runjava –s命令检查OpenNMS所使用的JRE。 四、运行OpenNMS安装程序 1. 运行OpenNMS安装程序,使用sudo /usr/share/opennms/bin/install –dis命令。 2. 等待一段时间,...
openNMS1.6.5源码,最新稳定的版本。OpenNMS是第一个开发在开源模式下的企业级网络管理平台应用。OpenNMS的目标是成为一个真真的分布式、可升级的网络...数据收集 - 收集、保存和报表网络信息数据,并设定和触发门限值
1. **Java和Spring框架**:OpenNMS主要使用Java语言开发,利用Spring框架来实现依赖注入和模块化设计,确保系统可扩展性和灵活性。 2. **JMS(Java消息服务)**:OpenNMS使用JMS来处理事件和通知,实现异步通信,...
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是一个企业级基于Java/XML的分布式网络和系统监控管理平台-OpenNMS Open Source Network Management, OpenNMS is an enterprise-class based on the Java/XML distributed network and ...
OpenNMS是业界知名的开源网络监控平台,它支持多种数据存储方式,包括新出现的基于时间序列的Newts数据存储方式。Newts是构建在Apache Cassandra之上的一个时序数据库,它为OpenNMS提供了高效的数据存储解决方案。 ...
服务启动后,通过Web界面访问OpenNMS进行管理。 ### 问题诊断与解决: 如果在安装或配置过程中遇到问题,可以通过查看OpenNMS的日志文件来诊断问题。日志文件通常位于`/var/log/opennms`目录下。此外,检查是否...
1. GET操作:在joesnmp中,开发者可以通过指定MIB对象的OID(Object Identifier,对象标识符)来获取数据。OID是SNMP中的唯一标识符,用于定位网络管理对象。例如,获取一个设备的系统描述信息,可以使用`get()`函数...
OpenNMS是基于Java的开源网络管理软件,它可以监控分布式的异构系统和网络设备的运行状态,支持SNMP网络管理协议,确保管理的扩展性,功能全面,并且提供非常灵活的定制功能。OpenNMS的体系架构分为四层:被管理层、...
在Java编程环境中,我们可以利用库来实现SNMP协议的数据采集。这个项目就是这样一个例子,它是一个使用SNMP协议收集网络设备数据的Java程序。 首先,我们来看看`org.opennms.lib.joesnmp-2.0.1.jar`。这是一个...
NULL 博文链接:https://yinbangmin.iteye.com/blog/2414070
通过提供的配置,将每5分钟收集一次指标,并使用已配置的存储策略(例如或基于的将其保存在OpenNMS中。要求具有serverinfo支持的Nextcloud候选发布版10 OpenNMS Horizon /子午线与XML数据收集器插件一起安装将...