发明内容:
本发明的目的就是为了解决上述问题,提出一种高效、通用的简单网管协议代理多变量分组查询方法。
本发明的技术解决方案:
一种简单网管协议代理多变量分组查询方法,其特征在于它采用如下步骤:
a.根据管理信息库(MIB库)文件定义简单网管协议(SNMP)代理管理信息库(MIB库)数据结构,该数据结构包括对象的基本信息、对象的索引对象信息,定义获取每个对象实例的方法;
b.解析简单网管协议(SNMP)报文,分析变量体,根据简单网管协议(SNMP)报文操作类型处理每个变量,设置变量状态和变量的工作状态;
c.对变量体中未处理的变量进行分组,其分组方法是,根据每个变量的对象标识符(OID)查询管理信息库(MIB库),再分析变量的索引值、管理信息库(MIB库)中对象的索引对象类型、管理信息库(MIB库)中对象的获取值方法(Get方法),索引和获取值方法这两类信息分别相同的那些变量归为一组,记录组中变量在变量体中的编号,即完成分组;
d.调用组中对象的获取值方法(Get方法),根据管理信息库(MIB库)中对象信息和变量索引值信息查询数据,查询成功绑定组中每个变量的值,标记组中变量为已处理状态;如果不成功根据简单网管协议(SNMP)报文操作类型处理组中每个变量,设置变量状态为已处理状态,并设置变量值为出错标志值;
e.重复步骤c和步骤d直至所有变量工作状态为已处理状态。
本发明克服了传统技术中的SNMP代理多变量查询速度慢以及浪费资源的缺点,提出了一种高效、通用的多变量分组查询方法,对变量进行分组,每组变量的查询方法一致,每组变量个数≥1。本发明实现了高速度完成多变量查询,可减少重复的查询操作,减少了查询次数,节约了系统资源和查询时间,提高了查询效率。
具体实施方式
下面基本按照附图的顺序对本发明的技术方案的实施作进一步的详细描述:
如图1,本发明的SNMP代理多变量分组查询方法,包括以下步骤:
步骤一:根据MIB库文件定义SNMP代理MIB库数据结构,数据结构包括对象的基本信息、对象的索引对象信息,定义获取每个对象实例的方法。
步骤二:解析SNMP报文,分析变量体,根据SNMP报文操作类型处理每个变量,设置变量状态和变量的工作状态。
步骤三:对变量体中未处理的变量进行分组,分组方法:根据每个变量的OID查询MIB库,再分析变量的索引值、MIB库中对象的索引对象类型、MIB库中对象的获取值方法(Get方法),索引和获取值方法这两类信息分别相同的那些变量归为一组,记录组中变量在变量体中的编号,即完成分组。
步骤四:调用组中对象的获取值方法(Get方法),根据MIB库中对象信息和变量索引值信息查询数据,查询成功绑定组中每个变量的值,标记组中变量为已处理状态;如果不成功根据SNMP报文操作类型处理组中每个变量,设置变量状态和工作状态。设置变量状态为已处理状态,并设置变量值为出错标志值。
步骤五:重复步骤三和步骤四直至所有变量工作状态为已处理状态。
本发明的分组查询方法具有高效性,它将多个变量按照一定规则分解为一个或多个变量组,减少了重复操作的次数,以快捷的速度完成数据查询。另外,本发明查询方法还具有通用性,它适合SNMP协议所支持的三类变量查询操作(GetRequest,GetNextRequest,GetBulkRequest)。
首先介绍本发明查询方法所用到的SNMP代理MIB库数据结构。变量分组规则所用到的两个结构信息说明如下。
1)MIB库节点结构名:TreeNodeTable
结构信息如下:
字段名 |
类型 |
长度 |
说明 |
OID |
Short |
30 |
对象标识符 |
OidName |
Char |
61 |
字段名称 |
NodeType |
BYTE | |
0.非叶子节点,1.叶子节点 |
VarType |
BYTE | |
变量类型(按照源码定义定义) |
Access |
BYTE | |
0.可读,bit1=1.可写,bit2=1不能insert,bit3=1不能删除 |
dbsFalg |
BYTE | |
数据驻留标志0.驻留内外,1.仅驻留内存,2.仅驻留外置数据库 |
MaxRange |
ULONG | |
取值范围(整数型有效) |
idxInfoSq |
WORD | |
索引信息表记录号,为零表示没有索引信息 |
GetFunction |
_SAAFUN | |
处理函数地址typedef void(*_SAAFUN)(void*,void*,void*,void*,void*); |
setFunction |
_SAAFUN | |
处理函数地址typedef void(*_SAAFUN)(void*,void*,void*,void*,void*); |
2)MIB库索引信息结构名:MIBTreeIdxTable
结构信息如下:
字段名 |
类型 |
长度 |
说明 |
IdxHandleSq |
BYTE | |
索引句柄序号 |
Next |
WORD | |
对应索引信息表中下一个句柄序号,0表示没有后继索引 |
IndexType |
BYTE | |
索引类别 |
IndexNum |
BYTE | |
索引占用字节长度 |
IndexDomainName |
BYTE |
61 |
索引关键字的内部字段名称 |
MinRange |
DWORD | |
最小取值范围(整数型有效) |
MaxRange |
DWORD | |
最大取值范围(整数型有效) |
配置MIB库节点内容和节点索引内容遵循以下原则:
1、管理信息库(MIB库)节点结构内容与简单网管协议(SNMP)管理站使用的管理信息库(MIB)文件保持一致。
2、声明并定义管理信息库(MIB库)节点结构中变量获取方法(Get方法),如果没有置为空(NULL)。
3、管理信息库(MIB库)节点对象的索引信息存储在节点索引表中,两者通过节点信息的索引信息表记录号(idxInfoSQ)和索引信息表的索引句柄序号(IdxHandleSq)进行关联。
图2是本发明(GetRequest)的处理流程。
具体步骤如下:
1、接收简单网管协议(SNMP)管理站发送的查询命令原语(GetRequest)报文,解析报文,分析变量体中变量信息,判断每个变量的对象标识符前缀是否合法、变量索引值是否正确,设置每个变量的状态,标记每个变量的工作状态为未处理状态。
2、依次选取变量体中每个未处理状态的变量,判断变量的状态,如果变量状态正确根据变量的对象标识符(OID)访问管理信息库(MIB库)节点结构表,如果对象标识符(OID)不可访问标记变量值域为无对应实例,标记变量已处理状态;如果变量状态错误,标记变量已处理状态。
3、重复步骤2,直至变量体末。
4、取变量体中第一个未处理状态的变量,根据变量的对象标识符(OID)查找管理信息库(MIB库)节点结构表,如果变量的获取值(Get)函数地址(即TreeNodeTable结构中GetFunction项,下同)不为空,记录变量序号,存储在一个变量序号列表中,记录Get函数地址。
5、查找变量体后续未处理状态的变量,判断该变量的获取值(Get)函数地址和索引值序列、索引类型列表是否和第一个未处理状态的变量相同,如果相同,记录变量序号,存储在同一个变量序号列表中。
6、重复步骤5,直到变量体末。
7、根据获取值(Get)函数地址和变量序号列表、变量索引值序列执行查询操作,依次绑定每个变量的值;如果查询错误,每个变量状态置为错误;如果查询不到数据,每个变量类别置为无对应实例。
8、标记变量序号列表中每个变量为已处理状态。
9、重复步骤4、5、6、7、8,直至变量体每个变量状态都为已处理状态。
10、多变量查询操作结束,简单网管协议(SNMP)代理格式化变量值,返回查询响应报文给简单网管协议(SNMP)管理站。
图3是本发明查询下一个命令原语(GetNextRequest)的处理流程。
具体步骤如下:
1、接收简单网管协议(SNMP)管理站发送的查询下一个命令原语(GetNextRequest)报文,解析报文,分析变量体中变量信息,判断每个变量的对象标识符前缀是否合法、变量索引值是否正确,设置每个变量的状态,标记每个变量的工作状态为未处理状态。
2、依次选取变量体中每个未处理状态的变量,判断变量的状态,如果变量状态错误,标记变量已处理状态。如果变量状态正确根据变量的对象标识符(OID)访问管理信息库(MIB库)节点结构表,如果变量不可访问,按字典顺序取管理信息库(MIB库)节点结构表下一个节点;如果变量不是叶子节点,按字典顺序取管理信息库(MIB库)节点结构表下一个节点;如果变量是没有索引却带有索引值的叶子节点,按字典顺序取管理信息库(MIB库)节点结构表下一个节点。若按字典顺序查找管理信息库(MIB库)节点结构表后续节点失败,标记变量值域为MIB库视图结尾(endofmibveiw),标记变量为已处理状态。
3、如果变量的索引项为空,根据变量的对象标识符(OID)访问管理信息库(MIB库)节点结构表,如果对应的节点有索引信息,则填充变量的索引类别和个数。
4、重复步骤2、3,直至变量体末。
5、取变量体中第一个未处理状态的变量,根据变量的对象标识符(OID)查找管理信息库(MIB库)节点结构表,如果变量的获取值(Get)函数地址不为空,记录变量序号,存储在一个变量序号列表中,记录Get函数地址。
6、查找变量体后续未处理状态的变量,判断该变量的获取值(Get)函数地址和索引值是否和第一个未处理状态的变量相同,如果相同,记录变量序号,存储在同一个变量序号列表中。
7、重复步骤6,直到变量体末。
8、根据获取值(Get)函数地址和变量序号列表、变量索引值执行查询操作,查询成功依次绑定每个变量的值;如果查询错误,每个变量状态置为错误,标记变量序号列表中每个变量为已处理状态;如果查询不到数据,对变量序号列表中每个变量按照字典顺序取管理信息库(MIB库)节点结构表下一个节点,若不存在字典顺序后续,标记变量值域为MIB库视图结尾(endofmibveiw),标记变量为已处理状态。
9、重复步骤5、6、7、8,直至变量体每个变量状态都为已处理状态。
10、变量查询操作结束,简单网管协议(SNMP)代理格式化变量值,返回查询响应报文给简单网管协议(SNMP)管理站。