2010-12-31 15 views
8

Utilizzando il quadro pysnmp ottengo alcuni valori facendo una passeggiata SNMP. Purtroppo per l'OIDConverti stringa di SNMP ottetto formato della data leggibile

1.3.6.1.21.69.1.5.8.1.2 (DOCS-CABLE-DISPOSITIVO-MIB)

ho un risultato strano che non posso stampare qui correttamente, in quanto contiene caratteri ASCII come BELACK

quando si fa un repr ottengo:

OctetString ('\ x07 \ xd8 \ t \ x17 \ x03 \ x184 \ x00')

Ma l'uscita dovrebbe essere simile:

2008-9-23,3: 24: 52,0

il formato si chiama "DateAndTime". Come posso tradurre l'output OctetString in una data/ora "leggibile"?

risposta

15

Il formato è here.

A date-time specification. 
      field octets contents     range 
      ----- ------ --------     ----- 
       1  1-2 year*      0..65536 
       2  3 month      1..12 
       3  4 day      1..31 
       4  5 hour      0..23 
       5  6 minutes     0..59 
       6  7 seconds     0..60 
          (use 60 for leap-second) 
       7  8 deci-seconds    0..9 
       8  9 direction from UTC  '+'/'-' 
       9  10 hours from UTC*   0..13 
      10  11 minutes from UTC   0..59 
* Notes: 
      - the value of year is in network-byte order 
      - daylight saving time in New Zealand is +13 For example, 
       Tuesday May 26, 1992 at 1:30:15 PM EDT would be displayed as: 
       1992-5-26,13:30:15.0,-4:0 
       Note that if only local time is known, then timezone 
       information (fields 8-10) is not present. 

È possibile utilizzare struct.unpack:

>>> import struct, datetime 
>>> s = '\x07\xd8\t\x17\x03\x184\x00' 
>>> datetime.datetime(*struct.unpack('>HBBBBBB', s)) 
datetime.datetime(2008, 9, 23, 3, 24, 52) 
+0

Attenzione che questo oggetto ha una lunghezza variabile in modo tale codice potrebbe sicuro per alcuni oggetti, e trova l'informazione fuso orario. – Keith

+0

Si noti inoltre che il campo 7 è deci-secondi (0,9) mentre il clockuple [6] è microsecondi (0 <= x <1000000); le implementazioni corrette sono lasciate come esercizio al lettore. –

2

spudorato qui: I moduli SNMP e SMI Pycopia gestire correttamente questo oggetto, e altri. Pycopia è installato dai sorgenti, e non dimenticate il mibs file se lo provate.

3

@Paulo Scardine: Questa è stata la risposta migliore che ho trovato on-line quando si lavora per risolvere un problema molto simile. Ho ancora impiegato un po 'di tempo per risolvere il problema anche con questa risposta, quindi ho voluto postare una risposta di follow-up che potrebbe aggiungere più chiarezza. (in particolare il problema con la data con diverse opzioni di lunghezza).

Il seguente pezzo di codice si connette a un server e afferra il tempo di sistema e quindi emette come una stringa per illustrare il metodo.

import netsnmp 
import struct 
oid = netsnmp.Varbind('hrSystemDate.0') 
resp = netsnmp.snmpget(oid, Version=1, DestHost='<ip>', Community='public') 
oct = str(resp[0]) 
# hrSystemDate can be either 8 or 11 units in length. 
oct_len = len(oct) 
fmt_mapping = dict({8:'>HBBBBBB', 11:'>HBBBBBBcBB'}) 
if oct_len == 8 or oct_len == 11: 
    t = struct.unpack(fmt_mapping[oct_len], oct) 
    print 'date tuple: %s' % (repr(t)) 
else: 
    print 'invalid date format' 

Spero che questo aiuti altre persone che stanno avendo problemi simili cercando di lavorare con questo tipo di dati.