⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encodesnmpmessage.java

📁 EncodeSNMPMessage java编程snmp实现
💻 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 + -