Java进行SNMP通信的指南文档格式.docx
- 文档编号:16227041
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:22
- 大小:66.77KB
Java进行SNMP通信的指南文档格式.docx
《Java进行SNMP通信的指南文档格式.docx》由会员分享,可在线阅读,更多相关《Java进行SNMP通信的指南文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
报文结构参见ScopedPDU(v3)。
AddressIP地址和端口(和的不同),常用实现是UdpAddress。
Target发送的时候要用到,包含Address,超时、重试次数、SNMP的版本,常用实现是ComunityTarget,可以指定readcommunity及writecommunity。
2.2.实现客户端
2.2.1.初始化
首先定义类变量,DATATYPE常量的定义是在SET操作里用到的,代码如下:
代码:
/**TransportMapping*/
privateTransportMappingtransport;
/**プロトコール*/
privateSnmpprotocol;
/*DateType定義*/
/**Counter32*/
publicstaticfinalintDATATYPE_COUNTER32=0;
/*Counter64*/
publicstaticfinalintDATATYPE_COUNTER64=1;
/**Gauge32*/
publicstaticfinalintDATATYPE_GAUGE32=2;
/**GenericAddress*/
publicstaticfinalintDATATYPE_GENERICADDRESS=3;
/**Integer32*/
publicstaticfinalintDATATYPE_INTEGER32=4;
/**IpAddress*/
publicstaticfinalintDATATYPE_IPADDRESS=5;
/**OctetString*/
publicstaticfinalintDATATYPE_OCTETSTRING=6;
/**TimeTicks*/
publicstaticfinalintDATATYPE_TIMETICKS=7;
/**UnsignedInteger32*/
publicstaticfinalintDATATYPE_UNSIGNEDINTEGER32=8;
代码段2.2.1-1
初始化,代码如下:
/**
*初期化
*
*@throwsSmsTerminalException
*アプリエラー
*/
privatevoidinit()throwsSmsTerminalException{
try{
transport=newDefaultUdpTransportMapping();
protocol=newSnmp(transport);
}catch(IOExceptionex){
thrownewSmsTerminalException("
initerror"
Constants.EXIT_CODE_NORMAL,ex);
}
代码段2.2.1-2
2.2.2.GET/GETNEXT操作
SnmpVO是一个简单的JavaBean,包含了以下属性
∙ipAddress(目标机器IP地址);
∙port(端口);
∙retry(重试次数);
∙timeout(超时时间);
∙oid(要获取属性的OID);
∙type(操作类型,默认是GET);
∙communityGet(GET操作的团体字符串);
∙communitySet(SET操作的团体字符串);
GET/GETNEXT操作的代码如下:
*MIB情報を取得する
*@paramsnmpVo
*SNMP相関情報
*@returnoutValue
*SNMP取得結果
publicStringgetSnmpValue(SnmpVOsnmpVo)throwsSmsTerminalException{
log.debug("
getSnmpValuestart"
);
StringoutValue="
"
;
CommunityTargetmyTarget=setTarget(snmpVo,false);
transport.listen();
PDUrequest=setRequest(snmpVo);
PDUresponse=null;
//PDUresponse
ResponseEventresponseEvent=protocol.send(request,myTarget);
if(snmpSendReceiveListener!
=null){
snmpSendReceiveListener.beforeReceive();
//SNMP受信
response=responseEvent.getResponse();
if(response!
if(response.getErrorIndex()==PDU.noError
&
&
response.getErrorStatus()==PDU.noError){//正常場合
VariableBindingvb=response.get(0);
if(vb.isException()){
thrownewSmsTerminalException(vb.getVariable().toString(),
Constants.EXIT_CODE_NORMAL,responseEvent.getError());
}
outValue=vb.getVariable().toString();
}else{//エラー発生
thrownewSmsTerminalException(responseEvent.getError().getMessage(),
}else{//タイムアウト
thrownewSmsTerminalTimeoutException("
SNMP受信タイムアウト"
getSnmpValueIOerror"
}finally{
if(protocol!
protocol.close();
if(transport!
=null&
transport.isListening()){
transport.close();
closeprotocolortransporterror"
Constants.EXIT_CODE_NORMAL,ex);
getSnmpValueend"
returnoutValue;
代码段2.2.2-1
其中用到了setTarget方法,采用ComunityTarget设置目标设备IP和端口、Community、SNMP版本、重试次数、超时时间,代码如下:
*CommunityTargetの設定
*@paramisSetOperationSET操作かどうか
*@returnmyTarget
*設定したCommunityTarget
privateCommunityTargetsetTarget(SnmpVOsnmpVo,booleanisSetOperation){
CommunityTargetmyTarget=newCommunityTarget();
AddressdeviceAdd;
deviceAdd=GenericAddress.parse(snmpVo.getIpAddress()+"
/"
+snmpVo.getPort());
myTarget.setAddress(deviceAdd);
//address
if(isSetOperation){
if(StringConverter.nullCheckString(snmpVo.getCommunitySet())){
myTarget.setCommunity(newOctetString(snmpVo.getCommunitySet()));
//communitySet
}else{
if(StringConverter.nullCheckString(snmpVo.getCommunityGet())){
myTarget.setCommunity(newOctetString(snmpVo.getCommunityGet()));
//communityGet
if(snmpVo.getRetry()!
=0){
myTarget.setRetries(snmpVo.getRetry());
//retries
if(snmpVo.getTimeout()!
myTarget.setTimeout(snmpVo.getTimeout());
//timeout
//intversion=SnmpConstants.ver;
if(StringConverter.nullCheckString(snmpVo.getCommunityGet())
("
2c"
.equals(snmpVo.getVer())||"
1"
.equals(snmpVo.getVer()))){
myTarget.setVersion(SnmpConstants.version2c);
//org.snmp4j.mp.*
returnmyTarget;
}
代码段2.2.2-2
还有setRequest方法,代码如下:
*OIDの設定
*設定したVariableBinding
privatePDUsetRequest(SnmpVOsnmpVo){
PDUrequest=newPDU();
VariableBindingvar;
//oidを設定する
var=newVariableBinding(newOID(snmpVo.getOid()));
request.add(var);
//情報取得方式を設定する
request.setType(snmpVo.getType());
if(snmpVo.getType()==0){
request.setType(PDU.GET);
//DefaultPDUtypeisGET.
returnrequest;
代码段2.2.2-3
2.2.3.SET操作
Set操作的代码如下:
*MIB情報を設定する
*@authorhonghui
*@paramvalue
*SNMP設定内容
*@paramdataTypeデータのタイプ
publicvoidsetSnmpValue(SnmpVOsnmpVo,Stringvalue,intdataType)
throwsSmsTerminalException{
setSnmpValuestart"
CommunityTargetmyTarget=setTarget(snmpVo,true);
OIDoid=newOID(snmpVo.getOid());
Variablevariable=getDataTypeVariable(value,dataType);
if(variable==null){
InvaliddataType:
"
+dataType,
Constants.EXIT_CODE_NORMAL,null);
request.add(newVariableBinding(oid,variable));
request.setType(PDU.SET);
response.getErrorStatus()==PDU.noError){
//正常場合
setSnmpValueIOerror"
代码段2.2.3-1
Set操作调用到了getDataTypeVariable方法,需要把传入的dataType转换成SNMP4J的Variable,代码如下:
*Variableを変換です
*@paramvalueSNMP設定内容
*@returnVariable
privateVariablegetDataTypeVariable(Stringvalue,intdataType){
switch(dataType){
caseDATATYPE_COUNTER32:
returnnewCounter32(Long.parseLong(value));
caseDATATYPE_COUNTER64:
returnnewCounter64(Long.parseLong(value));
caseDATATYPE_GAUGE32:
returnnewGauge32(Long.parseLong(value));
caseDATATYPE_GENERICADDRESS:
returnnewGenericAddress();
caseDATATYPE_INTEGER32:
returnnewInteger32(Integer.parseInt(value));
caseDATATYPE_IPADDRESS:
returnnewIpAddress(value);
caseDATATYPE_OCTETSTRING:
returnnewOctetString(value);
caseDATATYPE_TIMETICKS:
returnnewTimeTicks(Long.parseLong(value));
caseDATATYPE_UNSIGNEDINTEGER32:
returnnewUnsignedInteger32(Long.parseLong(value));
returnnull;
代码段2.2.3-2
2.3.实现模拟器
模拟器(或者说是服务端)的作用很明显,就是在服务器上开启一个监听SNMP的服务,当有客户端的请求时,返回一些结果。
如果模拟器做的很完美的话,客户端连接某个服务器获取或设置SNMP信息时,并没有觉察服务器是真实的还是模拟出来的。
在我们的运用中,只是简单的模拟了GET、GETNEXT和SET这3个操作,对于GET/GETNEXT操作来说,请求后返回的数据也是从数据文件里读取到的,数据文件就是一个普通的CSV文件,内容如下:
数据文件(CSV):
OID,MIB情報
1.3.6.1.2.1.1.6.0"
"
Beijing2008"
1.3.6.1.2.1.1.7.0"
Olympic"
代码段2.3-1
由于我们只是简单的模拟,所以GET和GETNEXT操作返回的结果是相同的(如果要做成不同的,就要对OID进行排序处理)。
对于SET操作来说,没有返回,如果SET出错,就会抛出异常。
模拟器的代码不多,处理类的全部代码如下:
*CMTS_SNMPシミュレーター処理クラス
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 进行 SNMP 通信 指南
![提示](https://static.bdocx.com/images/bang_tan.gif)