首页 > 代码库 > SNMP代理软件开发

SNMP代理软件开发

SNMP代理模块包括6个子模块:

SNMP协议主要有五种报文get、get-next、set、get-response,trap。
l.get-request操作:从代理进程处提取一个或多个参数值
2.get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值
3.set-request操作:设置代理进程的一个或多个参数值
4.get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。
5.trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。其中前三种报文是管理进程发出的;后两种是代理进程发出的。在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用熟知端口162来接收trap报文。 下面具体讲解5种SNMP操作。
(1) get-request操作 管理站需要主动向agent读取管理对象的值,以获得设备或网络的运行数据和管理信息,进而规划网络管理。SNMP不支持一次读取一张表或表中一行数据。但是当需要读取多个数据,如果分多次读取则会提高网络负担,所以,Get-Request支持一次提交多个对象标识(OID),以便一次获取他们的值,提高网络利用率。
(2) get-next-request操作SNMP不支持一次读取一张表或表中一行数据的读取,Get-Next-Request提供了一种简单的方法。对一个OID进行Get-Next-Request操作,将会收到一个下一个可读取的对象的实例标识,接着对他Get-Next-Request将会得到再下一个实例标识,不断执行下去,将可以读取完整张表。一方面Get-Next-Request实现很简单,但是在读取表中数据的时候却不可避免地有一个大麻烦。表中的数据是以行为单位,每一行又由若干列组成,如果读取一行数据,应该读取这一行的每一列,但是SNMP的Get-Next-Request表时是先列后行,就是说先把第一列中所有行数据读取完,再读取下一列所有行。这样,客户端就需要做很多工作。另一方面,这样显然传递了很多不必要的数据,浪费了带宽。跟Get-Request一样,Get-Next-Request可以在PDU里绑定多个OID或实例标识,以提高效率。同样的,绑定多个OID情况下,相应的Get-Response的PDU同样会返回每一个OID的下一个可用实例标识标识符或相应错误。利用绑定多个OID可以比单个执行Get-Next-Request有效率。
(3) set-request操作网络管理中,有时需要对设备的一些参数、配置、状态进行重新配置。需要一种远程的管理机制,Set-Request就是这样的操作。set操作可以对MIB中权限为:write-only、read-write的对象进行set操作。尽管set操作为改变配置提供了一种比较方便的方法,但是SNMP并没有直接提供操作远程设备的操作。但这不代表SNMP没有这种能力,我们可以借助于Set-Request操作间接地实现这一性能。设备通过MIB定义一个操作的对象,类型为write-only或read-write,约定操作取值,NMS可以对这个对象进行设置,设备以自己的方式得知此对象的值改变后,可以按照对象取值的含义执行操作,从而实现远程控制。set操作也允许一次提供几个set的对象和值,以便在一个PDU里操作多个对象。set操作的成功应答包里包含设置的对象的最新取值(也就是设置的值)。
(4) get-response操作GetResponse对get、set、getNext进行应答,由agent被动地产生并发出。当操作成功地被执行时,GetResponsePDU里包含操作中请求操作的对象oid和他们的值。前面提到,前三种操作都支持在一个PDU里绑定多个对象,相应的GetResponse应答也包含相应变量的值。对于失败的操作,GetResponse需要在PDU里标注相应的错误代码。GetResponse对请求数据包里的request-id域不操作,原数返回,以使请求端能将应答包和请求包准确匹配,同时也可以作为请求和接收方校验重复数据包的依据。当操作成功时,error-status值为noError,error-index为0。variablebindings中的变量的value域填上相应值。当操作失败时,error-status为相应的错误代码,如果错误由variablebindings组中某个对象引起,则error-index为该对象在variablebindings中的索引。
(5) trap操作SNMP的前三种操作是NMS主动发起的操作,网络中存在大量的设备,NMS轮循一次需要一段时间,如果设备发生了重要的状态改变,等到下一次轮循到来,可能已经失去实时性,NMS不能及时掌握设备数据或状态的变化。另一方面,考虑到对网络的占用,又不可能以很小的间隔去轮循设备。所以,需要一种机制让设备能够自主地发出警报,通知状态或配置的改变和其它一些重要事件。Trap就是由agent主动发出的警报PDU,通知NMS重要的改变。RFC 1157中定义了5种常见类型的Trap,用于这些常见网络状态的报警。另外提供了一个自定义的类型,并提供一个PDU单元提供自定义Trap的子代码,用于SNMP的实现者定义和发送自己的Trap。另一方面,但Trap也有一些问题,因为SNMP使用的是UDP,无连接的数据报,Trap有可能不能传递到NMS,另一方面agent不知道NMS是否收到Trap。另外,发送Trap一般都是由重要的状态引起的,某些情况下,系统发生了灾难性的故障,导致Trap也无法发出,比如系统崩溃、网络故障等。所以,一个网络管理系统要综合使用这些操作,互为补充,才能建立一个可靠的管理系统。单独依靠每一种操作都有片面性。


开发流程:
使用MG-SOFT生产相应MIB文件,使用SMI设置数据类型、读写等,将该文件插入相应的节点;

使用MIB2C命令将MIB文件转换为C文件;
生产的C文件,会将SIM的数据类型转换为C语言中的数据类型;同时根据数据类型功能的不同生产,Set/Get Request 等该函数
开发完这些函数后,烧写入交换机中
在对应节点下使用MG-Soft发送PDU(UDP),使用UDP是因为:UDP协议效率较高,用它实现网络管理不会太多地增加大网络负载
在交换机中的代理软件受到PDU后,将SMI数据类型转换为C数据类型;并根据PDU中的信息执行相应的操作;
操作完成后,一般发送getResponse,告知管理软件,修改完以后的状态

测试流程:
开发完成后,交换机就如普通的路由器,计算机连接交换机后会出现一个设置页面;
通过使用Python+Selenium可实现自动化设置WEB上的元素;
设置完成后重启交换机,检验设置的元素的属性是否发生改变。

 

SNMP代理软件开发