熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

手動解析snmp的dateAndTime類型

2013-11-23 19:07:36  來源: Java核心技術 

  DateAndTime是Snmpv中的一種數據類型它主要提供了對日期時間的描述我在使用Snmpj開發包時發現其不提供對DateAndTime類型的支持而有時又需要用到該類型於是自己寫了一個方法解析該類型可以實現對DateAndTime類型的格式化並且可以方便地提取各時間項

  下面是RFC中對DateAndTime的定義

  DateAndTime ::= OCTET STRING (SIZE ( | ))

   A datetime specification for the local time of day

   This data type is intended to provide a consistent

   method of reporting date information

  

   field octets contents range

   _____ ______ ________ _____

   year

   (in network byte order)

   month

   day

   hour

   minutes

   seconds

   (use for leapsecond)

   deciseconds

   direction from UTC + /

   (in ascii notation)

   hours from UTC

   minutes from UTC

  

   Note that if only local time is known then

   timezone information (fields ) is not present

  由定義可見DateAndTime仍然是OCTET STRING類型的數據只是對每個字節進行了具體的定義比如前兩個字節表示年第五個字節表示小時等所以如果某個開發包中沒有DateAndTime類型那麼大可以用Octet類型去代替但是這樣做得到的只是一些無意義的亂碼而已因此實現的關鍵就在於按照定義對特殊的Octet數據進行正確的解析

  既然DateAndTime也是Octet String那麼我們就可以按照字節數組來處理他

  import javautilVector;

  import orgapachelogjLogger;

  import orgsnmpjCommandResponderEvent;

  import orgsnmpjPDU;

  import orgsnmpjsmiOctetString;

  import orgsnmpjsmiVariable;

  import orgsnmpjsmiVariableBinding;

  import diationsnmpSNMPManager;

  import diationutilINMSLog;

  public class SNMPAdapter  extends SNMPManager{

  private Logger adapterlog = INMSLoggetInstance()getAdapterLog()

  private Logger recvlog = INMSLoggetInstance()getReceiveLog()

  public SNMPAdapter(String snmpIP String snmpPort){

  super(snmpIP snmpPort)

  }

  @Override

  protected void notifyMsg(CommandResponderEvent event) {

  (Mapper::notifyMsg》    =====NOTIFY_ALarm=====

  PDU pdu = eventgetPDU()

  Vector vec = pdugetVariableBindings()

  (YYWifiMapper::process》    oid size = + vecsize())

  for (int i = ; i < vecsize() i++) {

  String oidNameValue = ;

  VariableBinding vb = (VariableBinding)vecget(i)

  if (vbgetVariable() instanceof OctetString) {

  String value = new String(((OctetString)vbgetVariable())getValue())

  if(vbgetOid()toString()trim()equals() ){

  oidNameValue = OID:+vbgetOid()+\t+value: + parseDateAndTime(vbgetVariable())

  }

  else{

  oidNameValue = OID:+vbgetOid()+\t+value: + valuetrim()

  }

  }

  else{

  //略

  }

  }

  }

  public String parseDateAndTime(Variable v){

  (YYWifiMapper::parseDateAndTime》    v=+v)

  //        (YYWifiMapper::parseDateAndTime》    v string=+vtoString())

  OctetString oct = (OctetString)v;

  //        (YYWifiMapper::parseDateAndTime》    v hex=+ octtoHexString())

  byte[] bts = octgetValue()

  byte[] format_str = new byte[];   //保存格式化過後的時間字符串

  int year;

  int month;

  int day;

  int hour;

  int minute;

  int second;

  int msecond;

  //        for(byte b:bts){

  //            (YYWifiMapper::parseDateAndTime》    bts:+b)

  //        }

  year=bts[]*++bts[];        //(YYWifiMapper::parseDateAndTime》    year:+year)

  month=bts[];

  day=bts[];

  hour=bts[];

  minute=bts[];

  second=bts[];

  msecond=bts[];

  //以下為格式化字符串

  int index=;

  int temp=year;

  for( index>=; index){

  format_str[index]=(byte)(+(temptemp/*))

  temp/=;

  }

  format_str[]=;

  index=;

  temp=month;

  for( index>=; index){

  format_str[index]=(byte)(+(temptemp/*))

  temp/=;

  }

  format_str[]=;

  index=;

  temp=day;

  for( index>=; index){

  format_str[index]=(byte)(+(temptemp/*))

  temp/=;

  }

  format_str[]= ;

  index=;

  temp=hour;

  for( index>=; index){

  format_str[index]=(byte)(+(temptemp/*))

  temp/=;

  }

  format_str[]=:;

  index=;

  temp=minute;

  for( index>=; index){

  format_str[index]=(byte)(+(temptemp/*))

  temp/=;

  }

  format_str[]=:;

  index=;

  temp=second;

  for( index>=; index){

  format_str[index]=(byte)(+(temptemp/*))

  temp/=;

  }

  //        format_str[]=;

  //        index=;

  //        temp=msecond;

  //        for( index>=; index){

  //            format_str[index]=(byte)(+(temptemp/*))

  //            temp/=;

  //        }

  //

  //        format_str[]=;

  //        (YYWifiMapper::parseDateAndTime》    format_str = + new String(format_str))

  return new String(format_str)

  }

  }

  實際運行log如下(注意值為進制)

  YYWifiMapper::parseDateAndTime》  v=:dc:::::b::b::

  YYWifiMapper::parseDateAndTime》  format_str = ::

  處理年的時候稍有不同因為年是由兩個字節表示所以要用高位字節乘再加低位字節處理語句為year=bts[]*++bts[];標准的時間輸出格式應該為YYYYMMDD HH:MM:SS形式

  其實自己用計算器就能算出時間很簡單了

  主要是年的計算byte是可以為負值所以手動計算的公式

  * + dc = * + = 或者* + ( + dc) = * + ( + ()) =

   =

   =

   =

   =

  b =


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26305.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.