0

I'm new on using GRC. I'm trying to decode data from an fsk device. I've grabbed data with rtl_433 -a -t (I/Q 2 channel uint8), eliminate noise, quadrature demod, low pass filter, centered wave and binary sliced. So i get this: enter image description here

Starting from here how can i get bit conversion / packet? I've also tried clock recovery but without success (obtained data does not coincide with graph.

Here my grc flow (there are also clock recovery variables) enter image description here

P.S. How can I cut grabbed data before first "bit"? Here my output Demod vs Binary slicing. If I export binary I get a lot of 0's (caused by the long line before signal). And so after...

enter image description here

Thanks

Community
  • 1
  • 1
fraschizzato
  • 151
  • 1
  • 1
  • 14

1 Answers1

0

I've made a python script to get data. It's wrote Bad and Fast but it works:

import os.path
import string
import sys
import math

def print_buf(counter, buf):
    buf2 = [('%02x' % ord(i)) for i in buf]
    print '{0}: {1:<39}  {2}'.format(('%07x' % (counter * 16)),
        ' '.join([''.join(buf2[i:i + 2]) for i in range(0, len(buf2), 2)]),
        ''.join([c if c in string.printable[:-5] else '.' for c in buf]))

def process(file_path):
    data = ""
    with open(file_path, 'r') as f:
        counter = 0
        firstBit = 0
        while True:
            buf = f.read(16)
            if not buf:
                break
            if buf.encode('hex') == "00000000000000000000000000000000":
                #print "No data"
                if firstBit == 1:
                    #print "0Data"
                    data = data + buf.encode('hex')
            else:
                firstBit = 1
                #print "1Data"
                data = data + buf.encode('hex')
            #print counter
            #print buf.encode('hex')
            #work_data(counter,buf)
            # print_buf(counter, buf)
            counter += 1
    clean_data(data)

def clean_data(data):
    data = data.replace("00","0")
    data = data.replace("01","1")
    data_start = data.find("1")
    data = data[data_start:]
    data_stop = data.rfind("1")
    data = data[:data_stop+1]
    try:
        bit_size(data)
    except Exception, e:
        os.remove(sys.argv[2])
        print "Errore, File Rimosso", sys.argv[2]
    #print data

def bit_size(data):
    #Set one 1 bit max length (evaluated by setting var to an high value and get result)
    var1 = 30
    #Set one 0 bit max length (evaluated by setting var to an high value and get result)
    var2 = 30
    #Get timing from preamble, on eval set it to an high value (best to all file)
    var3 = 10 
    output=""
    flag1 = ""
    flag0 = ""
    avg1 = 0
    avg0 = 0
    min0 = 100
    max0 = 0
    min1 = 100
    max1 = 0
    count1 = 0
    count0 = 0
    sizer = data
    count3 = 0
    count4=0
    count5=0
    while len(sizer) > 1 and count3 <=var3:
        #print len(sizer)
        if sizer[:1] == "1":
           flag1 = sizer.find("0")
           #print "Size 1 " , flag1
           sizer = sizer[flag1:]
           if flag1 < var1 and flag1 > 0:
              print "Size 1 ", flag1
              avg1 += flag1
              count1 +=1
              count3 += 1
              count4 +=1
              if flag1 > max1:
                 max1 = flag1
              if flag1 < min1:
                 min1 = flag1
        else:
           flag0 = sizer.find("1")
           sizer = sizer[flag0:]
           #print "Size 0 " , flag0
           if flag0 < var2 and flag0 >0:
              print "Size 0 ", flag0
              avg0 += flag0
              count0 += 1
              count3 += 1
              count5 += 1
              if flag0 > max0:
                 max0 = flag0
              if flag0 < min0:
                 min0 = flag0

    #print avg0, avg1, count0, count1
    avg0=avg0/count5
    avg1=avg1/count4
    mod0=math.fmod(avg0,count5)
    mod1=math.fmod(avg1,count4)
    print "0--> Media:" , avg0, "Max:" , max0, "Min:",min0, "Resto:", mod0
    print "1--> Media:" , avg1, "Max:" , max1, "Min:",min1, "Resto:", mod1
    sizer = data
    Smax1=0
    Smin1=0
    Savg1=0
    Smax0=0
    Smin0=0
    Savg0=0
    Cavg0=0
    Cavg1=0
    Scor0=0
    Scor1=0
    while len(sizer) > 1:
        if sizer[:1] == "1":
           flag1 = sizer.find("0")
           sizer = sizer[flag1:]
           Nmax1 = flag1 / max1
           Nmin1 = flag1 / min1
           Navg1 = flag1 / avg1
           Smax1+=Nmax1
           Smin1+=Nmin1
           Savg1+=Navg1
           Mmax1=math.fmod(flag1,max1)
           Mmin1=math.fmod(flag1,min1)
           Mavg1=math.fmod(flag1,avg1)
           if Mavg1 > 5:
              Cavg1 = Navg1 + 1
           else:
              Cavg1 = Navg1
           Scor1 += Cavg1
           output += "1" * Cavg1
           #print "1--> Size:", flag1, "EstByMin:", Nmin1, "EstByMax:", Nmax1, "EstByAvg:", Navg1, "RestoDaMedia:", Mavg1, "RestoDaMin:", Mmin1, "RestoDaMax:",Mmax1, "Correzione:", Cavg1
        else:
           flag0 = sizer.find("1")
           sizer = sizer[flag0:]
           #print "Size 0 " , flag0
           if flag0 > 0:
                Nmax0 = flag0 / max0
                Nmin0 = flag0 / min0
                Navg0 = flag0 / avg0
                Smax0+=Nmax0
            Smin0+=Nmin0
            Savg0+=Navg0
            Mmax0=math.fmod(flag0,max0)
            Mmin0=math.fmod(flag0,min0)
            Mavg0=math.fmod(flag0,avg0)
            if Mavg0 > 5:
                   Cavg0 = Navg0 + 1
            else:
                   Cavg0 = Navg0
                Scor0 += Cavg0
                output += "0" * Cavg0
                #print "0--> Size:", flag0, "EstByMin:", Nmin0, "EstByMax:", Nmax0, "EstByAvg:", Navg0, "RestoDaMedia:", Mavg0, "RestoDaMin:", Mmin0, "RestoDaMax:",Mmax0, "Correzione:", Cavg0
    #print "1--> TotByMin:" , Smin1, "TotByMax:",Smax1, "TotByAvg:",Savg1,"TotByCorr:", Scor1
    #print "0--> TotByMin:" , Smin0, "TotByMax:",Smax0, "TotByAvg:",Savg0,"TotByCorr:", Scor0
    #print "---> TotByMin:" , Smin0+Smin1, "TotByMax:" ,Smax1+Smax0, "TotByAvg:", Savg1+Savg0, "TotByCorr:", Scor0+Scor1
    #print output
    data_rec(output)

def data_rec(input):
    byte=""
    count = 1
    precount = 0
    predebug = ""
    debug = input
    while input[:1] == "1":
       input = input[1:]
    while input[:2] == "01":
       precount+=2
       predebug += "01"
       input= input[2:]
    ##print "--------------------------------------"
    ##if precount > 0:
        ##print "Preamble --> OK", predebug, " Count:" , precount
    ##else:
        ##print "Preamble? -->", debug
        ##os.remove(sys.argv[2])
    preamble=input
    #print preamble
    preamble = ' '.join(preamble[i:i+8] for i in range(0, len(preamble), 8)) 
    #print preamble
    output = ''.join(hex(int(a, 2))[2:] for a in preamble.split())
    #print output
    data = input[34:]
    data = ' '.join(data[i:i+8] for i in range(0, len(data), 8)) 
    #print data
    data = ''.join(hex(int(a, 2))[2:] for a in data.split())
    #print data
    for a in data:
         byte+=a
         if math.fmod(count,2) == 0:
            byte+=" "
         count+=1
    print " "
    ##print byte
    ##print "ByteCount:" , count
    print preamble
    ##print "File:" , sys.argv[2]
    ##print "--------------------------------------------------"
if __name__ == '__main__':
    if not os.path.exists(sys.argv[1]):
        print >> (sys.stderr, "The file doesn't exist.")
        sys.exit(1)
    process(sys.argv[1])
fraschizzato
  • 151
  • 1
  • 1
  • 14