Difference between revisions of "KNX contactless"

From OpenScience
Jump to: navigation, search
(WAV-Files)
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
== WAV-Files ==
 
== WAV-Files ==
  
* [http://wwwiuk.informatik.uni-rostock.de/fileadmin/wwwiuk/download/Sample441.wav Sample WAV-File at 44.1kHz sampling frequency] The sound was sampled at 96kHz and than downsampled to 44.1kHz in order to make in playable on most sound cards.
+
* [https://opsci.informatik.uni-rostock.de/repos/datasets/knx/Sample441.wav Sample WAV-File at 44.1kHz sampling frequency] The sound was sampled at 96kHz and than downsampled to 44.1kHz in order to make in playable on most sound cards.
* [http://wwwiuk.informatik.uni-rostock.de/fileadmin/wwwiuk/download/Sample.wav Sample WAV-File at 96kHz sampling frequency]
+
* [https://opsci.informatik.uni-rostock.de/repos/datasets/knx/Sample.wav Sample WAV-File at 96kHz sampling frequency] Sampling frequency 96000Hz, IEEE Float 32 bit samples, little endian, mono
* [http://wwwiuk.informatik.uni-rostock.de/fileadmin/wwwiuk/download/Sample2.wav Sample WAV-File at 96kHz sampling frequency]
+
* [https://opsci.informatik.uni-rostock.de/repos/datasets/knx/Sample2.wav Sample WAV-File at 96kHz sampling frequency] Sampling frequency 96000Hz, IEEE Float 32 bit samples, little endian, mono
  
 
See [http://de.wikipedia.org/wiki/RIFF_WAVE] for information about the file format.
 
See [http://de.wikipedia.org/wiki/RIFF_WAVE] for information about the file format.
Line 9: Line 9:
 
== Programm ==
 
== Programm ==
  
'''
+
    import struct
Created on 30.09.2013
+
    f = open('Sample.wav', 'rb')
+
    f.seek(46)
@author: thm
+
    sample1 = 0
'''
+
    sample2 = 0
 
+
    sample3 = 0
import struct
+
    lasti = 0
#f = open('/Users/thm/Downloads/test.raw', 'rb')
+
    decoded = '0'
f = open('/Users/thm/Documents/workspace/KNX Forensics/Data/Sample3.wav', 'rb')
+
    ordered = ''
f.seek(46)
+
    hexvalue = ''
sample1 = 0
+
    telegrambytes = []
sample2 = 0
+
    i = 1
sample3 = 0
+
    while True:
lasti = 0
+
        sample1 = sample2
decoded = '0'
+
        sample2 = sample3
ordered = ''
+
        buf = f.read(4)
hexvalue = ''
+
        if not buf: break
telegrambytes = []
+
        sample3 = struct.unpack('<f', buf)[0]
i = 1
+
        if sample1 < sample2:
while True:
+
            if sample2 >= sample3:
    sample1 = sample2
+
                if sample2 > 0.1:
    sample2 = sample3
+
                    samplessincelast = i - lasti
    buf = f.read(4)
+
                    print i, sample2, samplessincelast, decoded
    if not buf: break
+
                    if (samplessincelast > 155) and (decoded != ''):
    sample3 = struct.unpack('<f', buf)[0]
+
                        print 'Full telegram ', decoded, hex(int(decoded, 2))
    if sample1 < sample2:
+
                        databits = ''
        if sample2 >= sample3:
+
                        char = ''
            if sample2 > 0.1:
+
                        symbol = ''
                samplessincelast = i - lasti
+
                        length = len(decoded)
                print i, sample2, samplessincelast, decoded
+
                        if length > 11:
                if (samplessincelast > 155) and (decoded != ''):
+
                            for pos in range(0,length):
                    print 'Full telegram ', decoded, hex(int(decoded, 2))
+
                                symbol = symbol + decoded[pos]
                    databits = ''
+
                                if len(symbol) == 13:
                    char = ''
+
                                    startbit = symbol[0]
                    symbol = ''
+
                                    paritybit = symbol[9]
                    length = len(decoded)
+
                                    stopbit = symbol[10]
                    if length > 11:
+
                                    gap = symbol[11] + symbol[12]
                        for pos in range(0,length):
+
                                    for symbolpos in range(1,9):
                            symbol = symbol + decoded[pos]
+
                                        databits = symbol[symbolpos] + databits
                            if len(symbol) == 13:
+
                                    ordered = ordered + databits + ' '
                                startbit = symbol[0]
+
                                    telegrambytes.append(databits)
                                paritybit = symbol[9]
+
                                    hexvalue = hexvalue + hex(int(databits, 2)) + ' '
                                stopbit = symbol[10]
+
                                    print 'Symbol', symbol, 'Startbit', startbit, 'Databits (LSB first)', databits, 'Paritybit', paritybit, 'Stopbit', stopbit, 'Gap', gap
                                gap = symbol[11] + symbol[12]
+
                                    char = ''
                                for symbolpos in range(1,9):
+
                                    symbol = ''
                                    databits = symbol[symbolpos] + databits
+
                                    databits = ''
                                ordered = ordered + databits + ' '
+
                            print 'Full Decoded Frame: ' + ordered + ' hex: ' + hexvalue
                                telegrambytes.append(databits)
+
                           
                                hexvalue = hexvalue + hex(int(databits, 2)) + ' '
+
                            print
                                print 'Symbol', symbol, 'Startbit', startbit, 'Databits (LSB first)', databits, 'Paritybit', paritybit, 'Stopbit', stopbit, 'Gap', gap
+
                            print telegrambytes[0], ' Control byte'  
                                char = ''
+
                            typeoftelegram = telegrambytes[0][0] + telegrambytes[0][1]
                                symbol = ''
+
                            print typeoftelegram, '      ',
                                databits = ''
+
                            if typeoftelegram == '00':
                        print 'Full Decoded Frame: ' + ordered + ' hex: ' + hexvalue
+
                                print 'Extended Data Request'
                       
+
                            elif typeoftelegram == '10':
                        print
+
                                print 'Data Request'
                        print telegrambytes[0], ' Control byte'  
+
                            elif typeoftelegram == '11':
                        typeoftelegram = telegrambytes[0][0] + telegrambytes[0][1]
+
                                print 'Poll Data Request'
                        print typeoftelegram, '      ',
+
                            repeatedtelegram = telegrambytes[0][2]
                        if typeoftelegram == '00':
+
                            print ' ', repeatedtelegram,'    ',
                            print 'Extended Data Request'
+
                            if repeatedtelegram == '1':
                        elif typeoftelegram == '10':
+
                                print 'First transmission'
                            print 'Data Request'
+
                            elif repeatedtelegram == '0':
                        elif typeoftelegram == '11':
+
                                print 'Retransmission'
                            print 'Poll Data Request'
+
                            fixedone = telegrambytes[0][3]
                        repeatedtelegram = telegrambytes[0][2]
+
                            print '  ', fixedone, '    ',
                        print ' ', repeatedtelegram,'    ',
+
                            if fixedone == '1':
                        if repeatedtelegram == '1':
+
                                print 'Fixed 1 - OK'
                            print 'First transmission'
+
                            elif fixedone == '0':
                        elif repeatedtelegram == '0':
+
                                print 'Fixed 1 - Error'
                            print 'Retransmission'
+
                            telegrampriority = telegrambytes[0][4] + telegrambytes[0][5]
                        fixedone = telegrambytes[0][3]
+
                            print '  ', telegrampriority, '  ',
                        print '  ', fixedone, '    ',
+
                            if telegrampriority == '11':
                        if fixedone == '1':
+
                                print 'Priority - Low'
                            print 'Fixed 1 - OK'
+
                            elif telegrampriority == '01':
                        elif fixedone == '0':
+
                                print 'Priority - High'
                            print 'Fixed 1 - Error'
+
                            elif telegrampriority == '10':
                        telegrampriority = telegrambytes[0][4] + telegrambytes[0][5]
+
                                print 'Priority - Alarm'
                        print '  ', telegrampriority, '  ',
+
                            elif telegrampriority == '00':
                        if telegrampriority == '11':
+
                                print 'Priority - System'
                            print 'Priority - Low'
+
                            fixedzeros = telegrambytes[0][6] + telegrambytes[0][7]
                        elif telegrampriority == '01':
+
                            print '    ', fixedzeros, '',
                            print 'Priority - High'
+
                            if fixedzeros == '00':
                        elif telegrampriority == '10':
+
                                print 'Fixed 00 - OK'
                            print 'Priority - Alarm'
+
                            else:
                        elif telegrampriority == '00':
+
                                print 'Fixed 00 - Error'
                            print 'Priority - System'
+
                           
                        fixedzeros = telegrambytes[0][6] + telegrambytes[0][7]
+
                            print   
                        print '    ', fixedzeros, '',
+
                            print telegrambytes[1], ' Source address - first byte'
                        if fixedzeros == '00':
+
                            area = telegrambytes[1][0] + telegrambytes[1][1] + telegrambytes[1][2] + telegrambytes[1][3]
                            print 'Fixed 00 - OK'
+
                            areai = int(area,2)
 +
                            print area, '    Area:', areai
 +
                            line = telegrambytes[1][4] + telegrambytes[1][5] + telegrambytes[1][6] + telegrambytes[1][7]
 +
                            linei = int(line,2)
 +
                            print '  ', line, ' Line:', linei
 +
                            print telegrambytes[2], ' Source address - second byte'
 +
                            device = telegrambytes[2]
 +
                            devicei = int(device,2)
 +
                            print device, ' Device:', devicei
 +
                           
 +
                            print
 +
                            print telegrambytes[3], ' Destination address - first byte'
 +
                            daf = telegrambytes[3][0]
 +
                            print daf, '      ',
 +
                            if daf == '0':
 +
                                print 'Group address'
 +
                            elif daf == '1':
 +
                                print 'Physical address'
 +
                            maingroup = telegrambytes[3][1] + telegrambytes[3][2] + telegrambytes[3][3] + telegrambytes[3][4]
 +
                            maingroupi = int(maingroup,2)
 +
                            print '', maingroup, '    Main group:', maingroupi
 +
                            middlegroup = telegrambytes[3][5] + telegrambytes[3][6] + telegrambytes[3][7]
 +
                            middlegroupi = int(middlegroup,2)
 +
                            print '    ', middlegroup, ' Middle group:', middlegroupi                 
 +
                            print telegrambytes[4], ' Destination address - second byte'
 +
                            subgroup = telegrambytes[4]
 +
                            subgroupi = int(subgroup,2)
 +
                            print subgroup, ' Subgroup:', subgroupi
 +
                            print
 +
                            print 'Telegram:', areai,  '.', linei, '.', devicei, '  ', maingroupi, '/', middlegroupi, '/', subgroupi
 +
                            print
 
                         else:
 
                         else:
                             print 'Fixed 00 - Error'
+
                             print 'ACK / NOACK'
                          
+
                         ordered = ''
                        print   
+
                         decoded = '0'
                        print telegrambytes[1], ' Source address - first byte'
+
                         hexvalue = ''
                        area = telegrambytes[1][0] + telegrambytes[1][1] + telegrambytes[1][2] + telegrambytes[1][3]
+
                         telegrambytes = []
                        areai = int(area,2)
+
                        print area, '     Area:', areai
+
                         line = telegrambytes[1][4] + telegrambytes[1][5] + telegrambytes[1][6] + telegrambytes[1][7]
+
                        linei = int(line,2)
+
                        print '   ', line, ' Line:', linei
+
                        print telegrambytes[2], ' Source address - second byte'
+
                        device = telegrambytes[2]
+
                        devicei = int(device,2)
+
                        print device, ' Device:', devicei
+
                       
+
                        print
+
                        print telegrambytes[3], ' Destination address - first byte'
+
                        daf = telegrambytes[3][0]
+
                        print daf, '      ',
+
                         if daf == '0':
+
                            print 'Group address'
+
                         elif daf == '1':
+
                            print 'Physical address'
+
                        maingroup = telegrambytes[3][1] + telegrambytes[3][2] + telegrambytes[3][3] + telegrambytes[3][4]
+
                        maingroupi = int(maingroup,2)
+
                        print '', maingroup, '    Main group:', maingroupi
+
                        middlegroup = telegrambytes[3][5] + telegrambytes[3][6] + telegrambytes[3][7]
+
                        middlegroupi = int(middlegroup,2)
+
                        print '    ', middlegroup, ' Middle group:', middlegroupi                 
+
                        print telegrambytes[4], ' Destination address - second byte'
+
                        subgroup = telegrambytes[4]
+
                        subgroupi = int(subgroup,2)
+
                        print subgroup, ' Subgroup:', subgroupi
+
                        print
+
                        print 'Telegram:', areai,  '.', linei, '.', devicei, '  ', maingroupi, '/', middlegroupi, '/', subgroupi
+
                        print
+
 
                     else:
 
                     else:
                         print 'ACK / NOACK'
+
                         num = (samplessincelast + 5) / 10
                    ordered = ''
+
                        if num > 1:
                    decoded = '0'
+
                            for j in range(1,num):
                    hexvalue = ''
+
                                decoded = decoded + '1'
                    telegrambytes = []
+
                        decoded = decoded + '0'     
                else:
+
                    lasti = i
                    num = (samplessincelast + 5) / 10
+
        i = i + 1
                    if num > 1:
+
    f.close
                        for j in range(1,num):
+
                            decoded = decoded + '1'
+
                    decoded = decoded + '0'     
+
                lasti = i
+
    i = i + 1
+
f.close
+

Latest revision as of 12:45, 21 May 2016

WAV-Files

See [1] for information about the file format.

Programm

   import struct
   f = open('Sample.wav', 'rb')
   f.seek(46)
   sample1 = 0
   sample2 = 0
   sample3 = 0
   lasti = 0
   decoded = '0'
   ordered = 
   hexvalue = 
   telegrambytes = []
   i = 1
   while True:
       sample1 = sample2
       sample2 = sample3
       buf = f.read(4)
       if not buf: break
       sample3 = struct.unpack('<f', buf)[0]
       if sample1 < sample2:
           if sample2 >= sample3:
               if sample2 > 0.1:
                   samplessincelast = i - lasti
                   print i, sample2, samplessincelast, decoded
                   if (samplessincelast > 155) and (decoded != ):
                       print 'Full telegram ', decoded, hex(int(decoded, 2))
                       databits = 
                       char = 
                       symbol = 
                       length = len(decoded)
                       if length > 11:
                           for pos in range(0,length):
                               symbol = symbol + decoded[pos]
                               if len(symbol) == 13:
                                   startbit = symbol[0]
                                   paritybit = symbol[9]
                                   stopbit = symbol[10]
                                   gap = symbol[11] + symbol[12]
                                   for symbolpos in range(1,9):
                                       databits = symbol[symbolpos] + databits
                                   ordered = ordered + databits + ' '
                                   telegrambytes.append(databits)
                                   hexvalue = hexvalue + hex(int(databits, 2)) + ' '
                                   print 'Symbol', symbol, 'Startbit', startbit, 'Databits (LSB first)', databits, 'Paritybit', paritybit, 'Stopbit', stopbit, 'Gap', gap
                                   char = 
                                   symbol = 
                                   databits = 
                           print 'Full Decoded Frame: ' + ordered + ' hex: ' + hexvalue
                           
                           print
                           print telegrambytes[0], ' Control byte' 
                           typeoftelegram = telegrambytes[0][0] + telegrambytes[0][1]
                           print typeoftelegram, '      ',
                           if typeoftelegram == '00':
                               print 'Extended Data Request'
                           elif typeoftelegram == '10':
                               print 'Data Request'
                           elif typeoftelegram == '11':
                               print 'Poll Data Request'
                           repeatedtelegram = telegrambytes[0][2]
                           print ' ', repeatedtelegram,'     ',
                           if repeatedtelegram == '1':
                               print 'First transmission'
                           elif repeatedtelegram == '0':
                               print 'Retransmission'
                           fixedone = telegrambytes[0][3]
                           print '  ', fixedone, '    ',
                           if fixedone == '1':
                               print 'Fixed 1 - OK'
                           elif fixedone == '0':
                               print 'Fixed 1 - Error'
                           telegrampriority = telegrambytes[0][4] + telegrambytes[0][5]
                           print '   ', telegrampriority, '  ',
                           if telegrampriority == '11':
                               print 'Priority - Low'
                           elif telegrampriority == '01':
                               print 'Priority - High'
                           elif telegrampriority == '10':
                               print 'Priority - Alarm'
                           elif telegrampriority == '00':
                               print 'Priority - System'
                           fixedzeros = telegrambytes[0][6] + telegrambytes[0][7]
                           print '     ', fixedzeros, ,
                           if fixedzeros == '00':
                               print 'Fixed 00 - OK'
                           else:
                               print 'Fixed 00 - Error'
                           
                           print    
                           print telegrambytes[1], ' Source address - first byte'
                           area = telegrambytes[1][0] + telegrambytes[1][1] + telegrambytes[1][2] + telegrambytes[1][3]
                           areai = int(area,2)
                           print area, '     Area:', areai
                           line = telegrambytes[1][4] + telegrambytes[1][5] + telegrambytes[1][6] + telegrambytes[1][7]
                           linei = int(line,2)
                           print '   ', line, ' Line:', linei
                           print telegrambytes[2], ' Source address - second byte'
                           device = telegrambytes[2]
                           devicei = int(device,2)
                           print device, ' Device:', devicei
                           
                           print
                           print telegrambytes[3], ' Destination address - first byte'
                           daf = telegrambytes[3][0]
                           print daf, '       ',
                           if daf == '0':
                               print 'Group address'
                           elif daf == '1':
                               print 'Physical address'
                           maingroup = telegrambytes[3][1] + telegrambytes[3][2] + telegrambytes[3][3] + telegrambytes[3][4]
                           maingroupi = int(maingroup,2)
                           print , maingroup, '    Main group:', maingroupi
                           middlegroup = telegrambytes[3][5] + telegrambytes[3][6] + telegrambytes[3][7]
                           middlegroupi = int(middlegroup,2)
                           print '    ', middlegroup, ' Middle group:', middlegroupi                   
                           print telegrambytes[4], ' Destination address - second byte'
                           subgroup = telegrambytes[4]
                           subgroupi = int(subgroup,2)
                           print subgroup, ' Subgroup:', subgroupi
                           print
                           print 'Telegram:', areai,  '.', linei, '.', devicei, '  ', maingroupi, '/', middlegroupi, '/', subgroupi
                           print
                       else:
                           print 'ACK / NOACK'
                       ordered = 
                       decoded = '0'
                       hexvalue = 
                       telegrambytes = []
                   else:
                       num = (samplessincelast + 5) / 10
                       if num > 1:
                           for j in range(1,num):
                               decoded = decoded + '1'
                       decoded = decoded + '0'    
                   lasti = i
       i = i + 1
   f.close