2010-12-31 10 views
8

Korzystając z frameworku pysnmp, uzyskuję wartości powodujące spacer snmp. Niestety dla OIDKonwertuj łańcuch oktetów snmp na format daty czytelnej dla człowieka

1.3.6.1.21.69.1.5.8.1.2 (DOCS-CABLE-device-MIB)

dostaję dziwne wynik, który nie mogę poprawnie wydrukować tutaj ponieważ zawiera ASCII znaków jak BELACK

Podczas repr uzyskać:

OctetString ('\ X07 \ xd8 \ t \ x17 \ X03 \ x184 \ x00')

Ale wyjście powinno wyglądać następująco:

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

format jest nazywany "DateAndTime". Jak mogę przetłumaczyć wyjście OctetString na datę/czas "czytelny dla człowieka"?

Odpowiedz

15

Format to 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. 

Można użyć 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

Pamiętaj, że ten obiekt ma zmienną długość, więc ten kod może się nie udać w przypadku niektórych obiektów i pomija informacje o strefie czasowej. – Keith

+0

Należy również zauważyć, że pole 7 to deci-sekundy (0..9), a czasy [6] to mikrosekundy (0 <= x <1000000); poprawne implementacje pozostawia się czytelnikowi. –

2

bezwstydna tutaj: Moduły Pycopia SNMP i SMI poprawnie obsługiwać ten obiekt, a inni także. Pycopia jest instalowany ze źródła i nie zapomnij o mibs file, jeśli go wypróbujesz.

3

@Paulo Scardine: To była najlepsza odpowiedź znaleziona przeze mnie podczas pracy nad rozwiązaniem bardzo podobnego problemu. Trwało to trochę dłużej, zanim udało mi się rozwiązać mój problem, nawet z tą odpowiedzią, dlatego chciałem opublikować odpowiedź uzupełniającą, która może dodać więcej klarowności. (w szczególności problem z datą mającą różne opcje długości).

Poniższy fragment kodu łączy się z serwerem i pobiera czas systemowy, a następnie wyświetla go jako ciąg znaków w celu zilustrowania metody.

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' 

Mam nadzieję, że pomoże to innym osobom, które mają podobne problemy, próbując pracować z tego typu danymi.

Powiązane problemy