文章较长,此文章背景:毕业设计,直接去搜索我的毕业设计选题,当时还傻傻的用百度,在百度文库和CSDN等下载了很多论文。搜索到的论文有以下几种:
1)完全胡扯,听说MIB“树状”模型,直接就有写ta用二叉树实现了,恩,我上次用了Java和氧化还原反应成功拿到抓到外星人,你信不信?
2)介绍了很多知识背景,然后一下子ta们就实现了,他们做了什么工作很少涉及。
3)有位盆友一直写自己在做这件事情,ta也说网上有很多方法,但是没有有价值的方法,ta决定实现一个,但是,ta再也没有更新ta的博客。o(╯□╰)o
4)platform for windows XP sp2中提供了一个程序,无法获取动态的信息,而且程序相当复杂,当时分析了很久很久,想要自己改改,后来改来改去自己也糊涂了,放弃了。
最后在一个论坛上有位网友提供了一个网址(现在无法FQ,网址被我删掉了),看到了一个老外实现了MIB的扩展,并且教给我让它运行的方法(他的方法思路对,但是有些步骤搞不定,最后还是在以前那些论文中找到了解决的方式),瞬间对能勤勤恳恳工作的人充满敬意,就像带我做毕业设计的老师。老师甚至提前和我说,你就是做不出来也让你通过,只是你要真正踏实的去试着做,至少让后来人知道有哪些方法经过试验时不可行的,当时很感动。
经过一段时间的尝试,最后我终于实现了,修改别人的程序,根据SNMP的运作规律,查看着MSDN,就做出来了,最后写论文,这个就是论文的全部内容,替换了”毕业设计”字眼。
经过这个过程,对于C语言有了新的理解:以前说它厉害,大家都说它有指针,可以直接操作内存云云。后来忘了哪里看到的“C语言的强大不在于它提供了指针,它可以写系统...它强大是因为无数人用C语言解决了无数的问题,它用自己的实用性证明了自己的强大。”同感。
博主不打算提供源程序,可以提供dll文件。因为这个题目很容易作为本科生的毕业论文题目和研究生期刊上的题目,给你源程序是害了你。
接下来按照:知识背景——方案确定——方案执行——验证——结论 来组织这篇文章。
【摘要】
SNMP(简单网络管理协议)用于管理互联网中的各种网络设备。管理站和代理端使用MIB定义了统一的接口,MIB定义了被管理对象。本毕业设计在研究SNMP中MIB语法和深入了解SNMP工作原理的基础上,探索扩展MIB的方案,所扩展的MIB不仅包括静态信息,并且包括设备运行的动态信息,例如系统温度、时间、压力、角度等。作者在Windows平台运用微软提供的WINSNMP编程实现MIB的扩展,验证这一方案的正确性和可行性。
【关键词】
SNMP;MIB扩展;OID;DLL
0引言
SNMP(简单网络管理协议)用于管理互联网中的各种网络设备,可及时获得设备的配置、参数、状态等。通常,管理人员操作的用于网络管理的设备称为管理站,被管理的网络设备称作代理端。MIB定义了被管理对象,管理站和代理端使用MIB表示统一的接口信息数据。根据ISO规定,任何运行SNMP服务的设备都必须要支持标准的MIB文件中MIBⅡ规定的被管理对象。然而,在实际操作中,因为代理端设备的多样性和实际工作的需求的多变性,管理站需要从代理端中获取的信息往往不存在于标准的MIB中,这就要求管理人员根据管理工作的需求,在不影响网络设备的工作状态的前提下,增加指定的管理对象,并且增加的对象能够被运行SNMP代理服务的该网络设备识别,纳入自身的SNMP代理服务中。添加了管理对象后,管理站能够像管理其它对象一样地管理新增的被管理对象,并且可以在MIB文件中查看新增加的被管理对象。
目前基于SNMP的MIB的扩展已经在工业上实现,但是大部分公司都不公开实现的技术细节。本毕业设计的课题就是希望通过学习,研究SNMP,探索一种易操作的扩展MIB的方法,实现在 SNMP 代理服务中增加被管理对象,增加的被管理对象可以响应管理站的操作,发送静态不变的数据,和实时更新数据,例如系统温度、时间、压力、角度等(根据设备不同,新增加的被管理对象有所不同)。并且在一种平台上验证这些方案的可行性。
1 SNMP介绍
1.1 网络管理概述
网络管理包括对硬件、软件和人力的使用,综合和协调,以便对网络资源进行监视,测试,配置,分析,评价和控制,保证网络系统正常的运行,按照设计的目标,发挥应有的功能。
网络管理之所以存在,硬件上的原因是运行在网络中的设备会出现故障,通信线路会出现延时,中断,过多的用户争抢有限的资源会造成网络性能的下降。网络管理则可以收集,分析网络运行的数据,展示网络运行状况的性能指标,进而判断,预测网络的故障,为网络优化及改造环境提供基础运行数据支持。行政管理的需要也是网络管理存在的重要原因,根据网络管理得到的数据进行网络设备的分发,配置,而且还可以通过网络管理记录不同的单位、部门、个人获得的网络设备的数量和工作状态[1]。
1.2 SNMP的诞生
早期的计算机网络规模小,结构简单,因此网络管理活动也相对简单。随着计算机技术的迅速发展,网络规模日益扩大,结构也越来越复杂,原来的简单、粗陋的管理方式已经不再适应现代的计算机网络,网络管理必须向高度集中和高度智能化的方向发展。
在此期间,先后出现了多种网络管理标准。最早致力于网络管理标准化工作的是国际标准化组织(International Standards Organization,ISO),它是网络互连协议OSI,(Open System Interconnection Reference Model,开放系统互联参考模型)的制定者。ISO指定的第一个网络管理标准为CMIS/CMIP(The Common Management Information Service/Protocol),也是基于OSI模型的,并在当时的网络管理中得到了初步的应用。同期出现的其他网络管理协议还有高层实体管理系HEMS(High Level Entity Management Systems),简单网关监控协议SGMP(Simple Gateway Monitoring Protocol)等。
随着TCP/IP和Internet的迅速普及,1987年Internet的管理机构IAB(Internet Activities Board)认为有必要为基于TCP/IP技术的网络制定新的网络管理标准。其长期的目标是在CMIS/CMIP基础上,制定一套功能完善,适用于TCP/IP协议栈的网络管理协议CMOT(Common Management Information Services 安定Protocol Over TCP/IP)。然而,业界对基于TCP/IP的网络管理标准的需求是如此的迫不及待,已经等不及CMOT的推出了。为了应急,IAB决定将已有的SGMP修订,完善,作为一种临时的网络管理解决方案,这就是后来一统天下的SNMP[2]。
1.3 SNMP的发展
由于SNMP具有简单、易于实施和可以扩充等优点,一经推出就得到了广泛的应用和支持,显示了强大的生命力。截至2014年4月,SNMP已经获得了包括HP、IBM、CISCO、华为、Microsoft在内的数百家厂商的支持,成为了网络管理领域事实上的工业标准。至今,SNMP已经推出了8个版本,但是在实际应用中真正广泛使用的只有3个,分别是SNMPv1、SNMPv2,、 SNMPv3,它们分别诞生于1989年、1995年、1998年,SNMPv2新增加了数据定义和协议操作,并且与SNMPv1的安全机制结合。SNMPv3在SNMPv2的基础上增加了安全性,在提供了3对SNMP消息的加密和认证措施的同时,也加强了MIB的访问的控制[3]。
1.4 SNMP的组成
1.4.1 SNMP组成概述
SNMP由三个部分组成:管理信息的结构与标识(Structure and Identification of Management Information,SMI)、信息管理库(Management Information Base,MIB)和SNMP协议本身。SMI目前使用的有SNMPv1、SNMPv2、SNMPv3 三个版本,它定义了命名对象和定义对象类型(包括范围和长度)的通用规则,以及把对象和对象的值进行编码的规则,确定网络管理数据的语法和语义无二义性。MIB遵循SMI规范,定义具体的管理信息,它创建了命名对象,并且定义了对象的属性。SNMP协议定义了管理站和代理之间所交换的分组格式,所交换的分组包包含个代理中的对象(变量)名及其状态(值)。SNMP协议负责读取和改变这些值。
为了更好的理解,我们以C语言的相关语法来说明SMI、MIB和SNMP协议的作用。如C 语言语句:int sum; sum = 0; 在这段程序中,变量的命名可以用数字,字母,下划线,但是不能以数字开始,命名规则相当于SMI,int sum ;表示sum是整数类型,MIB的作用是规定被管理对象的属性,在声明了sum后,程序进行用0给sum赋值操作,类似的,SNMP协议的作用是按照SMI定义的规则,存储,改变和解释这些由MIB说明的对象的值[4]。
1.4.2 SNMP组成分述
1.4.2.1管理信息结构SMI
SMI使用的是抽象语法记法1(即ISO制定的ASN.1)来定义数据类型。但又增加了一些新的类型,所以说,SMI既是ASN.1的子集,又是ASN.1的超集。SMI规定,所有的被管理对象都必须处在对象命名树(object naming tree)上。对象命名树上的节点带有标号,这样根据标号和“.”组成的序列,定位到任何节点,这个序列称作OID,我们对管理对象的查看,设置都是对被管理对象对应的OID来操作。此处引用了树的概念,来说明被管理对象的结构。需要注意的是,我们可以用树去感性地描述SMI的结构,但是不能用数据结构中的树去理解SMI。
SMI的数据结构来自ASN.1,并且对ASN.1进行扩展得到,与数据结构与算法中的树不是一个概念。要表示SMI的节点,SNMP中有特定的数据结构去表示。对象命名树的根没有名字,它有三个顶级对象,都是世界上著名的标准制定单位,即ITU-T(0)、ISO(1)、ISO/ITU-T(2)(前两个组织的联合体),ISO下面是它认可的组织成员org(3),org(3)下面是美国国防部dod(6),dod(6)有个分支为internet(1),internet(1)下为mgnt(2),mgnt(2)下为mib-2(1),所以mib-2的OID则为1.3.6.1.2.1(iso.org.dod.internet.mgmt.mib-2),ISO规定,任何组织和个人,凡是使用SNMP必须实现查询mib-2定义的管理对象,并且任何组织和个人都不允许在mib-2下建立私有节点。internet(1)下有个节点为private(4),private(4)下有节点enterprises(1),enterprises的OID则为(1.3.6.1.4.1),enterprises(1)下可以私有化自己的节点并且定义功能,实际上,截至2014年4月27日,enterprises(1)下已经有416家企业或者组织申请了自己的私有节点,其他公司在产品中使用1至416作为产品的标号是不符合行业规范的。如果要使用,应该先在代理端查询MIB文件,检测相关的OID是否已经被使用。
本毕业设计使用我的DELL OPTIPLEX 380作为代理端,在1至416中(包含1,、416),311不能被使用,原因是我安装了微软的扩展代理程序,使用SNMP管理软件检测CPU使用率等。所以,在本次毕业设计中,只要自己的私有后节点父节点的标号不是311,理论上都可以用于SNMP扩展,是否可行需要验证。
SMI把数据类型分为两大类:简单类型和结构化类型。简单类型是最基本的,直接使用ASN.1定义的类型。下表是几种最主要的简单类型。
表1 几种最主要的SMI简单类型
类型 |
大小(单位:字节) |
说明 |
INTERGER |
4 |
在-231到231-1之间的整数 |
Interger32 |
4 |
和INTERGRER相同 |
Unsigned32 |
4 |
在0到232-1之间的无符号数 |
OCTET STRING |
可变 |
不超过65535字节长的字符串 |
OBJECT IDENTIFIER |
可变 |
对象标识符 |
IPAddress |
4 |
由4个整数组成的IP地址 |
Counter32 |
4 |
可从0增加的到232的整数;当它达到最大值的时候就返回0 |
TimeTicks |
4 |
记录时间的计数器,以1/100秒为单位 |
BITS |
- |
比特串 |
Opaque |
可变 |
不解释的串 |
SMI使用ASN.1制定的基本编码规则BER(Basic Encoding Rule)进行数据的编码。BER指明了每种数据的类型和值。在发送端使用BER编码,可以把用ASN.1所表述的报文转化成为唯一的比特序列。在接收端用BER解码,就可以得到该比特序列所表示的ASN.1报文。ASN.1把所有数据元素都表示为T-L-V三个字段组成的序列。T(Tag)定义数据的类型,L(Length)定义V字段的长度,V(Value)定义数据的值[5]。
1.4.2.2管理信息库库MIB
所谓“管理信息”就是指在因特网的网管框架中被管理对象的集合。被管理对象必须处于可供管理程序读写的状态。这些被管理对象构成了一个虚拟的信息存储器,所以被称为管理信息库MIB。只有在MIB中的对象才是SNMP所能够管理的。节点mib-2(1.3.6.1.2.1)下子树定义的管理对象,凡是支持SNMP的设备都必须实现。
1.4.2.3 SNMP的协议数据单元和报文
SNMP的操作可以分为两大类:一是“读”操作,用get报文、getnext报文来检测各被管理对象的状态;一是“写”操作,用set报文来改变被管理对象的状况。SNMP是不完全的探寻协议,有严重事件发生时可以不经过探寻发送某些消息——陷阱Trap,表示捕捉到异常事件,同时也使用周期性的探寻以维持对网络资源的实时监测。
SNMP使用无连接的UDP,因此在网络上传送SNMP报文的开销较小。但UDP是不保证可靠交付的。SNMP使用UDP的方式比较特殊。在运行代理程序的服务器使用熟知端口161来接收Get和Set报文和发送响应报文(与熟知端口通信的客户端使用临时端口),但运行管理程序的客户端则使用熟知端口162来接受来自各代理的Trap报文。SNMP共定义了如表2所示的8种类型的协议数据单元【RFC 3416】,其中PDU编号为4的已经废弃了。在PDU编号后面对应的是T字段值。
表2 SNMP定义的协议数据类型单元
PDU编号(T字段) |
PDU名称 |
用途 |
0(A0) |
GetRequest |
管理者从代理读取一个或一组变量的值 |
1(A1) |
GetNextRequest |
管理者从代理读取MIB树上的下一个变量的值(即使不知道此变量的名也行)。此操作可以反复进行,特别是按顺序一一读取列表中的值很方便 |
2(A2) |
Response |
代理端向管理站或者管理站向自身发送的对五中Request报文的响应,并提供差错码、差错状态等信息 |
3(A3) |
SetRequest |
管理者对代理的MIB值进行设置 |
5(A5) |
GetBulkRequest |
管理者从代理读取大数据块的值(或大的列表中的值) |
6(A6) |
InformRequest |
管理者从另一远程管理者读取该管理者控制的代理中的变量值 |
7(A7) |
SNMPv2Trap |
代理端向管理站报告代理中发生的异常事件 |
8(A8) |
Report |
在管理者之间报告某些类型的差错,目前尚未定义 |
和大多数TCP/IP协议不同的是,SNMP报文没有固定的字段。相反,它使用标准的ASN.1编码。因此,SNMP报文人工编码和理解都比较困难。一个SNMP报文有四部分组成,即版本、首部、安全参数和SNMP报文的数据部分。表3为SNMP报文的格式,表4是SNMP报文数据部分的组成,
表3 SNMP的报文格式
IP首部 |
UDP首部 |
版本 |
首部 |
安全参数 |
SNMP报文的数据部分 |
表4 SNMP报文的数据部分
上下文引擎ID |
上下文名 |
PDU类型 |
请求ID |
差错状态 |
差错索 引 |
名 |
值 |
名 |
值 |
…… |
请求标识符(Request ID)
由管理进程设置的4字节整数值。代理进程在发送响应报文是也要返回此请求的标识符。由于管理进程可同时向许多代理发送请求读取变量值的报文,因此设置了请求标识符可使管理进程能够识别返回的是对应于哪一个请求报文。
差错状态(error status)
在请求报文中,这个字段是0。当代理进程响应时,就填入0~18中的一个数字。例如0表示noError)(一切正常),1表示tooBig(代理无法把回答装入到一个SNMP报文中),2表示noSuchName(操作指明了一个不存在的变量),其余的信息请查阅【RFC 3416】。
差错索引(error index)
在请求报文中,这个字段是0。在代理进程响应时,若出现noSuchName、badValue或readOnly的差错,代理进程就设置一个整数,指明由差错的代理量在变量表中的偏移。
变量绑定(variable-bindings)
指名一个或多个变量的名和对应的值。在请求报文中,变量的值应忽略(类型是NULL)。
2 扩展MIB设计方案
通过对 SNMP 的学习和分析,我设计了两种基于SNMP扩展MIB的方案,包括实现静态扩展MIB和动态扩展MIB。静态扩展MIB是建立扩展MIB文件,MIB作为管理站和代理端的统一接口,告之管理站可以管理的信息,并且告之代理端应该存在的被管理对象。此文件可由软件解析为MIB树用于网络管理,也可以作为程序员扩展MIB的指导。动态扩展MIB是根据可以扩展的OID用开发包或者操作系统支持的API编程实现MIB扩展。所扩展的OID可以由静态扩展的得到的MIB文件得到,动态扩展MIB将加入到代理端SNMP Service中。该方案的说明可用下图表示:
图1 静态扩展MIB和动态扩展MIB方案说明
2.1 静态扩展MIB
扩展MIB即扩展SNMP管理的对象,如果已经知道管理站和代理端使用MIB统一接口,在代理端有MIB文件,只要管理端获得该MIB文件,就可以解析出被管理对象是什么,它的OID是多少,它的作用和权限等具体内容。静态添加的思路就是先根据SMI命名规则,找到可以扩展的节点,并且以此节点为父节点,增加OID并且定义。
通过阅读MIB文档,可以知道对于mgmt(1.3.6.1.2)下的mib-2子树(OID为:1.3.6.1.2.1)是不能添加新节点的,不能因为mib-2具有与自己想要增加的管理对象相似就把新节点命名在mgnt(1.3.6.1.2)树下,在这里添加不会产生以mgmt索引的OID。实际上,SNMP中早已经有规定,如果需要添加私有节点。可以添加在private中enterprises(.1.3.6.1.4.1)下。添加前需要检查自己要添加的OID是否合法。除了查看系统的MIB文件外,更简单的做法是用MIB浏览器的get命令查询要添加节点。如果没有返回值,可以用getnext再次查询此OID,若依旧没有返回值,则说明可以在此代理端以这个OID扩展代理端的MIB用于对代理端的管理。研究人员也可以从此MIB文件中查看代理端被管理对象。
需要特别说明的是,随着SNMP发展,很多公司都向IAB申请了自己公司的私有MIB并且得到许可。例如1.3.6.1.4.1属于CISCO公司,1.3.6.4.1.311属于微软公司,事实上,1.3.6.1.4.1.1~1.3.6.1.4.1.416都已经被各公司私有所占据。如果我们将这些OID用于自己公司生产的产品投入市场会造成混乱,为将来的管理带来隐患。本次毕业设计进行中,对在毕业设计要用到的代理端,通过查询验证得到1.3.6.1.4.1.311已经被占用,除此OID外(包括它的子OID),可以使用其它任何OID。
通过阅读RFC1405,发现想要构建可以用于SNMP的MIB文件,需要按照特定的ASN.1语法来写MIB文件。熟练掌握SMI后可以手写MIB文件,这样方法的差错纠错上需要文件创建者完成,不便于推广。可以采用另外一种更加节约人力成本,更加可靠的方式来构建MIB文件,实现静态扩展MIB。即使用业内早已存在的软件工具构建属于自己的MIB文件。如:MG-SOFT MIB Brower提供创建MIB文件,检测MIB语法合法性和导出MIB文件的g功能,我们就用这个软件,基于其自带的SNMPv2-SMI来创建自己的MIB文件,扩展的节点命名为szulab,它的OID是1.3.6.1.4.1.15。
2.2动态扩展MIB
上述静态扩展MIB的方法并不是在代理端加入服务,此文件拷贝到代理端中,并不会被系统服务识别并且添加到系统服务。静态扩展MIB得到的MIB文件是为了动态扩展MIB打基础,静态扩展MIB添加相当于给了管理者一张管理对象的地图,有了这张地图,管理者能够根据需要找到被管理对象的OID,根据MIB文件的描述对被管理对象进行操作,更好的进行网络管理。对于编程人员或者产品设计人员而言,静态扩展MIB文件提供了许多信息,诸如需要扩展的被管理对象的OID以及被管理对象的功能描述,操作权限,数据类型等等,开发人员只有获得这些信息,才能在产品中扩展MIB,创建相应的被管理对象。
动态添加MIB的方法可以用Visual Studio 6.0编写程序,当运行该程序的时候,由程序完成将扩展的被管理对象加入到系统的MIB中,随后在管理站运行管理程序,通过新添加的管理对象的OID,对代理端扩展的被管理对象的信息进行操作,实现动态扩展MIB。
3核心技术及实现细节
3.1 静态扩展MIB的操作
3.1.1打开MIB Builder,在打开的窗口中会弹出一个新建文件向导,并可以查看使用说明。点击取消,不使用向导建立文件。该软件支持建立SNMPv1和SNMPv2两种类型MIB文件,本工程需要建立的是SNMPv2版本的MIB文件,因为用于动态扩展MIB,所以建立的MIB文件应该符合SMI标准。单击“FILE”-“NEW”-“SNMPv2Model”,在“Model Name”一栏输入“SZULAB-MIB”,单击“Apply”。
图2 建立SZULAB-MIB
3.1.2 单击“FILE”-“import”-选择“SNMPv2-SMI.smidb”-“导入”。在“SNMPv2-SMI.”窗口中单击iso节点,展开树,找到命名为enterprises的节点,右击该节点,选择“copy”。选择“SZULIB-MIB”窗口,右击节点“MIBTREE”,选择“Paste”。弹出对话框提示“enterprises”没有父节点,是否将enterprises的父节点一并拷贝过来。选择“yes”。
图3 复制enterprises
图4 拷贝enterprises到SZULAB-MIB中
3.1.3 在“SZULIB-MIB”窗口中展开iso,找到enterprises节点,将右侧OBJECT IDENTIFIER拖动到enterprises下,即可将扩展的私有节点添加到enterprises下。在Name中输入节点的名字是“szulab”,OID设置为“1.3.6.1.4.1.15”,点击“Apply”。
图5 enterprises下新建szulab结点
3.1.4 “szulab”添加节点,即扩展的MIB,这些为我们定义的管理对象,同时添加MIB文件必要的模块,使构建的MIB文件符合SNMP标准。
3.1.4.1拖动OBJECT-TYPE(scalar)到“szulab”节点下,Name中输入“pcmodel”,OID设置为“1.3.6.1.4.15.1”,类型选择为“OCTET STRING”表字符串类型,“MAX Access”选择“read-only”,“status”选择current,表该对象必须实例化,但是实现后要自动删除实例化。“pcmodel”描述的是计算机的生产厂商和产品型号,该节点用来检测扩展MIB能否得到代理端的静态信息,这个信息是不会变化的。
图6 在szulab下添加被管理对象pcmodule并设置属性
3.1.4.2拖动OBJECT-TYPE(scalar)到“szulab”节点,Name中输入“labroom”, OID设置为“1.3.6.1.4.15.2”,“MAX Access”选择“read-write”,其余设置与“pcmodel”相同,“labroom”描述的是计算机所在的实验室和在该实验室的编号,这个值是可设置的,该节点用来检测扩展MIB能否支持读取静态数据,并且检测能否更改代理端的数据。
图7 在szulab下添加被管理对象labroom并设置属性
3.1.4.3拖动OBJECT-TYPE(scalar)到“szulab”节点,Name中输入“seconds”, OID设置为“1.3.6.1.4.15.3”,类型选择为“INTEGER”,“MAX Access”选择“read-write”,“status”选择current,单击“syntax”在“Value or Range”中输入“FROM 0 TO 60”,单击“add”生效。“seconds”描述的是计算机的秒数,这个数值是不断变化的,该节点用来测试扩展MIB能否获得动态的数据。
图8 在szulab下添加被管理对象seconds并设置它的取值范围
图9 设置后的节点seconds的信息
3.1.4.4 拖动MOUDLE-IDENITY到“szulab” 节点,Name中输入“szulabModule”,OID设置为“1.3.6.1.4.15.4”,Organization中输入“SZULABMAMT”,即深圳大学实验室管理委员会。这个节点记录的是该MIB文件的更新信息,不属于被管理对象的一部分。
图10 添加szulabModule记录MIB文件更新信息
3.1.4.5拖动OBJECT-GROUP到“szulab” 节点,Name中输入“szu”,单击“Objects”,将右侧窗口的成员删除,将左侧的“pcmodel”、“labroom”及“seconds”添加到右侧窗口。
图11 添加GROUP后将被管理信息所在的节点加入该组中
图12 添加了szu(GROUP)后
3.1.5 MIB文件的检测和导出
单击“check SMI consistency”,弹出“no message(s)”说明没有错误,单击“export”,单击“浏览”选择路径,文件名字输入“SZULAB-MIB.MIB”,该文件可以用记事本打开,属于文本类型。在Description中可以修改每个对象的含义,用英文描述节点功能。
图13 导出MIB文件
下面为MIB文件中节点的描述:
…………………………………………………………….. …………….. …………….. ……
--
-- Node definitions
--
-- 1.3.6.1.4.1.15
szulab OBJECT IDENTIFIER ::= { enterprises 15 }
-- 1.3.6.1.4.1.15.1
pcmodel OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-only
STATUS current
DESCRIPTION
"Show the management(mamt) the pc information by company+model.such as dell380, lenovo E40."
::= { szulab 1 }
-- 1.3.6.1.4.1.15.2
labroom OBJECT-TYPE
SYNTAX OCTET STRING
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"Show the management(mamt) which labroom number the pc works."
::= { szulab 2 }
-- 1.3.6.1.4.1.15.3
seconds OBJECT-TYPE
SYNTAX INTEGER (0..60)
MAX-ACCESS read-write
STATUS current
DESCRIPTION
"Show the second of the pc system."
::= { szulab 3 }
-- 1.3.6.1.4.1.15.5
szu OBJECT-GROUP
OBJECTS { pcmodel, labroom, seconds }
STATUS current
DESCRIPTION
"mumbers include pcmodel labroom seconds."
::= { szulab 5 }
END
--
-- SZULAB-MIB.my
--
…………………………………………………………………………………………………
3.1.6 静态扩展MIB文件的意义
经过静态扩展MIB文件,管理者能够获取新添加的管理对象的信息,包括名字、OID、操作权限。静态添加相当于给了管理者一张管理对象的地图,有了这张地图,管理者能够根据需要找到被管理对象的OID,根据MIB文件的描述对被管理对象进行操作,更好的进行网络管理。对于编程人员或者产品设计人员而言,静态扩展MIB文件提供了许多信息,诸如需要扩展的被管理对象的OID以及被管理对象的功能描述,操作权限,数据类型等等,开发人员只有获得这些信息,才能在产品中扩展MIB,创建相应的被管理对象。使用MIB Builder查看静态扩展MIB所创建的MIB文件,可以看到扩展MIB后得到的MIB树,szulab的叶节点为扩展MIB中的被管理对象,如下图:
图14 解析SZULAB-MIB文件得到的MIB树
。
3.2动态扩展MIB
3.2.1 调研,确定实现方案
SNMP属于系统服务的一部分,所以动态扩展MIB就是要通过程序将新增加的管理对象动态的添加到系统的MIB中,实现动态扩展MIB。目前,用于SNMP开发的工具有SNMP++和WINSNMP,SNMP++为开源的软件开发包,查看SNMP++的提供的函数列表后发现,SNMP++用于管理站软件的编写,而不提供扩展MIB的相关功能。WINSNMP是微软提供的用于SNMP开发的API,不仅可以定义管理站一方的相关操作和行为,而且可以在代理端定义SNMP服务的相关行为。所以,我们确定使用WINSNMP作为开发工具,尝试动态扩展MIB,因为SNMP服务一直运行,此程序不仅要在MIB树中添加节点,而且当管理站查询添加的被管理对象时,被管理对象还要进行Response,所以要编程实现应答模块。根据微软MSDN里面对于WINSNMP函数的使用说明,了解到扩展SNMP服务可以通过开发一个DLL文件,并且通过修改注册表,将此程序纳入到系统SNMP代理服务的一部分的方式实现MIB扩展,扩展MIB后只要涉及新添加节点的有关操作,如get,getnext,set,就会调用DLL中相关函数[9]。程序功能如下图所示:
图15 SNMP扩展代理的结构框图
3.2.2 程序结构
运行visual studio 6.0,新建工程,工程类型选择Dynamic-link Library,所创建的DLL文件包含3个导出函数SnmpExtensionInit、SnmpExtensionQuery和SnmpExtensionTrap,这三个函数的参数的意义及函数内部的编码接下来将详细说明。此外,程序中必须包含扩展MIB的第一个结点说明、被管理对象的定义,并且这些定义需要符合SMI。该程序调用了WinSNMP API。所以创建程序后需要在工程菜单中选择设置选项,在链接选项卡中的“对象/库模块”一栏添加SnmpAPI.lib。此外,该DLL的编写过程调用了其它WinSNMP API实现动态扩展MIB的功能,完整的源程序和项目文件请查看附件,下面是对源程序进行说明。
3.2.2.1 扩展MIB的定义
………………………………………………………………………………………………………
UINT g_unMyOIDPrefix[] = {1, 3, 6, 1, 4, 1, 15};
这是扩展MIB私有节点szulab的OID的定义。在snmpExtensionInit中,将其作为第一个写入SNMP服务的扩展MIB结点,此处需要声明。
具体的扩展的管理对象的ID定义如下:
UINT g_unpcmoduleOid[] = {1};
UINT g_unlabroomOid[] = {2};
UINT g_unsecondsOid[] = {3};
这样既定义了私有节点szulab的OID,又定义了具体的被管理信息pcmodule(OID:1. 3. 6. 1.4. 1. 15.1),labroom(OID:1. 3. 6. 1.4. 1. 15.2),seconds(OID:1. 3. 6. 1.4. 1. 15.30)的OID。
………………………………………………………………………………………………………
MIB中每个被管理对象用结构体进行描述
struct MIB_ENTRY
{
AsnObjectIdentifier asnOid;
void * pStorageValue;
CHAR * szStorageName;
BYTE chType;
UINT unAccess;
MIB_ENTRY* pMibNext;
};
其中,AsnObjectIdentifier是snmp.h中定义的结构体类型,描述OID的程序和具体的OID的值。
typedef struct
{
UINT idLength;
UINT * ids;
} AsnObjectIdentifier;
由此,我们使用信息如下描述被管理对象:OID、值、名称、数据类型、访问权限、是私有节点的第几个孩子。
………………………………………………………………………………………………………
由3.1静态扩展MIB的工作可知,扩展MIB的包含三个管理对象,pcmodule(计算机型号)、labroom(计算机所在实验室)、seconds(计算机秒数)。程序中采用MIB_ENTTRY类型的结构体数组对这三个管理对象进行定义:
MIB_ENTRY g_MyMibTable[] = {
{
{OID_SIZEOF(g_unpcmoduleOid),g_unpcmoduleOid},
&g_pcmodule ,
"pcmodule",
ASN_OCTETSTRING,
SNMP_ACCESS_READ_ONLY,
&g_MyMibTable[1]
},
{
{OID_SIZEOF( g_unlabroomOid), g_unlabroomOid},
&g_labroom,
"labroom",
ASN_OCTETSTRING,
SNMP_ACCESS_READ_WRITE,
&g_MyMibTable[2]
},
{
{OID_SIZEOF(g_unsecondsOid),g_unsecondsOid},
&g_seconds,
"seconds",
ASN_INTEGER,
SNMP_ACCESS_READ_WRITE,
NULL
}
};
这里用结构体数组对扩展MIB中的被管理对象进行描述,并没有进行初始化,初始化的工作在SnmpExtensionInit中完成。g_pcmodule、g_labroom、g_seconds为char类型的指针变量,用于接收pcmodule、labroom、seconds的值。
………………………………………………………………………………………………………
3.2.2.2 扩展代理初始化函数BOOL SNMP_FUNC_TYPE SnmpExtensionInit
(
DWORD dwUptimeReference,
HANDLE *phSubagentTrapEvent,
AsnObjectIdentifier *pFirstSupportedRegion),
这些参数为实参,DLL第一次运行的时候SNMP Service调用SnmpExtensionInit函数将扩展MIB纳入到系统服务中,同时初始化被管理对象,讲过调用,可以用get,getnext命令查看被管理对象的信息,该函数只调用一次,静态信息的获取依靠初始化已经足够,对于动态信息的获取,还需将动态信息获取函数写入到SnmpExtensionQuery中,在snmpExtensionQuery中将详细介绍,SnmpExtensionInit是扩展代理API的一个元素。参数说明如下[10]:
dwUptimeReference [in]指定扩展代理的零时间(time-zero),扩展代理应该忽略这个参数,取而代之地它们应该调用snmpSvcGetUptime函数获取微软SNMP服务已经运行的厘秒数。因为dwUptimeReference这个参数保存流逝时间的以毫秒表示的DWORD值,所以此时间可以逼近0并反映一个不精确的时间间隔。
phSubagentTrapEvent [out]指向扩展代理传回SNMP服务的事件的句柄的指针。此句柄用于通知服务有一个或多个自陷要发送。此事件发送信号以后,SNMP服务将反复调用扩展SNMP代理的snmpExtensionTrap入口点直到函数返回FALSE为止。表明扩展代理再也没有自陷可以发送了。如果扩展代理没有产生自陷,phSubagentTrapEvent参数应该返回NULL值。SNMP扩展代理必须为自陷事件句柄分配和释放资源。当SNMP服务调用snmpExtensionInit函数时,扩展代理必须调用CreatEvent函数来分配事件句柄。扩展代理用phSubagentTrapEvent参数传递句柄到SNMP服务。当SNMP服务调用snmpExtensionClose函数时,扩展代理必须释放为自陷事件句柄分配的资源。
pFirstSupportedRegion [out]指向用于接收扩展代理支持的第一个MIB子树的asnObjectIdentifer 结构的指针。SNMP服务复制以后扩展代理以pFirstSupportedRegion参数返回的asnObjectIdentifer结构。扩展代理必须分配和释放有关原始结构的资源。
SnmpExtensionInit代码详细说明如下:
………………………………………………………………………………………………………
g_hSimulateTrap = CreateEvent(NULL, FALSE, FALSE, NULL);
*phSubagentTrapEvent = g_hSimulateTrap;
作用:第一句代码完成Trap事件的初始化,把它的句柄传递给SNMP服务。第二句代码,通知SNMP服务会调用SnmpExtensionTrap产生Trap信息,收集Trap报文。
………………………………………………………………………………………………………
*pFirstSupportedRegion = MIB_OidPrefix;
作用:将OID为1.3.6.1.4.1.15的结点szulab注册到系统SNMP服务中,此时该结点下的pcmodule,labroom,seconds也纳入到系统的SNMP服务中,此时查询这些被管理对象还不能获取准确信息,接下来要对这些被管理对象的值进行初始化。
………………………………………………………………………………………………………
g_pcmodule = (char*)malloc(sizeof(char)*64);
strcpy(g_pcmodule,"Thinkpad E40");
g_labroom= (char*)malloc(sizeof(char)*64);
strcpy(g_labroom,"347-012");
作用:为pcmodel和labroom这两个节点赋值,即给MIB_ENTTRY定义的被管理对象的值一个初值,接收赋值的。
SYSTEMTIME sys;
GetLocalTime( &sys );
g_seconds = sys.wSecond;
作用:利用系统函数计算时间,将系统时间秒数赋值给seconds。
………………………………………………………………………………………………………
3.2.2.3 解析SNMP请求函数BOOL SNMP_FUNC_TYPE SnmpExtensionQuery
(BYTE bPduType, SnmpVarBindList *pVarBindList, AsnInteger32 *pErrorStatus, AsnInteger32 *pErrorIndex)
当管理站要查询的OID指向扩展MIB时,系统会调用此函数解析SNMP请求,进行应答,参数说明如下:
bPduType [in]PDU请求类型,参数可以是SNMP_PDU_GET、SNMP_PDU_GETNEXT、 SNMP_PDU_SET,对应的是管理站对代理端执行的三种操作get、getnext、set。
pVarBindList [in/out]指向变量绑定列表的指针。
pErrorStatus [out]变量指针,此变量返回错误的状态结果。
pErrorIndex [out]指向返回错误索引的变量的指针
这些参数为实参,snmpExtensionQuery中主要代码解析如下:
………………………………………………………………………………………………………
SYSTEMTIME sys;
GetLocalTime( &sys );
g_seconds = sys.wSecond;
这段代码在已经在SnmpExtensionInit中使用,用于扩展的管理对象seconds赋值。为了给seconds节点以一个动态可变的值。每次对扩展MIB操作就会调用SnmpExtensionQuery进行响应,执行SnmpExtensionQuery中的代码,所以将seconds赋值语句写入此函数,使得管理站能够获得当前操作时的seconds的值。如果在该函数中没有这一段代码,查询seconds的信息时不会得到动态可变的值,而是固定的,在SnmpExtensionInit中得到的那个值。
………………………………………………………………………………………………………
Snmp.h
…………
typedef struct {
AsnObjectName name;
AsnObjectSyntax value;
} SnmpVarBind;
typedef struct {
SnmpVarBind * list;
UINT len;
} SnmpVarBindList;
…………
参考snmp.h中SnmpVarBind和SnmpVarBindList的定义,可知本程序中扩展MIB中包含三个变量,它们的名与值分别是:pcmodule和Thinkpad E40,labroom和347-12,seconds和计算得到的系统时间。变量绑定列表的指针可以指向每个被管理对象的名与值的绑定的序号,或者指向变量列表的长度(len),本程序中变量列表的长度是3。
for(UINT i=0;i<pVarBindList->len;i++)
{
*pErrorStatus = SNMP_ERRORSTATUS_NOERROR;
switch(bPduType)
{
case SNMP_PDU_GET:
*pErrorStatus = GetRequest(&pVarBindList->list[i]);
…………
break;
case SNMP_PDU_GETNEXT:
*pErrorStatus = GetNextRequest(&pVarBindList->list[i]);
…………
break;
case SNMP_PDU_SET:
*pErrorStatus = SetRequest(&pVarBindList->list[i]);
…………
break;
default:
*pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME;
*pErrorIndex++;
};
}
(省略号表示的是同一段代码,为了突出SnmpExtensionQuery的工作机制进行省略:
if(*pErrorStatus != SNMP_ERRORSTATUS_NOERROR)
*pErrorIndex++;
它的功能是检测处理SNMP请求的结果,如无错误,偏移错误指引。)
循环体内的代码为SnmpExtensionQuery核心功能:当检测到关于扩展MIB的操作请求,该函数被调用解析SNMP请求,并对调用相应的请求函数进行处理SNMP操作请求,这些请求函数会返回被管理对象的值,更加深入的解析如下:
………………………………………………………………………………………………………
根据以上代码可知switch…case…解析SNMP操作请求,随后执行相应的代码处理该请求。
以响应get操作请求的函数GetRequest(SnmpVarBind *pVarBind)为例:
int nRet = SNMP_ERRORSTATUS_NOSUCHNAME;
nRet 返回变量绑定的操作的结果。
………………………………………………………………………………………………………
AsnObjectIdentifier asnOidTemp;
for(UINT i=0;i<g_unMyMibCount;i++)
{
SnmpUtilOidCpy(&asnOidTemp, &MIB_OidPrefix);
复制由MIB_OidPrefix指定的变量到asnOidTemp,并且为目标分配任何需要的内存。
………………………………………………………………………………………………………
SnmpUtilOidAppend(&asnOidTemp, &g_MyMibTable[i].asnOid);
向目标对象标识符asnOidTemp追加源对象标识符g_MyMibTable[i].asnOid。用于变量绑定所需的OID。
………………………………………………………………………………………………………
if(SnmpUtilOidCmp(&asnOidTemp,&pVarBind->name) ==0)
比较两个对象标识符,返回零,说明比较的结果相等。此时进行变量绑定操作。
………………………………………………………………………………………………………
nRet = GetStoreVar(&g_MyMibTable[i],&pVarBind->value);
GetStoreVar函数,则是根据不同的SNMP变量类型,执行赋值操作。变量绑定操作则是由此函数完成,程序最终返回的值是nRet,程序判断赋值语句执行是否成功,然后返回这个程序执行的结果。
………………………………………………………………………………………………………
3.2.2.4 自陷事件发送函数BOOL SNMP_FUNC_TYPE SnmpExtensionTrap
(AsnObjectIdentifier *pEnterpriseOid, AsnInteger32 *pGenericTrapId, AsnInteger32 *pSpecificTrapId, AsnTimeticks *pTimeStamp, SnmpVarBindList *pVarBindList):从扩展代理中收集SNMP数据。当扩展代理要发送陷阱PDU时,触发初始化时定义的事件,SNMP服务就会调用该函数,构造陷阱PDU,并向管理站发送陷阱,只有在调用snmpExtensionInit函数过冲中扩展代理设置自陷事件句柄为信号态后服务才调用此函数,这个函数不是本次毕业设计的重点,验证工作不需要验证Trap,这里仅对该函数的参数及调用机制说明如下:
pEnterpriseOid [out]指向用于接收产生自陷的企业的对象标识符的结构,位于enterprises。
pGenericTrapId [out]正在产生的自陷类型。
pSpecificTrapId [out]指向用于接收产生特定自陷事件指示的变量的指针。
pTimeStamp [out]指向用于接收时间戳变量的指针。
pVarBindList [out]指向变量绑定列表的指针。扩展代理必须为此参数分配内存。SNMP服务通过调用snmpUtilVavbindListFree函数释放此内存。
………………………………………………………………………………………………………
SnmpExtensionInit中如下语句:
g_hSimulateTrap = CreateEvent(NULL, FALSE, FALSE, NULL);
*phSubagentTrapEvent = g_hSimulateTrap;
作用:创建了事件对象,把它的句柄传递给SNMP服务,通知SNMP服务调用snmpExtensionTrap收集Trap信息,产生Trap报文。
………………………………………………………………………………………………………
3.2.2.5 其它函数
操作响应函数,变量绑定函数,Trap发送间隔。对于管理站发送的不同命令,要定义代理端的行为,要判断OID,命令是否违反该节点权限或者代理端SNMP权限。调用变量绑定函数,返回值,这些函数包括GetRequest函数和GetStoreVar 等,程序请看3.3.1.3 SnmpExtensionQuery中的代码;Trap报文发送间隔由这个函数实现:
………………………………………………………………………………………………………
unsigned long __stdcall TrapGenThread(void *lpVoid)
{
for(;;)
{
Sleep(15000);
SetEvent(g_hSimulateTrap);
}
return 0;
}
作用:每15秒发送一次。
………………………………………………………………………………………………………
3.2.2.6 DLL中函数的导出和DLL文件的查看
DLL中函数有多种导出方式,这里采用def文件的方式,这样便于修改导出函数。具体的操作如下:
打开工程目录,新建记事本文档,命名MyAgent.def。打开,输入
LIBRARY "MyAgent"
EXPORTS
SnmpExtensionInit @1
SnmpExtensionTrap @2
SnmpExtensionQuery @3
即声明了三个导出函数,可以由其它程序、服务调用。编译,链接工程,得到MyAgent.dll文件。可用visual studio 6.0自带的dependency walker查看该文件,可以看到SnmpExtensionInit、SnmpExtensionTrap和SnmpExtensionQuery为导出函数。
图16 查看MyAgent.dll
3.2.3 将扩展MIB加入系统服务中
3.2.3.1 修改注册表
要想运行MyAgent.dll,需要在系统上进行配置。首先修改注册表的两处。第一处增加软件项,加入扩展代理路径,实际上添加的就是产生的DLL文件的路径。在 HKEY-LOCALMACHINE\SOFTWARE\Microsoft 下新建一项 MyAgent。再在 MyAgent下面新建一项 Currentversion,然后在该项中新建一个字符串值。其中数值名称为Pathname,数值内容为产生的DLL文件的路径,本毕业设计的代理端中这个路径是D:\SNMP_MyAgent\MyAgent.dll。第二处是需要在HKEY_LOCAL-MACHINE\SYSTEM\CurrentContrDlSet\Services\SNMP\Parameters\ExtensionAgents下增加服务项,其实就是在所有代理入口的最后添加自己扩展代理的注册路径。本文中的路径是:“SOFTWARE Microsoft\MyAgent\CurrentVersion”[6]。
3.2.3.2 修改系统SNMP的访问权限及属性
右击“我的电脑”桌面图标,选择“管理”,选择“服务和应用程序”,选择“服务”,拖动滑块,找到SNMP Service,右击,选择属性。点击“登录”,在该栏下方单击“启动”启动Profile1,点击“应用”。点击“安全”,在“接收团体名称”窗口中查看有无内容,没有则点击“添加”,团体名字为public,权利选择“读写”,点击“应用”,如果内容已经存在,点击“编辑”,团体名称编辑为public,权利选择“读写”,点击“应用”。
图17 启用Profile
图18 设置团体public权利为读写
3.2.3.3 重启SNMP Service和SNMP Trap Service
此时MyAgent.dll已经运行,扩展MIB已经纳入系统服务
图19 SNMP Service和SNMP Trap Service在服务菜单中的位置
4 验证
4.1 验证工具和验证目标
为了验证动态扩展MIB是否成功,我们用snmptuil和MIB Brower查询我们动态扩展添加的OID,snmptuil可以进行的操作是get、getnext和遍历子树(一次执行多个get操作),MIB Brower可以加载MIB文件将其解析为MIB树,并且支持set操作,设置扩展的被管理对象的值[8]。
根据SMI静态扩展MIB的得到的MIB文件就是程序员要交给管理人员的关于添加的管理对象的信息,我们在自己创建的MIB文件中定义了新的节点szulab(OID = 1.3.6.1.4.1.15),并在此节点下定义了3个管理对象:主机型号(pcmodel OID:1.3.6.1.4.1.15.1),主机所在的位置(labroom OID:1.3.6.1.4.1.15.2),主机当前的秒数(seconds OID:1.3.6.1.4.1.15.3 )。根据上面3个新增的被管理对象的OID,我们在管理站访问这些OID时会得到系统的型号,主机所在的位置,主机当前秒数。如果成功获得pcmodel信息,能够更改,读取labroom信息,并且能够获得实时更新的seconds信息,则证明本次毕业设计成功扩展了MIB。
4.2 不运行扩展代理MyAgent.dll的查询情况
4.2.1.不运行MyAgent.dll,用snmputil验证
Snmputil.exe是命令行方式运行的MIB浏览装置,它支持get,getnext,walk(遍历该节点所有子树)的功能,它的命令格式为:
snmputil [get|getnext|walk] agent community oid[]
其中agent为代理端IP地址,community为访问权限,OID根据我们编写的程序获得,程序员交给管理人员的MIB文件中包含新添加的被管理对象的所有信息,包括管理信息的名称,功能描述,访问权限,OID等[7]。
不运行MyAgent.dll用snmputil.exe发现无法查询,错误原因,没有定义的节点。
图20 未运行动态扩展MIB程序的查询结果
4.2.2 不运行MyAgent.dll,用MIB Brower验证
返回错误的OID和值,验证任何未定义的OID都会返回这个值。
图21 不运行MyAgent.dll时MIB Brower查询情况
4.3 运行MyAgent.dll,进行验证
4.3.1 用snmptuil验证动态扩展MIB是否成功
图22 运行动态扩展MyAgent.dll后的查询结果
4.3.2用MIB Browser 验证动态扩展MIB是否成功
4.3.2.1加载MIB文件
打开MIB Brower,加载SZULAB-MIB.txt.,在左侧可以看到MIB上显示新添加的节点szulab,点击该节点,发现OID一栏显示为1.3.6.1.4.1.15,
图23 加载SZULAB-MIB得到MIB树
4.3.2.2 验证是否对pcmodel进行读取
展开szulab,单击“pcmodel”,单击“get”按钮,得到DELL380,证明可以读取。
图24 查询pcmodule得到的信息
4.3.2.3 验证是否可以对labroom进行set操作
选择“labroom”,选择get,得到“347-12”,单击“操作”,选择“set操作”,在弹出的对话框中选择OCTET STRING,在value中输入“1405-2”,单击确定,完成设置。单击“get”按钮,labroom值变为我们刚刚设置的“1405-2”,对于扩展MIB中被管理对象labroom,设置的权限是可以进行读写操作,在选择set后将其设置为“1405-2”后,再次get读取此节点信息,则读取的信息由“347-12”变为“1405-2”。这个操作过程说明,MIB代理对象符合SMI标准,能响应get、set的操作。
图25 第一次查看labroom的值是347-12
图26 对labroom进行set操作,改为1405-2
图27 set操作后第二次get得到labroom的值为1405-2
4.3.2.4 验证是否可以读取实时更新的seconds(系统秒数)
点击节点“seconds”,OID一栏显示为1.3.6.1.4.1.15.3,单击 “get”按钮,Value(值)为43,系统秒针是43秒,再次单击“get”按钮,得到Value 54,多次执行get操作,可以获得不同的秒数,这些数值与系统秒数一致,说明本次毕业设计实现了动态扩展MIB代理,被管理对象的参数值是动态变化的且符合SMI标准,,这一原理可以用于其他所有扩展MIB中被管理对象的数据是实时变化的情况。
图28 第一次get获得的值是43
图29 第二次get得到的值是54
5 结论
经过验证,证明使用WINSNMP编写MyAgent.dll文件,并将dll文件加入系统服务扩展MIB的方案可行。在不关闭设备的情况下,实现了MIB的扩展,增加了代理端被管理对象。所扩展MIB中的被管理对象的数据可以是固定不变的,也可以是实时更新的,并且可以被管理者更改。这三种类型的管理信息包含了MIB所涉及的所有别管理对象的种类,能够满足管理者检测网络性能的目的。
本文仅在Windows平台基于SNMP实现了MIB扩展,通过WINSNMP实现了了动态扩展MIB对扩展MIB初始化(动态信息,静态信息的初始化),收到查询指令后扩展MIB的Response响应,Trap监测系统的机制,这些工作在任何设备商扩展MIB都要完成。本文给出了完成这些操作的关键方案和源程序。因为器材原因,我们并没有在其他公司的设备上尝试MIB扩展,其他平台扩展参考本毕业设计的成果同时,还需要结合平台的工作特性选择可行方案。
6 注释与参考资料
[1]武孟军.精通SNMP.人民邮电出版社.2010年7月.Page:1
[2]李明江.SNMP简单网络管理协议.电子工业出版社.2007年5月.Page:10
[3]Rose, Marshall T.The Simple Book: An Introduction to Network Management.2ed ed.Prentice Hall.1994
[4]谢希仁.计算机网络(第5版).电子工业出版社.2010年4月.Page:268~272
[5]Perkins, David. Understanding SNMP MIBs.Prentice Hall.1996
[6]何平,谭献海,贾岩,刘黎娜.微计算机信息.2008年24卷.Page:45~48
[7]Microsoft 帮助文档,cmd 命令下输入snmptuil获取帮助信息.
[8]武孟军,徐龚,任相臣.Visual C++ 开发基于SNMP的网络管理软件.人民邮电出版社. 2007年1月.Page:99~102.该工具来自本书随书光盘
[9]Charles Petzold.Windows程序设计.清华大学出版社.2010年9月.Page:957~975
[10]王朋武.WinSNMP API规范.北京佳合通信技术公司.2002年9月