电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

手动解析snmp的dateAndTime类型


发布日期:2024/8/24
 

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 =

上一篇:REST及RESTful的实现

下一篇:关于BigDecimal的不精确计算问题