0605-5.16.1-CM告警SNMP中DateAndTime類型解析

1.文檔編寫目的


Fayson在前面的文章《 》和《 》介紹了使用SNMP的方式對接,對接SNMP告警時CM提供了告警的MIB文件,對於MIB文件中的每個OID的含義以及如何使用工具查看MIB文件,找到告警的各個指標。本篇文章Fayson主要介紹SNMP 中的DateAndTime 類型的解析

  • 測試環境

1.CM和CDH版本為CDH 5.16.1

2.操作系統版本為RedHat 7.2

2.問題描述


在前面兩篇文章中我們已經知道oid 以1.1.2.2 結尾的對應事件發生的時間,如下圖所示:


0605-5.16.1-CM告警SNMP中DateAndTime類型解析



我們獲取的時間是一長串16進制的數據,當然這並不是一個以秒或者毫秒數字的時間戳。

通過查看cm.mlib 文件可以看到事件發現時間對應的字段notifEventOccurredTime 類型為DateAndTime, DateAndTime是Snmpv2中的一種數據類型,它主要提供了對日期時間的描述。


0605-5.16.1-CM告警SNMP中DateAndTime類型解析



下面是RFC中對DateAndTime的定義:


0605-5.16.1-CM告警SNMP中DateAndTime類型解析



由定義可見,DateAndTime仍然是OCTET STRING類型的數據,只是對每個字節進行了具體的定義。比如前兩個字節表示年,第五個字節表示小時等。

3.DateAndTime解析


通過上述對SNMP 中DateAndTime的類型的結構的瞭解,就可以很輕鬆的通過代碼來解析。

3.1.Java 解析示例


public class Test {
public static void main(String[] args) {
String hexString = " 07 E3 04 08 13 10 3B 08 2B 08 00";
DateAndTimeToString(hexString);
}
public static String DateAndTimeToString(String hexString){
String hexstring = hexString.replace(" ","");
System.out.println("傳入的日期:"+hexstring);
String yeah = hexstring.substring(0,4);
String month = hexstring.substring(4,6);
String day = hexstring.substring(6,8);
String hours = hexstring.substring(8,10);
String min = hexstring.substring(10,12);
String sec = hexstring.substring(12,14);
String decis = hexstring.substring(14,16);
String derutc = hexstring.substring(16,18);
String hourutc = hexstring.substring(18,20);
String minutc = hexstring.substring(20,22);
yeah = String.valueOf(Long.parseLong(yeah, 16));
month = String.valueOf(Long.parseLong(month, 16));
day = String.valueOf(Long.parseLong(day, 16));
hours = String.valueOf(Long.parseLong(hours, 16));
min = String.valueOf(Long.parseLong(min, 16));
sec = String.valueOf(Long.parseLong(sec, 16));
decis = String.valueOf(Long.parseLong(decis, 16));
derutc = String.valueOf(Long.parseLong(derutc, 16));
hourutc = String.valueOf(Long.parseLong(hourutc, 16));
minutc = String.valueOf(Long.parseLong(minutc, 16));
// System.out.println(dec_num);

String time = yeah+"-"+month+"-"+day+" "+hours+":"+min+":"+sec+"."+decis+asciiToString(derutc)+hourutc+minutc;
System.out.println("解析後的日期:"+time);
return time;
}
public static String asciiToString(String value)
{
StringBuffer sbu = new StringBuffer();
String[] chars = value.split(",");
for (int i = 0; i < chars.length; i++) {
sbu.append((char) Integer.parseInt(chars[i]));
}
return sbu.toString();
}
}


運行測試:


0605-5.16.1-CM告警SNMP中DateAndTime類型解析



3.2.Python解析示例


# -*-coding:utf-8-*-
# !/usr/bin/env python
def dateAndTimeToString(hexstring):
#hexstring = "07 E3 04 08 13 10 3B 08 2B 08 00".replace(" ","")
print("傳入的日期:"+hexstring)
hexstring = hexstring.replace(" ","")
yeah = hexstring[0:4]
month = hexstring[4:6]
day = hexstring[6:8]
hours = hexstring[8:10]
mint = hexstring[10:12]
sec = hexstring[12:14]
desis = hexstring[14:16]
derutc = hexstring[16:18]
hourutc = hexstring[18:20]
minutc = hexstring[20:22]
time = str(int(yeah,16))+'-'+str(int(month,16))+'-'+str(int(day,16))+' '+str(int(hours,16))+':'+str(int(mint,16))+':'+str(int(sec,16))+'.'+str(int(desis,16))+chr(int(derutc,16))+str(int(hourutc,16))+str(int(minutc,16))
print("解析後的日期:"+time)
return time
dateAndTimeToString("07 E3 04 08 13 10 3B 08 2B 08 00")



0605-5.16.1-CM告警SNMP中DateAndTime類型解析



運行獲取結果


0605-5.16.1-CM告警SNMP中DateAndTime類型解析



分享到:


相關文章: