Visualizzazione post con etichetta UBX. Mostra tutti i post
Visualizzazione post con etichetta UBX. Mostra tutti i post

giovedì 14 febbraio 2019

UBX Parser Python

un lettore di file derivanti da progetto Zero

-----------------------------
import sys
contatore = 0

#i messaggi UBX-RXM-RAWX hanno classe 2 e id_messaggio 15

with open("02121413.TXT") as f:
  while True:
    c = f.read(1)
    if not c:
        break
    if (ord(c) == 0xB5):
        contatore = contatore + 1
        print(str(contatore) +"   ###########  ")
        print("Sync Char 1   " + hex(ord(c)))
        c=f.read(1)
        if (ord(c) == 0x62):
            buffer = []
            print("Sync Char 2   " + hex(ord(c)))
            ########## CLASS ######################
            c=f.read(1)
            print "Class   " + hex(ord(c))
            buffer.append(ord(c))
            ######### MESSAGE #######################
            c=f.read(1)
            print "Message " + hex(ord(c))
            buffer.append(ord(c))
            #############P1 ##########################
            c=f.read(1)
            print "Lunghezza Payload HB " + hex(ord(c))
            hb = ord(c)
            buffer.append(ord(c))
            #############P1 ##########################
            c=f.read(1)
            print "Lunghezza Payload LB  " + hex(ord(c))
            lb = ord(c)
            buffer.append(ord(c))
            ###########LUNGHEZZA PAYLOAD ##############
            lunghezza = hb+(lb*255) 
            print "Lunghezza Payload " + str(lunghezza)
            #inizia a leggere il payload
            if (lunghezza < 1000):
                    for count in range(1,lunghezza):
                        c=f.read(1)
                        #inserisce il payload in un buffer per validarlo
                        buffer.append(ord(c))
             
                    #calcolo del chacksum 
                    # https://gist.github.com/tomazas/3ab51f91cdc418f5704d
                    #CALCOLA CHECKSUM E STAMPA PAYLOAD
                    CK_A,CK_B = 0, 0
                    for i in range(len(buffer)):
                        print hex(buffer[i])
                        CK_A = CK_A + buffer[i]
                        CK_B = CK_B + CK_A

                    # ensure unsigned byte range
                    CK_A = CK_A & 0xFF
                    CK_B = CK_B & 0xFF

                    print "UBX packet checksum:", ("0x%02X,0x%02X" % (CK_A,CK_B))
                  
                    #lettura primo checksum   
                    c=f.read(1)
                    ck_a1 = ord(c)
                    print "CK_A ric " + hex(ck_a1)
                    #lettura secondo checksum
                    c=f.read(1)
                    ck_b1 = ord(c)
                    print "CK_B ric " + hex(ck_b1)
                    
                    if (CK_A == ck_a1):
                        print "############################VALIDATO############"
                    print "\n\n\n"
                    sys.stdin.readline()

martedì 8 agosto 2017

Checksum su pacchetti UBX Ublox

Circa un anno fa avevo riportato il metodo di calcolo del CRC per i pacchetti dei GPS Ublox

Adesso riporto il codice di calcolo in Python

Esempio di pacchetto UBX


In pratica si procede a scorrere lo stream dei dati fino a raggiungere il pacchetto di sincronia dati definito dai due byte successivi 0xB5-0x62 (oppure in decimanle 181 e 98).
I byte successivi indicano

1 byte = classe pacchetto
1 byte = id pacchetto
2 byte = lunghezza del payload (LSB+MSB)

segue poi il payload della lunghezza calcolata come in precedenza

2 byte di CRC

attenzione: per il calcolo del CRC si devono escludere i primi due byte di sync e gli ultimi due byte di CRC.

il codice in Pyton e' il seguente
-----------------------------------------------------------
# coding=utf-8
with open("c:\Python27\COM.ubx", "rb") as binary_file:
    data = binary_file.read()

msg = []

for x in range(0,100):
    test =  data[x]
    if ((data[x] == 181) and (data[x+1] == 98)):
        print("Sync Found! B5 62")
        msg_cls = data[x+2] #classe
        msg_id = data[x+3] #id
        msg_len_lsb = data[x+4] #byte meno significativo lunghezza messaggio
        msg_len_msb = data[x+5] #byte piu' significativo lunghezza messaggio
        len_msb = msg_len_lsb + (msg_len_msb*256)+4   #lunghezza messaggio
        for t in range(0,len_msb):
            msg.append(data[x+2+t]) # salva il payload 
        msg_chk1 = data[x+len_msb+2] #estrai i due byte di checksum
        msg_chk2 = data[x+len_msb+3]    
        
        #calcolo del checksum del payload
        CK_A,CK_B = 0, 0
        for i in range(len(msg)):
            CK_A = CK_A + msg[i]
            CK_B = CK_B + CK_A
        CK_A = CK_A & 0xFF
        CK_B = CK_B & 0xFF

        # controlla se il CRC del pacchetto e quello calcolato coincidono    
        if ((CK_A == msg_chk1) and (CK_B == msg_chk2)):
            print("Pacchetto ok")

Geologi

  E so anche espatriare senza praticamente toccare strada asfaltata