zl程序教程

您现在的位置是:首页 >  工具

当前栏目

用snmp4j开发网管应用(一) - SNMP

2023-09-14 08:58:00 时间
p >要开发网管应用,SNMP是必学的协议,这里首先对SNMP进行一下简单的介绍和想要开发SNMP协议的内容所需要用到的工具。

 

SNMP

SNMP 协议分为了多个版本,V1太简单,V2加入了一些验证,V3最严谨,下面都是以V2进行说明

概念:

ASN.1 高级数据描述语言,用于定义数据类型,语法规则等。

BER ASN.1的基本编码规则,发送消息之前经过其编码,接收后先解码

SMI 管理信息结构,ASN.1的子集加上一部分宏等内容。SNMP用它来描述MIB和PDU

MIB 管理信息库,一般是一个树形结构,使用SMI描述,用来定义一个或者多个网元

OID 网络节点的唯一ID,用在MIB中,是一个国际机构统一分配的,比如1.3.6.1.4.1代表enterprises企业网

PDU SNMP协议数据单元,是一个数据包的格式。每一种SNMP方法对应一种PDU,使用SMI描述,BER编码,传输层(UDP)协议进行传输

 

SNMP跟网管有关的开发可能会涉及如下的内容:

1. 获取网元信息

    网元已经存在,其提供MIB文件,其中定义了该网元节点的结构以及想获取该结构内容所需要用到的OID     使用代码或者其他的方式构建PDU,比如用snmp4j构建一个get请求类型的PDU(这个PDU是SMI描述的,BER编码的,包含了要操作的OID)到网元,得到返回结果。     根据返回结果进行操作(可以通过getNext达到遍历的效果),或者是把单纯的数据信息持久化起来用于观察。

2. 设置网元参数

    发送set请求的PDU到网元达到设置网元某个参数的作用

3. 开发trap服务器接收trap消息

    开发trap接收服务端,并在在网元端配置服务器端地址,网元因为某个时间出发一个trap发送到该服务端。    服务端记录该trap消息,用于数据分析

4. 开发一个网元模拟器

    开发一个模拟器,自己作为网元被人管理,通常用于测试。因为网管系统对应的真是网元都是昂贵的硬件,不容易找到合适的测试环境。

 

为了进行网元开发,首先我们需要准备一下所用到的工具

MIB Browser

我上传的一个免费版本:http://download.csdn.net/detail/three_man/7477903

官网下载地址:http://ireasoning.com/download.shtml

可以下载

iReasoning MIB Browser Free Personal Edition         

这个版本是个人版,没有时间限制,但是有导入的mib文件数量的限制,不过很适合开发使用。

 

我自己写了一个文件可以来这里上传:http://download.csdn.net/detail/three_man/7477887

这里对这个文件进行简单的说明。

文件主要内容:

CMS-MIB DEFINITIONS ::= BEGIN 
 // 文件描述开始

IMPORTS 

 MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Integer32, enterprises, 
// 导入基本的库,特别注意enterprises.他的oid是1.3.6.1.4.1

convediaCorp OBJECT IDENTIFIER ::= { enterprises 7569 }
// 定义了一个节点,表示他是enterprises+ 7569,所以他的Oid是1.3.6.1.4.1.7569

nodeInfo OBJECT IDENTIFIER ::= { msMIBObjects 1 } 
// 按照上面的类推,这个节点的Oid为.1.3.6.1.4.1.7569.1.2.1.1
nodeLicensedPorts OBJECT-TYPE 

 SYNTAX Integer32 (0.. 65535) 

 MAX-ACCESS read-only 

 STATUS current 

 DESCRIPTION 

 "Future: The maximum number of ports licensed for this MS." 

 DEFVAL { 18000 } 

 ::= { nodeInfo 1 }

 // 表示从属于nodeInfo的一个节点。其Oid为.1.3.6.1.4.1.7569.1.2.1.1.1.0可以通过get OID这样的结构得到这个属性的值,后续会说具体的方式。

    这里说一下SMI定义一个OBJECT-TYPE的结构。

SYNTAX表示值的类型为Integer32,SMI本身定义了很少的基本类型和一个复合类型Sequences. MAX-ACCESS 访问权限,这个在MibBrowers中read-only表示为一个叶子,write表示为一个笔尖
alarmTable OBJECT IDENTIFIER ::= { msMIBObjects 23 } 

alarmEventTable OBJECT-TYPE 

 SYNTAX SEQUENCE OF AlarmEventEntry 

 MAX-ACCESS not-accessible 

 STATUS current 

 DESCRIPTION 

 "A list of alarm status history entries." 

 ::= { alarmTable 3 } 

alarmEventEntry OBJECT-TYPE 

 SYNTAX AlarmEventEntry 

 MAX-ACCESS not-accessible 

 STATUS current 

 DESCRIPTION 

 "An entry in the Alarm Event Table." 

 INDEX { aleEventIndex } 

 ::= { alarmEventTable 1 } 

AlarmEventEntry ::= 

 SEQUENCE { 

 aleEventIndex Unsigned32, 

 aleSequenceID Unsigned32, 

 aleEventTime DateAndTime, 

 aleEventType EventType, 

 aleAlarmID Unsigned32, 

 aleAlarmText DisplayString, 

 aleAlarmSeverity AlarmSeverity, 

 aleInstanceID Unsigned32, 

 aleSlotNumber Unsigned32 

aleEventIndex OBJECT-TYPE 

 SYNTAX Unsigned32 (1.. 2000 ) 

 MAX-ACCESS not-accessible 

 STATUS current 

 DESCRIPTION 

 "This object is used as a key attribute to 

 specify the row entry in this table." 

 ::= { alarmEventEntry 1 } 

aleSequenceID OBJECT-TYPE 

 SYNTAX Unsigned32 

 MAX-ACCESS read-only 

 STATUS current 

 DESCRIPTION 

 "Unique sequential event identification number." 

 ::= { alarmEventEntry 2 } 
// 关键来了,这里定义了一个Table,SMI中使用SEQUENCE 来定义复杂的结构,该结构可以看做是一个表,然后可以通过get,getNext来遍历这张表中的内容。
alarm001 NOTIFICATION-TYPE 

 OBJECTS { aleSequenceID, aleEventType, aleAlarmID, aleInstanceID, 

 aleAlarmText, aleAlarmSeverity, aleEventTime, aleSlotNumber } 

 STATUS current 

 DESCRIPTION 

 "External alarm 1 has been triggered. Text and severity 

 of this alarm are user-configurable. This alarm is 

 deactivated when the external contact is cleared." 

 --#SUMMARY "Alarm #001: %s. Slot: %d Event type: %d Severity: %d Instance: %d Sequence: #%d" 

 --#ARGUMENTS {4,7,1,5,3,0} 

 --#SEVERITY MAJOR 

 --#TIMEINDEX 10 

 --#STATE OPERATIONAL 

 ::= { msTraps 11 } 

// 这个注意NOTIFICATION-TYPE,其定义了一个Trap消息,还定义了该trap消息中的内容是使用了AlarmTable中的内容。

好了基本上一个网元在设计的时候都是先去申请OID节点,然后设计这个MIB文件座位开发的标准。

然后我们使用MibBrowser导入它。

下载安装MibBrowser打开它。


点击File- Load MIBS,选择一个mib文件打开就会得到上面的样子了。

我们再来看看其他功能。

1. get

在左树中选择要操作的节点, 最上面Address中输入网元地址,这里是笔者自己写的一个模拟器,后面会把模拟器的代码奉上。 Advanced可以设置SNMP的版本,一个用来身份验证的Community和端口 Operations选择为Get,此外还能选择为Getnext walk等。 点击Go.截图没截到 这样就完成了一个请求操作,在后下的列表中会返回结果

2. getNext

    与1相同,只是Operations设置为GetNext

3. walk

    与1相同,Operations设置为walk,这个的返回结果会是一个列表。会默认轮询调用getNext获取整个Mib结构的所有值。


4, trapReceiver

打开TrapReceiver. Tool- Trap Receiver.

 按照5中的方式发送Trap

然后看到结果:

输入一些信息,点击SendTrap,在4中看结果

 

好了基本就这么多的功能了,因为SNMP本身就是很简单的协议。这些功能也是我们之后在开发中要用代码实现的。

 

Linux SNMP服务

这个有可能需要安装,也是比较好用的。主要的命令格式是:

snmpget -v2c -c CONV 10.85.134.194 .1.3.6.1.2.1.1.1.0

snmpwalk -v2c -c CONV 10.32.147.19:10161 1.3.6.1.4.1.7569.1.2.1.28.1

这个一看明了了吧, -v2c是版本, -c是Community, 然后是ip:port oid.

Linux上开发必备

 

SNMP4J

 这个是下一篇要说的内容,是基于Java的开源的开发SNMP的包。下一篇具体说。


什么是SNMP监控 在维护设备和数据的过程中,企业可能面对着数据量过大、数据维护技术不足、管理技术分散等问题,而运用SNMP系统,可以有效的帮助企业避免这些问题,提升自身的竞争力
SNMP:简单网络管理协议 基于 TCP/IP 的网络管理包括两部分:网络管理站 (manager) 和被管理的网络单元(被管设备)。这些被管设备的共同点就是都运行 TCP/IP 协议。管理进程和代理进程之间的通信有两种方式,一种是管理进程向代理进程发出请求,询问参数值,另一种方式是代理进程主动向管理进程报告某些重要的事件。