📄 encodesnmpmessage.java
字号:
//EncodeSNMPMessage.java
//*"*************************************************************************
// 此类实现了对5类不同的SNMP消息的解封装,它的功能有: *
// 1.生成GetRequestPDU *
// 2.生成GetNextRequestPDU *
// 3.生成SetRequestPDU *
// 4.生成GetResponsePDU *
// 5.生成TrapPDU *
//..........................................................................*
// Creted by: ZhuSiFeng(朱思峰) *
// Email him: ZhuSiFeng2003@yahoo.com.cn *
//*"***************************************************"*********************
import java.io.*;
import java.net.*;
import java.lang.*;
package myencodesnmp;
public class EncodeSNMPMessage
{
//*"************************定义类的变量*********************"*********************
byte message[] = new byte [1024];//message数据
int messageLength;//消息总长度
int CommLength; //团体字符串长度
int RequestIDLength;//Request_ID长度
int varBindLength; //整个varBindList的长度,从sequence of 开始,初值为2
byte Community[] = new byte[30];//团体字符串临时存储
byte RequestID[] = new byte[30]; //RequestID临时存储
byte varBind[] = new byte[1024]; //绑定变量表临时存储
//该方法的功能:类的构造函数
public EncodeSNMPMessage()
{
messageLength = 0;
CommLength = 0;
RequestIDLength = 0;
varBindLength = 2;
varBind[0] =48; //绑定变量列表开始(00 1 10000)= 0X30 = 48
varBind[1] = 0;
message[0] = 48;//消息编码开始(00 1 10000)= 0X30 = 48
setVersion();
setCommunity();
setRequestID();
}
//*"*****************************定义公用方法,供其它方法调用*************"*********************
//该方法的功能:缺省设置的版本信息
void setVersion()
{
message[2] = 02;
message[3] = 01;
message[4] = 00;
}
//该方法的功能:用户设置的版本信息
public void setVersion(byte version)
{
message[2] = 02;
message[3] = 01;
message[4] = version;
}
//该方法的功能:缺省设置的团体字符串
void setCommunity()
{
CommLength = 8;
String community = new String("public");
byte temp1[] = community.getBytes();
Community [0] = 04;
Community [1] = 06;
for(int i=2;i<CommLength;i++)
Community[i] = temp1[i-2];
}
//该方法的功能:用户设置的团体字符串
public void setCommunity(String community)
{
Community [0] = 04;
Community [1] = new Integer(community.length()).byteValue();
CommLength = new Integer(community.length()+2).byteValue();
byte temp[] = community.getBytes();
for(int i=2;i<CommLength;i++)
Community[i] = temp[i-2];
}
//该方法的功能:缺省设置的RequestID
void setRequestID()
{
RequestIDLength = 06;
RequestID[0] = 02;
RequestID[1] = 04;
RequestID[2] = 40;
RequestID[3] = -83;
RequestID[4] = 96;
RequestID[5] = 102;
}
//该方法的功能:用户设置的RequestID
public void setRequestID(byte userRequestID[])
{
RequestIDLength = 06;
RequestID[0] = 02;
RequestID[1] = 04;
RequestID[2] = userRequestID[0];
RequestID[3] = userRequestID[1];
RequestID[4] = userRequestID[2];
RequestID[5] = userRequestID[3];
}
//该方法的功能:加入一个变量绑定
void setVarBind(String strOID)
{
//strOID :要加入的变量OID,带点字符串形式
//首先将字符串OID转化为整数OID
//然后在整数OID后加入05 00,在整数OID之前加入0X30=48,index-1+2+2
//最后将单个变量的BER编码加入varBind,修改varBind长度为 +index-1+2+2
//temp1代表OID的字节形式
byte temp1[]= strOID.getBytes();
//temp2代表OID的整数形式
byte temp2[] = new byte[256];
//temp3代表一个变量的BER编码,从sequence 开始
byte temp3[] = new byte[256];
//变量OID编码长度计数器
byte index = 0;
//--------------------------------------------------------------------------------
//把OID从字符串形式转存到整数形式,并存储在temp2[]中
for(int i=0;i<strOID.length();i++)
{
if(temp1[i]!=46)//不是1.3.6.1.2.1.1.1中的.
temp2[index] =new Integer(new Byte(temp1[i]).intValue()-48).byteValue();
index++;
}
//--------------------------------------------------------------------------------
//生成一个OID变量的编码,并存储在temp3[]中
temp3[0] = 48; //0X30
//此时index为OID的总长度,例如 OID=1.3.6.1.2.1.1.1.0 则总长度=9
temp3[1] = new Integer(1 + 1 + index-1 + 2).byteValue();
temp3[2] = 06;
temp3[3] = new Integer(index-1).byteValue();
temp3[4] = 43; // 1乘以40+3=0X2B
for(int j=0;j<index-1-1;j++)
temp3[j+5] = temp2[j+2];
temp3[5+index-2] = 05;
temp3[5+index-2+1] = 00;
//例如,OID=1.3.6.1.2.1.1.1.0,OID长度=index=9,则生成的BER编码如下
//
// 30 0C 2:sequence类型和长度两个字节
// 06 08 2:类型和长度两个字节
// 2B 06 01 02 01 01 01 00 index-1:OID长度-1(why?)
// 05 00 2:05 00长度
//
//why?: 1.3.6.1.2.1.1.1.0=> 1乘以40+3,6,1,2,1,1,1,0
//--------------------------------------------------------------------------------
//把该OID变量的编码追加到Variable-bindings中
for(int m=0;m<index-1+2+2+2;m++)
varBind[ varBind[1]+2 +m] = temp3[m];
//byte tmp=new Integer(index-1 + 2 + 2 + 2).byteValue();
//varBind[1] = varBind[1] + tmp;
//varBind[1] = varBind[1]+ Integer(index-1 + 2 + 2 + 2).byteValue();
varBindLength = varBindLength + index-1 + 2 + 2 + 2;
//例如,追加之前Variable-bindings的BER编码如下
// 30 0D 2:sequence of 类型和长度两个字节
// 30 0C 2:一个OID的sequence类型和长度两个字节
// 06 08 2:类型和长度两个字节
// 2B 06 01 02 01 02 02 index-1:OID长度-1
// 05 00 2:05 00长度
//
//追加第二个OID=1.3.6.1.2.1.1.1.0之后Variable-bindings的BER编码如下
// 30 1B 2:sequence of 类型和长度两个字节
// 30 0B 2:第一个OID的sequence类型和长度两个字节
// 06 07
// 2B 06 01 02 01 02 02
// 05 00
// 30 0C 2:第二个OID的sequence类型和长度两个字节
// 06 08
// 2B 06 01 02 01 01 01 00
// 05 00
//--------------------------------------------------------------------------------
} //end_of_setVarBind()
//*"*****************************定义5个主要方法*************"*********************
//该方法的功能: 返回GetRequest消息的编码结果message[]
public byte[] GetRequestPDU(String strOID)
{ //功能:返回GetRequest消息的编码结果message[]
//说明:该类的构造函数已经把版本信息填入到Message[]了,下面的任务是:
//1.填入团体字符串commnunitty信息到Message[]中;
//2.填入GetRequest的PDU-TYPE编码0xa0=-96和总长度
//3.填入request-id信息到Message[]中;
//4.填入error-status信息到Message[]中;
//5.填入error-index信息到Message[]中;
//6.填入Variable-bindings信息到Message[]中;
int index = 5; //Message长度计数器,初值为5,包括30 xx 02 01 00
int i;//循环计数器
//加入团体字符串编码
for(i=0;i<CommLength;i++)
message[index+i] = Community[i];
index = index+CommLength;
//加入GetRequestPDU的BER编码0xa0=-96和总长度
message[index] = -96; //0XA0
index = index+1;
message[index] =new Integer(RequestIDLength+ 3+3 +varBindLength).byteValue();
index = index+1;
//加入RequestID编码
for(i=0;i<RequestIDLength;i++)
message[index+i] = RequestID[i];
index = index + RequestIDLength;
//加入error-status编码:02 01 00
message[index] = 02;
message[index+1] = 01;
message[index+2] = 00;
//加入error-index编码:02 01 00
message[index+3] = 02;
message[index+4] = 01;
message[index+5] = 00;
index = index +6;
//加入Variable-bindings编码
for(i = 0; i<varBindLength; i++)
message[index+i] = varBind[i];
index = index + varBindLength;
//设置消息体长度
message[1] = new Integer(index-2).byteValue();
//设置消息总长度
messageLength = index;
//返回编码后的消息
return message;
}//end_of_GetRequestPDU()
//-------------------------------------------------------------------------------
//该方法的功能: 返回GetNextRequest消息的编码结果message[]
public byte[] GetNextRequestPDU(String strOID)
{ //功能:返回GetNextRequest消息的编码结果message[]
//说明:该类的构造函数已经把版本信息填入到Message[]了,下面的任务是:
//1.填入团体字符串commnunitty信息到Message[]中; 'public'
//2.填入GetNextRequest的PDU-TYPE编码0xa0=-96和总长度
//3.填入request-id信息到Message[]中;
//4.填入error-status信息到Message[]中; 02 01 00
//5.填入error-index信息到Message[]中; 02 01 00
//6.填入Variable-bindings信息到Message[]中;
//........
//返回编码后的消息
return message;
}//end_of_GetNextRequestPDU()
//-------------------------------------------------------------------------------
//该方法的功能: 返回SetRequest消息的编码结果message[]
public byte[] SetRequestPDU(String strOID)
{ //功能:返回setRequest消息的编码结果message[]
//说明:该类的构造函数已经把版本信息填入到Message[]了,下面的任务是:
//1.填入团体字符串commnunitty信息到Message[]中; 'public'
//2.填入SetRequest的PDU-TYPE编码0xa0=-96和总长度
//3.填入request-id信息到Message[]中;
//4.填入error-status信息到Message[]中; 02 01 00
//5.填入error-index信息到Message[]中; 02 01 00
//6.填入Variable-bindings信息到Message[]中;
//........
//返回编码后的消息
return message;
}//end_of_SetRequestPDU()
//-------------------------------------------------------------------------------
//该方法的功能: 返回GetResponse消息的编码结果message[]
public byte[] GetResponsePDU(String strOID)
{ //功能:返回GetResponse消息的编码结果message[]
//说明:该类的构造函数已经把版本信息填入到Message[]了,下面的任务是:
//1.填入团体字符串commnunitty信息到Message[]中; 'public'
//2.填入GetResponse的PDU-TYPE编码0xa0=-96和总长度
//3.填入request-id信息到Message[]中;
//4.填入error-status信息到Message[]中; 02 01 00
//5.填入error-index信息到Message[]中; 02 01 00
//6.填入Variable-bindings信息到Message[]中;
//........
//返回编码后的消息
return message;
}//end_of_GetResponsePDU()
//-------------------------------------------------------------------------------
}//end_of_class
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -