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

📄 agent.java

📁 snmp java编程实现snmp代理端
💻 JAVA
字号:
//agent.java
//*"*********************************************************************
//          这是一个实现部分SNMP协议的AGENT程序,它的功能是:             *
//          1.从管理站接收UDP并解封装出SNMP消息;                        *
//          2.对收到的SNMP消息进行解码                                  *
//          3.根据请求对象,从MIB库中查询                                *
//          4.生成GetResponse消息,并按照BER规则进行编码                 *
//          5.把编码后的GetResponse消息封装在UDP中并发送到管理站        *
//......................................................................*
//          Creted by:  ZhuSiFeng(朱思峰)                               *
//          Email him:  ZhuSiFeng2003@yahoo.com.cn                      *
//*"***************************************************"*****************  


import java.io.*; 
import java.net.*; 
//import java.lang.*;


public class agent 
{ 
	//*************************定义类的变量******************************************   	 
	 
	
	 static byte  varBind[]    = new byte[100]; //绑定变量表临时存储	
	 static byte  message[]    = new byte [1024];//存储编码后的结果  
    
	 
	 //定义内置的MIB库,仅仅支持MIB-2下的system组
	static byte sysDescrValueCode[]    ={19,11,119,105,110,100,111,119,115,50,47,47,47};//windows2000
	static byte sysObjectValueCode[]   ={19,9,43,6,1,2,6,6,6,6,6};//1.3.6.1.2.6.6.6.6.6
	static byte sysUptimeValueCode[]   ={19,8,0,0,0,0,1,2,3,4};//15:30:28
	static byte sysContactValueCode[]  ={19,9,119,105,110,100,111,119,115,50,47};//MicroSoft
	static byte sysNameValueCode[]     ={19,5,119,105,110,100,111};//A-101
	static byte sysLocationValueCode[] ={19,10,119,105,110,100,111,119,115,50,47,47};//publicLab
	static byte sysServicesValueCode[] ={19,2,0,2};//TCP/IP

	 
	 

 //功能:将byte数组message中所有元素打印出来(以16进制的形式)
  static void printBytes(byte message[])
	  {
        int  chInt;
		int msgLength=(int)message[1];
        for(int i = 0;i<msgLength;i++)
		  { chInt = (int)message[i];
            if(message[i]<0){chInt += 256;} 
			
			char  ch,ch1;
            int temp1 = chInt/16;
            int temp2 = chInt-temp1*16;
            
            if( temp1 < 10 )
				ch =(char)(temp1 + 48);
            else
				ch =(char) (temp1 + 55);
            if( temp2 < 10 )
				ch1 = (char)(temp2 + 48);
            else 
				ch1 = (char)(temp2 + 55);
			
			System.out.print(ch);
            System.out.print(ch1);            
            System.out.print(" ");
          }
     }

 

//******************************定义主方法*********************************  

   public static void main(String args[]) throws Exception 
    {       
        
  	System.out.println("	***************************************************");
        System.out.println("	***  这是一个简单的SNMP代理端程序。             ***");
        System.out.println("	***  设计人员:  朱思峰 顾世哲 崔霞              ***");
        System.out.println("	***  联系方式: QQ:304854105 ZhuSiFeng@163.com   ***");
        System.out.println("	***************************************************");  
        System.out.println("\n	 正在启动SNMP代理程序 ...............................\n");

        //生成一个DatagramSocke对象        
        DatagramSocket agentSocket = new DatagramSocket(161); 
	//管理站的IP地址和端口号port
	InetAddress managerIPAddress = InetAddress.getByName(null);//缺省设置为同机器
	int managerPort;
		
	//对两个类进行实例化
	    EncodeSNMP myEncode= new EncodeSNMP();
	    DecodeSNMP myDecode= new DecodeSNMP();	
		
        //对收到的数据报进行计数
        int Recvcounts=0;
     try
      { while(true) 
        { 
          //从管理站接收一个UDP数据报
	DatagramPacket receivePacket =  new DatagramPacket(message, message.length); 
	   agentSocket.receive(receivePacket); 		   
           managerIPAddress = receivePacket.getAddress();   
           managerPort = receivePacket.getPort(); 
		   
		   //打印收到的数据报计数值
		   Recvcounts++;
		 System.out.println("\n\n--------------------------------------------------------------------------");  
           System.out.print("        收到的数据报计数值(Recvcounts)= ");
           System.out.println(Recvcounts);
		   
		   //以十六进制打印收到的消息
           System.out.println("\n        接收到的一个来自管理端的SNMP如下: ");
		   printBytes(message);
		   
		   //对收到的消息进行解码
           System.out.println("\n        系统正在对该消息进行解码........ ");
           
		   myDecode.Decode(message);
		   
		   //生成GetResponse消息,并按照BER规则进行编码
			System.out.println("\n        系统正在生成响应消息GetResponse........ ");
			for(int i=0;i<10;i++)
				varBind[i]=message[31+i];
			int OIDNumber= (int)varBind[8];
			switch(OIDNumber)
			{
			case 1:
				for(int i=0;i<sysDescrValueCode.length;i++) 
				      varBind[10+i]=sysDescrValueCode[i];
			case 2:
				for(int i=0;i<sysObjectValueCode.length;i++) 
					varBind[10+i]=sysObjectValueCode[i];					
			case 3:
				for(int i=0;i<sysUptimeValueCode.length;i++) 
					varBind[10+i]=sysUptimeValueCode[i];
			case 4:
				for(int i=0;i<sysContactValueCode.length;i++) 
					varBind[10+i]=sysContactValueCode[i];
			case 5:
				for(int i=0;i<sysNameValueCode.length;i++) 
					varBind[10+i]=sysNameValueCode[i];
			case 6:
				for(int i=0;i<sysLocationValueCode.length;i++) 
					varBind[10+i]=sysLocationValueCode[i];
			case 7:
				for(int i=0;i<sysServicesValueCode.length;i++) 
					varBind[10+i]=sysServicesValueCode[i];
			}
			message=myEncode.GetResponse(varBind);

           //把编码后的GetResponse消息封装在UDP数据报中发送到管理站   
		   int messageLength =(int)(message[1]+2);
           DatagramPacket sendPacket =  new DatagramPacket(message, messageLength, managerIPAddress, managerPort);   
           agentSocket.send(sendPacket);  
		   System.out.println("\n        系统已经把响应消息GetResponse发送到管理端! ");		   
         } //end of while
      } //end of try
     catch(Exception e)
         {System.out.println("There is a Exception.");}
     finally
         {agentSocket.close();
         } 

  }//end of main() 
  
}//end of class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -