协议家族的新成员(2)
SNMP新成员具体实现方案
getAlm和getPm报文是用来提升现有SNMP管理性能的,在目前现有的SNMP管理端解决方案中,我们选用了SNMP4J, 在保持原有大框架不变的前提下,做简要的扩充,以支持这两种新报文,满足功能需求。
图2给出了相关类图的简要设计。主要思想是对SNMP4J中的PDU和VariableBinding类做了扩展,新增了WDMPDU类和WDMVariableBinding类,分别继承了SNMP4J框架中原有的PDU类和VariableBinding类。
图2
在原有的PDU类中,包含了各种PDU数据包类型和各种异常情况状态等属性,根据新增的两种getPDU类型,在WDMPDU类中需增加相应的属性,即GetWDMAlm 和GetWDMPm,同时也新增了4种异常情况状态属性。在PDU类中包含了一些方法,分别是addOID(),getVariable(),getBERPayloadLength(),decodeBER(),encodeBER(),getTypeString()等。其中addOID()给PDU报文增加mib号,getVariable()获取对应的mib节点数值。getBERPayloadLength()获取PDU报文的内容长度,是由requestID,errorstatus,errorIndex,还有variableBinding各字段长度值累加组成。其中errorstatus字段在response报文中表示报文错误状态码,在getAlm和getPm报文中表示的是逻辑操作符数目numberOfLogic;errorIndex字段在返回报文中表示错误索引值,在getAlm和getPm中表示的是返回记录数maxReturnRecords。另外requestID报文标识值长度计算方法也相同,variableBinding长度值是由VariableBinding类来计算。因此WDMPDU类中getBERPayloadLength()和原来的计算方式相同,再加上addOID()和getVariable(),不需要在子类中重写相关方法。PDU类中的encodeBER()和decodeBER()分别对即将进入网络传输的PDU数据包的输出流,和进入主机的PDU数据包的输入流进行编码和解码,也需要分别对上述requestID,errorStatus,errorIndex和variableBinding字段进行编码解码,还需要对报文的类型是否正确进行判断,这就需要在WDMPDU子类中对这两个方法进行重写,以支持新增加的GetAlm和GetPm报文。PDU类中的getTypeString()也需要重写,它根据PDU报文类型返回对应的报文描述,需要增加新增两种报文的支持。
在原有的VariableBinding类中,包含了oid和variable属性,分别表示mib节点标识和对应的值。WDMVariableBind类由于新增了比较运算符,因此新增了operator属性。VariableBinding类含有oid和variable 的get和set方法,用来获取和设置对应的属性值。它们在子类WDMVariableBind类中同样存在,因此这里不需要被重写,直接继承父类中的方法即可。VariableBinding类中的decodeBER()和encodeBER()对进出网络的PDU数据包中的variable变量绑定域的输入输出流进行编码和解码,原先的方法中只是对oid和variable属性分别进行编码和解码,现在WDMVariableBind类新增了oparator属性,在编码和解码过程中需要增加对operator属性的编码解码操作,因此在WDMVariableBind类中重写了这两个方法。最后VariableBind类中的getBERPayloadLength()方法用于返回PDU报文中variable变量绑定域的内容长度,是由oid和variable这两个属性内容的长度值累加而成。现在新增了operator属性,同样需要在WDMVariableBind类中重写这一方法,需要将这三个属性内容的长度做累加。
WDMSNMPRequest类提供了常用的GET,GETNEXT,SET等标准SNMP相关操作,还增加了GETWDMAlm和GETWDMPm方法。该类继承了标准SNMP4J框架中的SnmpRequest类,SnmpRequest类提供了mib表示符oid号,SNMP版本号,PDU数据包类型,允许的超时时间,地址,团体字符串等属性信息,还包括了获取和设置oid相关数值的方法,创建snmp会话的方法等。例如getPDU()方法利用父类的createSnmpSession()方法创建snmp会话,然后进行监听。随后创建target对象,设置该对象的address,timeout,版本信息等属性。接着根据需要,创建PDU数据包对象或是新增的WDMPDU数据包对象,并设置PDU类型,增加VariableBinding对象或新增的WDMVariableBind对象到PDU数据包对象中,如果是GETWDMAlm和GETWDMPm操作,还需调用WDMPDU类中的setNumberOfLogic()和setMaxReturnRecords()对过滤条件数和最大返回记录数进行设置。最后等待AGENT端返回标准的SNMP的Response数据包,关闭snmp会话。WDMSNMPRequest在此基础上进行了扩展。
下面结合SNMP4J的框架,给出具体的实现的流程。
实现流程:
如图3所示,首先实例化一个SNMP对象,调用该对象的listen()方法监听消息。构造UserTarget对象设置对应属性。接着构造一个PDU或是WDMPDU对象,生成一个包含了MIB库中ID的OID对象,将此对象添加到PDU或是WDMPDU对象中去,且需设置该报文获取类型。上述过程完成后,就可以调用Snmp类中的send()函数来发送消息了。
文章来源:《广东财经大学学报》 网址: http://www.gdcjdxxb.cn/qikandaodu/2021/0414/521.html
上一篇:上海财经大学深度挖掘提供高质量数据服务
下一篇:上海财经大学绘制高校数据集市图谱