예제 #1
0
 def test_ParseCAT048_nodescription(self):
     sample_filename = asterix.get_sample_file('cat048.raw')
     with open(sample_filename, "rb") as f:
         data = f.read()
         packet = asterix.parse(data, verbose=False)
         self.maxDiff = None
         self.assertIsNotNone(packet)
         self.assertIsNotNone(packet[0])
         self.assertIs(len(packet), 1)
         self.assertTrue('I220' in packet[0])
         self.assertEqual(packet[0]['category'], 48)
         self.assertEqual(packet[0]['len'], 45)
         self.assertEqual(packet[0]['crc'], 'C150ED0E')
         self.assertTrue('ts' in packet[0])
         self.assertEqual(packet[0]['I220']['ACAddr']['val'], '3C660C')
         self.assertEqual(packet[0]['I010'], {'SAC': {'val': 25},
                                              'SIC': {'val': 201}})
         self.assertEqual(packet[0]['I170'], {'GHO': {'val': 0},
                                              'TCC': {'val': 0},
                                              'RAD': {'val': 2},
                                              'spare': {'val': 0},
                                              'TRE': {'val': 0},
                                              'CDM': {'val': 0},
                                              'CNF': {'val': 0},
                                              'SUP': {'val': 0},
                                              'FX': {'val': 0},
                                              'DOU': {'val': 0},
                                              'MAH': {'val': 0}})
         self.assertEqual(packet[0]['I200'], {'CGS': {'val': 434.94},
                                              'CHdg': {'val': 124.002685546875}})
         self.assertEqual(packet[0]['I220'], {'ACAddr': {'val': '3C660C'}})
         self.assertEqual(packet[0]['I250'][0], {'TARGET_ALT_STATUS': {'val': 0},
                                                 'res': {'val': 0},
                                                 'FMS_ALT': {'val': 0.0},
                                                 'APP': {'val': 0},
                                                 'ALT_HOLD': {'val': 0},
                                                 'TARGET_ALT_SOURCE': {'val': 0},
                                                 'BDS': {'val': '40'},
                                                 'FMS_ALT_STATUS': {'val': 0},
                                                 'BP_STATUS': {'val': 1},
                                                 'BP': {'val': 227.0},
                                                 'MODE_STATUS': {'val': 0},
                                                 'VNAV': {'val': 0},
                                                 'MCP_ALT_STATUS': {'val': 1},
                                                 'MCP_ALT': {'val': 33008.0}})
         self.assertEqual(packet[0]['I040'], {'THETA': {'val': 340.13671875},
                                              'RHO': {'val': 197.68359375}})
         self.assertEqual(packet[0]['I240'], {'TId': {'val': 'DLH65A  '}})
         self.assertEqual(packet[0]['I140'], {'ToD': {'val': 27354.6015625}})
         self.assertEqual(packet[0]['I070'], {'Mode3A': {'val': '1000'},
                                              'V': {'val': 0},
                                              'L': {'val': 0},
                                              'spare': {'val': 0},
                                              'G': {'val': 0}})
         self.assertEqual(packet[0]['I161'], {'Tn': {'val': 3563}})
         self.assertEqual(packet[0]['I020'], {'SIM': {'val': 0},
                                              'TYP': {'val': 5},
                                              'RAB': {'val': 0},
                                              'RDP': {'val': 0},
                                              'FX': {'val': 0},
                                              'SPI': {'val': 0}})
         self.assertEqual(packet[0]['I090'], {'V': {'val': 0},
                                              'FL': {'val': 330.0},
                                              'G': {'val': 0}})
         self.assertEqual(packet[0]['I230'], {'COM': {'val': 1},
                                              'BDS37': {'val': 5},
                                              'ModeSSSC': {'val': 1},
                                              'STAT': {'val': 0},
                                              'AIC': {'val': 1},
                                              'BDS16': {'val': 1},
                                              'spare': {'val': 0},
                                              'ARC': {'val': 1},
                                              'SI': {'val': 0}})
예제 #2
0
__author__ = 'dsalanti'

import asterix

print(asterix.__version__)

# Read example file from packet resources
sample_filename = asterix.get_sample_file('cat062cat065.raw')

with open(sample_filename, "rb") as f:
    data = f.read()

    # Parse data description=True
    print('Items with description')
    print('----------------------')
    parsed = asterix.parse(data)
    for packet in parsed:
        for item in packet.items():
            print(item)

    print('Items without description')
    print('----------------------')
    # Parse data description=False
    parsed = asterix.parse(data, verbose=False)
    for packet in parsed:
        for item in packet.items():
            print(item)

    print('Textual description of data')
    print('----------------------')
    # describe Asterix data
예제 #3
0
    def test_ParseCAT062CAT065(self):
        sample_filename = asterix.get_sample_file('cat062cat065.raw')
        with open(sample_filename, "rb") as f:
            data = f.read()
            packet = asterix.parse(data)
            self.assertIsNotNone(packet)
            self.assertIsNotNone(packet[0])
            self.assertIs(len(data), 195)
            self.assertIs(len(packet), 3)
            self.assertIs(packet[0]['category'], 62)
            self.assertIs(packet[0]['len'], 66)
            self.assertEqual(packet[0]['crc'], '9CB473BE')
            self.assertIs(packet[1]['category'], 62)
            self.assertIs(packet[1]['len'], 114)
            self.assertEqual(packet[1]['crc'], '5A6E1F96')
            self.assertIs(packet[2]['category'], 65)
            self.assertIs(packet[2]['len'], 9)
            self.assertEqual(packet[2]['crc'], '8B7DA47A')
            self.assertEqual(packet[0]['I220'], {'RoC': {'val': -443.75, 'desc': 'Rate of Climb/Descent'}})
            self.assertEqual(packet[0]['I015'], {'SID': {'val': 4, 'desc': 'Service Identification'}})

            self.assertEqual(packet[0]['I290']['MDS'], {'MDS': {'val': 63.75, 'desc': 'Age of the last Mode S detection used to update the track'}})
            self.assertEqual(packet[0]['I290']['PSR'], {'PSR': {'val': 7.25, 'desc': 'Age of the last primary detection used to update the track'}})
            self.assertEqual(packet[0]['I290']['SSR'], {'SSR': {'val': 0.0, 'desc': 'Age of the last secondary detection used to update the track'}})

            self.assertEqual(packet[0]['I135'], {
                'QNH': {'meaning': 'No QNH correction applied', 'val': 0, 'desc': 'QNH'},
                'CTBA': {'max': 150000.0, 'min': -1500.0, 'val': 15700.0,
                         'desc': 'Calculated Track Barometric Alt'}})
            self.assertEqual(packet[0]['I136'], {
                'MFL': {'max': 150000.0, 'min': -1500.0, 'val': 15700.0, 'desc': 'Measured Flight Level'}})
            self.assertEqual(packet[0]['I185'], {'Vx': {'max': 8191.75, 'min': -8192.0, 'val': -51.25, 'desc': 'Vx'},
                                                 'Vy': {'max': 8191.75, 'min': -8192.0, 'val': 170.0, 'desc': 'Vy'}})
            self.assertEqual(packet[0]['I080'], {'STP': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'MD5': {'meaning': 'No Mode 5 interrogation', 'val': 0, 'desc': ''},
                                                 'FPC': {'meaning': 'Not flight-plan correlated', 'val': 0, 'desc': ''},
                                                 'AMA': {'meaning': 'track not resulting from amalgamation process',
                                                         'val': 0, 'desc': ''},
                                                 'CNF': {'meaning': 'Confirmed track', 'val': 0, 'desc': ''},
                                                 'TSE': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'ME': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'FX': {'meaning': 'End of data item', 'val': 0, 'desc': ''},
                                                 'CST': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'PSR': {'meaning': 'Default value', 'val': 0, 'desc': ''}, 'MDS': {
                    'meaning': 'Age of the last received Mode S track update is higher than system dependent threshold',
                    'val': 1, 'desc': ''},
                                                 'MI': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'SRC': {'meaning': 'height from coverage', 'val': 4,
                                                         'desc': 'Source of calculated track altitude for I062/130'},
                                                 'SIM': {'meaning': 'Actual track', 'val': 0, 'desc': ''},
                                                 'KOS': {'meaning': 'Background service used', 'val': 1, 'desc': ''},
                                                 'AFF': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'MRH': {'meaning': 'Barometric altitude (Mode C) more reliable',
                                                         'val': 0, 'desc': 'Most Reliable Height'},
                                                 'MON': {'meaning': 'Multisensor track', 'val': 0, 'desc': ''},
                                                 'TSB': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'SUC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'MD4': {'meaning': 'No Mode 4 interrogation', 'val': 0, 'desc': ''},
                                                 'SPI': {'meaning': 'default value', 'val': 0, 'desc': ''}, 'ADS': {
                    'meaning': 'Age of the last received ADS-B track update is higher than system dependent threshold',
                    'val': 1, 'desc': ''},
                                                 'AAC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'SSR': {'meaning': 'Default value', 'val': 0, 'desc': ''}})
            self.assertEqual(packet[0]['I070'], {'ToT': {'val': 30911.6640625, 'desc': 'Time Of Track Information'}})
            self.assertEqual(packet[0]['I100'], {'Y': {'val': -106114.0, 'desc': 'Y'},
                                                 'X': {'val': -239083.0, 'desc': 'X'}})
            self.assertEqual(packet[0]['I200'], {'VERTA': {'meaning': 'Descent', 'val': 2, 'desc': 'Vertical Rate'},
                                                 'spare': {'const': 0, 'val': 0, 'desc': 'Spare bit set to zero'},
                                                 'LONGA': {'meaning': 'Decreasing Groundspeed', 'val': 2,
                                                           'desc': 'Longitudinal Acceleration'},
                                                 'TRANSA': {'meaning': 'Constant Course', 'val': 0,
                                                            'desc': 'Transversal Acceleration'},
                                                 'ADF': {'meaning': 'No altitude discrepancy', 'val': 0,
                                                         'desc': 'Altitude Discrepancy Flag'}})
            self.assertEqual(packet[0]['I130'], {
                'Alt': {'max': 150000.0, 'min': -1500.0, 'val': 43300.0, 'desc': 'Altitude'}})
            self.assertEqual(packet[0]['I060'], {'CH': {'meaning': 'No Change', 'val': 0, 'desc': 'Change in Mode 3/A'},
                                                 'G': {'desc': 'Change in Mode 3/A', 'meaning': 'Default', 'val': 0},
                                                 'V': {'desc': 'Change in Mode 3/A', 'meaning': 'Code validated',
                                                       'val': 0},
                                                 'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to 0'},
                                                 'Mode3A': {'val': '4276',
                                                            'desc': 'Mode-3/A reply in octal representation'}})

            self.assertEqual(packet[0]['I295']['MDA'], {'MDA': {'val': 0, 'desc': ''}})
            self.assertEqual(packet[0]['I295']['MFL'], {'MFL': {'val': 0.0, 'desc': ''}})

            self.assertEqual(packet[0]['I010'], {'SAC': {'val': 25, 'desc': 'System Area Code'},
                                                 'SIC': {'val': 100, 'desc': 'System Identification Code'}})

            self.assertEqual(packet[0]['I340']['TYP'], {
                'TYP': {'val': 2, 'meaning': 'Single SSR detection', 'desc': 'Report Type'},
                'TST': {'val': 0, 'meaning': 'Real target report', 'desc': ''},
                'spare': {'val': 0, 'desc': 'Spare bits set to zero', 'const': 0},
                'RAB': {'val': 0, 'meaning': 'Report from aircraft transponder', 'desc': ''},
                'SIM': {'val': 0, 'meaning': 'Actual target report', 'desc': ''}})

            self.assertEqual(packet[0]['I340']['SID'], {
                'SAC': {'val': 25, 'desc': 'System Area Code'},
                'SIC': {'val': 13, 'desc': 'System Identification Code'}})

            self.assertEqual(packet[0]['I340']['MDC'], {
                'CG': {'val': 0, 'meaning': 'Default', 'desc': ''},
                'CV': {'val': 0, 'meaning': 'Code validated', 'desc': ''},
                'ModeC': {'max': 1270.0, 'val': 157.0, 'min': -12.0, 'desc': 'Last Measured Mode C Code'}})

            self.assertEqual(packet[0]['I340']['MDA'], {
                'L': {'val': 0, 'meaning': 'MODE 3/A code as derived from the reply of the transponder',
                      'desc': ''},
                'V': {'val': 0, 'meaning': 'Code validated', 'desc': ''},
                'Mode3A': {'val': '4276',
                           'desc': 'Mode 3/A reply under the form of 4 digits in octal representation'},
                'G': {'val': 0, 'meaning': 'Default', 'desc': ''},
                'spare': {'val': 0, 'desc': 'Spare bit set to zero', 'const': 0}})

            self.assertEqual(packet[0]['I340']['POS'], {
                'RHO': {'max': 256.0, 'val': 186.6875, 'desc': 'Measured distance'},
                'THETA': {'val': 259.453125, 'desc': 'Measured azimuth'}})

            self.assertEqual(packet[0]['I105'], {
                'Lat': {'val': 44.73441302776337,
                        'desc': 'Latitude in WGS.84 in two's complement. Range -90 < latitude < 90 deg.'},
                'Lon': {'val': 13.0415278673172,
                        'desc': 'Longitude in WGS.84 in two's complement. Range -180 < longitude < 180 deg.'}})
            self.assertEqual(packet[0]['I040'], {'TrkN': {'val': 4980, 'desc': 'Track number'}})
            self.assertEqual(packet[0]['I210'], {'Ax': {'val': 0.0, 'desc': 'Ax'}, 'Ay': {'val': 0.0, 'desc': 'Ay'}})
            self.assertEqual(packet[1]['I220'], {'RoC': {'val': 0.0, 'desc': 'Rate of Climb/Descent'}})
            self.assertEqual(packet[1]['I015'], {'SID': {'val': 4, 'desc': 'Service Identification'}})

            self.assertEqual(packet[1]['I290']['MDS'], {'MDS': {'val': 0.0, 'desc': 'Age of the last Mode S detection used to update the track'}})
            self.assertEqual(packet[1]['I290']['SSR'], {'SSR': {'val': 0.0, 'desc': 'Age of the last secondary detection used to update the track'}})

            self.assertEqual(packet[1]['I135'], {
                'QNH': {'meaning': 'No QNH correction applied', 'val': 0, 'desc': 'QNH'},
                'CTBA': {'max': 150000.0, 'min': -1500.0, 'val': 35000.0,
                         'desc': 'Calculated Track Barometric Alt'}})
            self.assertEqual(packet[1]['I136'], {
                'MFL': {'max': 150000.0, 'min': -1500.0, 'val': 35000.0,
                        'desc': 'Measured Flight Level'}})
            self.assertEqual(packet[1]['I185'], {'Vx': {'max': 8191.75, 'min': -8192.0, 'val': 141.5, 'desc': 'Vx'},
                                                 'Vy': {'max': 8191.75, 'min': -8192.0, 'val': -170.75, 'desc': 'Vy'}})
            self.assertEqual(packet[1]['I080'], {'STP': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'MD5': {'meaning': 'No Mode 5 interrogation', 'val': 0, 'desc': ''},
                                                 'FPC': {'meaning': 'Flight plan correlated', 'val': 1, 'desc': ''},
                                                 'AMA': {'meaning': 'track not resulting from amalgamation process',
                                                         'val': 0, 'desc': ''},
                                                 'CNF': {'meaning': 'Confirmed track', 'val': 0, 'desc': ''},
                                                 'TSE': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'ME': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'FX': {'meaning': 'End of data item', 'val': 0, 'desc': ''},
                                                 'CST': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'PSR': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'MDS': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'MI': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'SRC': {'meaning': 'triangulation', 'val': 3,
                                                         'desc': 'Source of calculated track altitude for I062/130'},
                                                 'SIM': {'meaning': 'Actual track', 'val': 0, 'desc': ''},
                                                 'KOS': {'meaning': 'Background service used', 'val': 1, 'desc': ''},
                                                 'AFF': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'MRH': {'meaning': 'Barometric altitude (Mode C) more reliable',
                                                         'val': 0, 'desc': 'Most Reliable Height'},
                                                 'MON': {'meaning': 'Multisensor track', 'val': 0, 'desc': ''},
                                                 'TSB': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                                 'SUC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'MD4': {'meaning': 'No Mode 4 interrogation', 'val': 0, 'desc': ''},
                                                 'SPI': {'meaning': 'default value', 'val': 0, 'desc': ''}, 'ADS': {
                    'meaning': 'Age of the last received ADS-B track update is higher than system dependent threshold',
                    'val': 1, 'desc': ''},
                                                 'AAC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                                 'SSR': {'meaning': 'Default value', 'val': 0, 'desc': ''}})
            self.assertEqual(packet[1]['I070'], {'ToT': {'val': 30911.828125, 'desc': 'Time Of Track Information'}})
            self.assertEqual(packet[1]['I100'], {'Y': {'val': -36106.5, 'desc': 'Y'},
                                                 'X': {'val': -72564.5, 'desc': 'X'}})
            self.assertEqual(packet[1]['I200'], {'VERTA': {'meaning': 'Level', 'val': 0, 'desc': 'Vertical Rate'},
                                                 'spare': {'const': 0, 'val': 0, 'desc': 'Spare bit set to zero'},
                                                 'LONGA': {'meaning': 'Constant Groundspeed', 'val': 0,
                                                           'desc': 'Longitudinal Acceleration'},
                                                 'TRANSA': {'meaning': 'Constant Course', 'val': 0,
                                                            'desc': 'Transversal Acceleration'},
                                                 'ADF': {'meaning': 'No altitude discrepancy', 'val': 0,
                                                         'desc': 'Altitude Discrepancy Flag'}})
            self.assertEqual(packet[1]['I130'], {
                'Alt': {'max': 150000.0, 'min': -1500.0, 'val': 35312.5, 'desc': 'Altitude'}})
            self.assertEqual(packet[1]['I060'], {'CH': {'meaning': 'No Change', 'val': 0, 'desc': 'Change in Mode 3/A'},
                                                 'G': {'desc': 'Change in Mode 3/A', 'meaning': 'Default', 'val': 0},
                                                 'V': {'desc': 'Change in Mode 3/A', 'meaning': 'Code validated',
                                                       'val': 0},
                                                 'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to 0'},
                                                 'Mode3A': {'val': '2535',
                                                            'desc': 'Mode-3/A reply in octal representation'}})

            self.assertEqual(packet[1]['I295']['MFL'], {'MFL': {'val': 0.0, 'desc': ''}})

            self.assertEqual(packet[1]['I390']['DEP'], {'DEP': {'desc': 'Departure Airport', 'val': 'EDDL'}})
            self.assertEqual(packet[1]['I390']['TAC'], {'TYPE': {'desc': 'Type of Aircraft', 'val': 'B738'}})
            self.assertEqual(packet[1]['I390']['DST'],{'DES': {'desc': 'Destination Airport', 'val': 'HELX'}})

            self.assertEqual(packet[1]['I390']['IFI'], {
                'spare': {'const': 0, 'desc': 'spare bits set to zero', 'val': 0},
                'NBR': {'desc': '', 'val': 29233709},
                'TYP': {'meaning': 'Unit 1 internal flight number', 'desc': '', 'val': 1}})

            self.assertEqual(packet[1]['I390']['RDS'], {'NU1': {'desc': 'First number', 'val': ' '},
                    'LTR': {'desc': 'Letter', 'val': ' '},
                    'NU2': {'desc': 'Second number', 'val': ' '}})

            self.assertEqual(packet[1]['I390']['WTC'], {'WTC': {'desc': 'Wake Turbulence Category', 'val': 'M'}})

            self.assertEqual(packet[1]['I390']['CSN'], {'CS': {'desc': 'Callsign', 'val': 'SXD4723'}})
            self.assertEqual(packet[1]['I390']['TAG'], {
                'SIC': {'desc': 'System Identification Code', 'val': 100},
                'SAC': {'desc': 'System Area Code', 'val': 25}})

            self.assertEqual(packet[1]['I390']['FCT'], {
                'spare': {'const': 0, 'desc': 'spare bit set to zero', 'val': 0},
                'FR1FR2': {'meaning': 'Instrument Flight Rules', 'desc': '', 'val': 0},
                'RVSM': {'meaning': 'Approved', 'desc': '', 'val': 1},
                'GATOAT': {'meaning': 'General Air Traffic', 'desc': '', 'val': 1},
                'HPR': {'meaning': 'Normal Priority Flight', 'desc': '', 'val': 0}})

            self.assertEqual(packet[1]['I390']['CFL'], {'CFL': {'desc': 'Current Cleared Flight Level', 'val': 350.0}})
            self.assertEqual(packet[1]['I010'], {'SAC': {'val': 25, 'desc': 'System Area Code'},
                                                 'SIC': {'val': 100, 'desc': 'System Identification Code'}})

            self.assertEqual(packet[1]['I340']['TYP'], {
                'TYP': {'desc': 'Report Type', 'meaning': 'Single ModeS Roll-Call', 'val': 5},
                'TST': {'desc': '', 'meaning': 'Real target report', 'val': 0},
                'SIM': {'desc': '', 'meaning': 'Actual target report', 'val': 0},
                'RAB': {'desc': '', 'meaning': 'Report from aircraft transponder', 'val': 0},
                'spare': {'desc': 'Spare bits set to zero', 'val': 0, 'const': 0}})
            self.assertEqual(packet[1]['I340']['POS'], {
                'RHO': {'desc': 'Measured distance', 'val': 93.1953125, 'max': 256.0},
                'THETA': {'desc': 'Measured azimuth', 'val': 271.4666748046875}})
            self.assertEqual(packet[1]['I340']['MDA'], {
                'G': {'desc': '', 'meaning': 'Default', 'val': 0},
                'L': {'desc': '', 'meaning': 'MODE 3/A code as derived from the reply of the transponder', 'val': 0},
                'V': {'desc': '', 'meaning': 'Code validated', 'val': 0},
                'Mode3A': {'desc': 'Mode 3/A reply under the form of 4 digits in octal representation', 'val': '2535'},
                'spare': {'desc': 'Spare bit set to zero', 'val': 0, 'const': 0}})
            self.assertEqual(packet[1]['I340']['MDC'], {'ModeC': {'min': -12.0, 'desc': 'Last Measured Mode C Code', 'val': 350.0, 'max': 1270.0},
                    'CG': {'desc': '', 'meaning': 'Default', 'val': 0},
                    'CV': {'desc': '', 'meaning': 'Code validated', 'val': 0}})
            self.assertEqual(packet[1]['I340']['SID'], {
                'SIC': {'desc': 'System Identification Code', 'val': 13},
                'SAC': {'desc': 'System Area Code', 'val': 25}})

            self.assertEqual(packet[1]['I380']['COM'], {
                'COM': {'val': 1, 'meaning': 'Comm. A and Comm. B capability',
                        'desc': 'Communications capability of the transponder'},
                'SSC': {'val': 1, 'meaning': 'Yes', 'desc': 'Specific service capability'},
                'STAT': {'val': 0, 'meaning': 'No alert, no SPI, aircraft airborne', 'desc': 'Flight Status'},
                'spare': {'val': 0, 'const': 0, 'desc': 'Spare bits set to zero'},
                'B1A': {'val': 1, 'desc': 'BDS 1,0 bit 16'},
                'B1B': {'val': 6, 'desc': 'BDS 1,0 bits 37/40'},
                'ARC': {'val': 1, 'meaning': '25 ft resolution', 'desc': 'Altitude reporting capability'},
                'AIC': {'val': 1, 'meaning': 'Yes', 'desc': 'Aircraft identification capability'}})
            self.assertEqual(packet[1]['I380']['ADR'], {'ADR': {'val': '3C0A55', 'desc': 'Target Address'}})
            self.assertEqual(packet[1]['I380']['ID'], {'ACID': {'val': 'SXD4723 ', 'desc': 'Target Identification'}})

            self.assertEqual(packet[1]['I105'], {'Lat': {'val': 45.40080785751343,
                                                         'desc': 'Latitude in WGS.84 in two's complement. Range -90 < latitude < 90 deg.'},
                                                 'Lon': {'val': 15.13318419456482,
                                                         'desc': 'Longitude in WGS.84 in two's complement. Range -180 < longitude < 180 deg.'}})
            self.assertEqual(packet[1]['I040'], {'TrkN': {'val': 7977, 'desc': 'Track number'}})
            self.assertEqual(packet[1]['I210'], {'Ax': {'val': 0.0, 'desc': 'Ax'}, 'Ay': {'val': 0.0, 'desc': 'Ay'}})
            self.assertEqual(packet[2]['I015'], {'SID': {'val': 4, 'desc': 'Service Identification'}})
            self.assertEqual(packet[2]['I020'], {'BTN': {'val': 24, 'desc': 'Batch Number'}})
            self.assertEqual(packet[2]['I010'], {'SAC': {'val': 25, 'desc': 'Source Area Code'},
                                                 'SIC': {'val': 100, 'desc': 'Source Identification Code'}})
            self.assertEqual(packet[2]['I030'], {'ToD': {'val': 30913.0546875, 'desc': 'Time Of Message'}})
            self.assertEqual(packet[2]['I000'], {'Typ': {'meaning': 'End of Batch', 'val': 2, 'desc': 'Message Type'}})
예제 #4
0
    def test_ParseCAT048(self):
        sample_filename = asterix.get_sample_file('cat048.raw')
        with open(sample_filename, "rb") as f:
            data = f.read()
            packet = asterix.parse(data)
            self.maxDiff = None
            self.assertIsNotNone(packet)
            self.assertIsNotNone(packet[0])
            self.assertIs(len(packet), 1)
            self.assertTrue('I220' in packet[0])
            self.assertEqual(packet[0]['category'], 48)
            self.assertEqual(packet[0]['len'], 45)
            self.assertEqual(packet[0]['crc'], 'C150ED0E')
            self.assertTrue('ts' in packet[0])
            self.assertEqual(packet[0]['I220']['ACAddr']['val'], '3C660C')
            self.assertEqual(packet[0]['I220']['ACAddr']['desc'], 'AircraftAddress')
            self.assertEqual(packet[0]['I010'], {'SAC': {'desc': 'System Area Code', 'val': 25},
                                                 'SIC': {'desc': 'System Identification Code', 'val': 201}})
            self.assertEqual(packet[0]['I170'], {'GHO': {'desc': 'GHO', 'val': 0, 'meaning': 'True target track'},
                                                 'TCC': {'desc': 'TCC', 'val': 0, 'meaning': 'Radar plane'},
                                                 'RAD': {'desc': 'RAD', 'val': 2, 'meaning': 'SSR/ModeS Track'},
                                                 'spare': {'desc': 'spare bits set to 0', 'const': 0, 'val': 0},
                                                 'TRE': {'desc': 'TRE', 'val': 0, 'meaning': 'Track still alive'},
                                                 'CDM': {'desc': 'CDM', 'val': 0, 'meaning': 'Maintaining'},
                                                 'CNF': {'desc': 'CNF', 'val': 0, 'meaning': 'Confirmed Track'},
                                                 'SUP': {'desc': 'SUP', 'val': 0,
                                                         'meaning': 'Track from cluster network - NO'},
                                                 'FX': {'desc': 'FX', 'val': 0, 'meaning': 'End of Data Item'},
                                                 'DOU': {'desc': 'DOU', 'val': 0, 'meaning': 'Normal confidence'},
                                                 'MAH': {'desc': 'MAH', 'val': 0,
                                                         'meaning': 'No horizontal man. sensed'}})
            self.assertEqual(packet[0]['I200'], {'CGS': {'desc': 'Calculated groundspeed', 'val': 434.94},
                                                 'CHdg': {'desc': 'Calculated heading', 'val': 124.002685546875}})
            self.assertEqual(packet[0]['I220'], {'ACAddr': {'desc': 'AircraftAddress', 'val': '3C660C'}})

            self.assertEqual(packet[0]['I250'][0], {'TARGET_ALT_STATUS': {'desc': 'Status of Target ALT source bits',
                                                                          'meaning': 'No source information provided', 'val': 0},
                                                    'res': {'desc': 'Reserved', 'val': 0},
                                                    'FMS_ALT': {'desc': 'FMS Selected Altitude', 'val': 0.0},
                                                    'APP': {'desc': 'APPROACH Mode', 'meaning': 'Not active', 'val': 0},
                                                    'ALT_HOLD': {'desc': 'ALT HOLD Mode', 'meaning': 'Not active', 'val': 0},
                                                    'TARGET_ALT_SOURCE': {'desc': 'Target ALT source', 'meaning': 'Unknown', 'val': 0},
                                                    'BDS': {'desc': 'BDS register', 'val': '40'},
                                                    'FMS_ALT_STATUS': {'desc': 'FMS Altitude Status', 'val': 0},
                                                    'BP_STATUS': {'desc': 'Barometric Pressure Status', 'val': 1},
                                                    'BP': {'desc': 'Barometric Pressure', 'val': 227.0},
                                                    'MODE_STATUS': {'desc': 'Status of MCP/FCU Mode Bits', 'val': 0},
                                                    'VNAV': {'desc': 'VNAV Mode', 'meaning': 'Not active', 'val': 0},
                                                    'MCP_ALT_STATUS': {'desc': 'MCP Altitude Status', 'val': 1},
                                                    'MCP_ALT': {'desc': 'MCP/FCU Selected Altitude', 'val': 33008.0}})

            self.assertEqual(packet[0]['I040'], {'THETA': {'desc': '', 'val': 340.13671875},
                                                 'RHO': {'desc': '', 'max': 256.0, 'val': 197.68359375}})
            self.assertEqual(packet[0]['I240'],
                             {'TId': {'desc': 'Characters 1-8 (coded on 6 bits each) defining target identification',
                                      'val': 'DLH65A  '}})
            self.assertEqual(packet[0]['I140'], {'ToD': {'desc': 'Time Of Day', 'val': 27354.6015625}})
            self.assertEqual(packet[0]['I070'], {'Mode3A': {'desc': 'Mode-3/A reply code', 'val': '1000'},
                                                 'V': {'desc': '', 'val': 0, 'meaning': 'Code validated'},
                                                 'L': {'desc': '', 'val': 0,
                                                       'meaning': 'Mode-3/A code as derived from the reply of the transponder'},
                                                 'spare': {'desc': 'spare bit set to 0', 'const': 0, 'val': 0},
                                                 'G': {'desc': '', 'val': 0, 'meaning': 'Default'}})
            self.assertEqual(packet[0]['I161'], {'Tn': {'desc': 'Track Number', 'val': 3563}})
            self.assertEqual(packet[0]['I020'], {'SIM': {'desc': 'SIM', 'val': 0, 'meaning': 'Actual target report'},
                                                 'TYP': {'desc': 'TYP', 'val': 5, 'meaning': 'Single ModeS Roll-Call'},
                                                 'RAB': {'desc': 'RAB', 'val': 0,
                                                         'meaning': 'Report from aircraft transponder'},
                                                 'RDP': {'desc': 'RDP', 'val': 0,
                                                         'meaning': 'Report from RDP Chain 1'},
                                                 'FX': {'desc': 'FX', 'val': 0, 'meaning': 'End of Data Item'},
                                                 'SPI': {'desc': 'SPI', 'val': 0, 'meaning': 'Absence of SPI'}})
            self.assertEqual(packet[0]['I090'], {'V': {'desc': '', 'val': 0, 'meaning': 'Code validated'},
                                                 'FL': {'desc': 'FlightLevel', 'val': 330.0},
                                                 'G': {'desc': '', 'val': 0, 'meaning': 'Default'}})
            self.assertEqual(packet[0]['I230'], {'COM': {'desc': 'COM', 'val': 1},
                                                 'BDS37': {'desc': 'BDS 1,0 bits 37/40', 'val': 5},
                                                 'ModeSSSC': {'desc': 'ModeS Specific Service Capability', 'val': 1,
                                                              'meaning': 'Yes'}, 'STAT': {'desc': 'STAT', 'val': 0},
                                                 'AIC': {'desc': 'Aircraft identification capability', 'val': 1,
                                                         'meaning': 'Yes'},
                                                 'BDS16': {'desc': 'BDS 1,0 bit 16', 'val': 1},
                                                 'spare': {'desc': 'spare bit set to 0', 'const': 0, 'val': 0},
                                                 'ARC': {'desc': 'Altitude reporting capability', 'val': 1,
                                                         'meaning': '25ft resolution'},
                                                 'SI': {'desc': 'SI/II Transponder Capability', 'val': 0,
                                                        'meaning': 'SI-Code Capable'}})
예제 #5
0
__author__ = 'dsalanti'

import asterix

# Read example file from packet resources
sample_filename = asterix.get_sample_file('cat062cat065.raw')

with open(sample_filename, "rb") as f:
    data = f.read()

    # Parse data
    parsed = asterix.parse(data)
    print(parsed)

    # describe Asterix data
    formatted = asterix.describe(parsed)
    print(formatted)
예제 #6
0
__author__ = 'dsalanti'

import asterix
import dpkt

# Read example file from packet resources
sample_filename = asterix.get_sample_file('cat_034_048.pcap')
with open(sample_filename) as f:
    pcap = dpkt.pcap.Reader(f)

    cntr=1
    for ts, buf in pcap:
        eth = dpkt.ethernet.Ethernet(buf)
        data = eth.ip.udp.data

        hexdata = ":".join("{:02x}".format(ord(c)) for c in str(data))
        print('Parsing packet %d : %s' %(cntr, hexdata))
        cntr += 1

        # Parse data
        parsed = asterix.parse(data)
        print(parsed)

예제 #7
0
 def test_ParseCAT062CAT065(self):
     sample_filename = asterix.get_sample_file('cat062cat065.raw')
     with open(sample_filename, "rb") as f:
         data = f.read()
         packet = asterix.parse(data)
         self.assertIsNotNone(packet)
         self.assertIsNotNone(packet[0])
         self.assertIs(len(data), 195)
         self.assertIs(len(packet), 3)
         self.assertIs(packet[0]['category'], 62)
         self.assertIs(packet[0]['len'], 66)
         self.assertEqual(packet[0]['crc'], '9CB473BE')
         self.assertIs(packet[1]['category'], 62)
         self.assertIs(packet[1]['len'], 114)
         self.assertEqual(packet[1]['crc'], '5A6E1F96')
         self.assertIs(packet[2]['category'], 65)
         self.assertIs(packet[2]['len'], 9)
         self.assertEqual(packet[2]['crc'], '8B7DA47A')
         self.assertEqual(packet[0]['I220'], {'RoC': {'val': -443.75, 'desc': 'Rate of Climb/Descent'}})
         self.assertEqual(packet[0]['I015'], {'SID': {'val': 4, 'desc': 'Service Identification'}})
         self.assertEqual(packet[0]['I290'], {
             'MDS': {'val': 63.75, 'desc': 'Age of the last Mode S detection used to update the track'},
             'ES': {'val': 0, 'desc': 'ADS-B Extended Squitter age'},
             'PSR': {'val': 7.25, 'desc': 'Age of the last primary detection used to update the track'},
             'FX': {'meaning': 'no extension', 'val': 0, 'desc': 'Extension indicator'},
             'VDL': {'val': 0, 'desc': 'ADS-B VDL Mode 4 age'}, 'ADS': {'val': 0, 'desc': 'ADS-C age'},
             'TRK': {'val': 0, 'desc': 'Track age'},
             'SSR': {'val': 0.0, 'desc': 'Age of the last secondary detection used to update the track'}})
         self.assertEqual(packet[0]['I135'], {
             'QNH': {'meaning': 'No QNH correction applied', 'val': 0, 'desc': 'QNH'},
             'CTBA': {'max': 150000.0, 'min': -1500.0, 'val': 15700.0,
                      'desc': 'Calculated Track Barometric Alt'}})
         self.assertEqual(packet[0]['I136'], {
             'MFL': {'max': 150000.0, 'min': -1500.0, 'val': 15700.0, 'desc': 'Measured Flight Level'}})
         self.assertEqual(packet[0]['I185'], {'Vx': {'max': 8191.75, 'min': -8192.0, 'val': -51.25, 'desc': 'Vx'},
                                              'Vy': {'max': 8191.75, 'min': -8192.0, 'val': 170.0, 'desc': 'Vy'}})
         self.assertEqual(packet[0]['I080'], {'STP': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'MD5': {'meaning': 'No Mode 5 interrogation', 'val': 0, 'desc': ''},
                                              'FPC': {'meaning': 'Not flight-plan correlated', 'val': 0, 'desc': ''},
                                              'AMA': {'meaning': 'track not resulting from amalgamation process',
                                                      'val': 0, 'desc': ''},
                                              'CNF': {'meaning': 'Confirmed track', 'val': 0, 'desc': ''},
                                              'TSE': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'ME': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'FX': {'meaning': 'End of data item', 'val': 0, 'desc': ''},
                                              'CST': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'PSR': {'meaning': 'Default value', 'val': 0, 'desc': ''}, 'MDS': {
                 'meaning': 'Age of the last received Mode S track update is higher than system dependent threshold',
                 'val': 1, 'desc': ''},
                                              'MI': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'SRC': {'meaning': 'height from coverage', 'val': 4,
                                                      'desc': 'Source of calculated track altitude for I062/130'},
                                              'SIM': {'meaning': 'Actual track', 'val': 0, 'desc': ''},
                                              'KOS': {'meaning': 'Background service used', 'val': 1, 'desc': ''},
                                              'AFF': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'MRH': {'meaning': 'Barometric altitude (Mode C) more reliable',
                                                      'val': 0, 'desc': 'Most Reliable Height'},
                                              'MON': {'meaning': 'Multisensor track', 'val': 0, 'desc': ''},
                                              'TSB': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'SUC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'MD4': {'meaning': 'No Mode 4 interrogation', 'val': 0, 'desc': ''},
                                              'SPI': {'meaning': 'default value', 'val': 0, 'desc': ''}, 'ADS': {
                 'meaning': 'Age of the last received ADS-B track update is higher than system dependent threshold',
                 'val': 1, 'desc': ''},
                                              'AAC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'SSR': {'meaning': 'Default value', 'val': 0, 'desc': ''}})
         self.assertEqual(packet[0]['I070'], {'ToT': {'val': 30911.6640625, 'desc': 'Time Of Track Information'}})
         self.assertEqual(packet[0]['I100'], {'Y': {'val': -106114.0, 'desc': 'Y'},
                                              'X': {'val': -239083.0, 'desc': 'X'}})
         self.assertEqual(packet[0]['I200'], {'VERTA': {'meaning': 'Descent', 'val': 2, 'desc': 'Vertical Rate'},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bit set to zero'},
                                              'LONGA': {'meaning': 'Decreasing Groundspeed', 'val': 2,
                                                        'desc': 'Longitudinal Acceleration'},
                                              'TRANSA': {'meaning': 'Constant Course', 'val': 0,
                                                         'desc': 'Transversal Acceleration'},
                                              'ADF': {'meaning': 'No altitude discrepancy', 'val': 0,
                                                      'desc': 'Altitude Discrepancy Flag'}})
         self.assertEqual(packet[0]['I130'], {
             'Alt': {'max': 150000.0, 'min': -1500.0, 'val': 43300.0, 'desc': 'Altitude'}})
         self.assertEqual(packet[0]['I060'], {'CH': {'meaning': 'No Change', 'val': 0, 'desc': 'Change in Mode 3/A'},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to 0'},
                                              'Mode3A': {'val': '4276',
                                                         'desc': 'Mode-3/A reply in octal representation'}})
         self.assertEqual(packet[0]['I295'], {'MD2': {'val': 0, 'desc': ''}, 'MD5': {'val': 0, 'desc': ''},
                                              'MFL': {'val': 0.0, 'desc': ''}, 'MDA': {'val': 0.0, 'desc': ''},
                                              'FX': {'meaning': 'no extension', 'val': 0,
                                                     'desc': 'Extension indicator'}, 'MHG': {'val': 0, 'desc': ''},
                                              'MD1': {'val': 0, 'desc': ''}, 'MD4': {'val': 0, 'desc': ''}})
         self.assertEqual(packet[0]['I010'], {'SAC': {'val': 25, 'desc': 'System Area Code'},
                                              'SIC': {'val': 100, 'desc': 'System Identification Code'}})
         self.assertEqual(packet[0]['I340'], {'SID': {'val': 1, 'desc': 'Sensor Identification'},
                                              'Mode3A': {'val': '4276',
                                                         'desc': 'Mode 3/A reply under the form of 4 digits in octal representation'},
                                              'HEI': {'val': 0, 'desc': 'Measured 3-D Height'},
                                              'TST': {'meaning': 'Real target report', 'val': 0, 'desc': ''},
                                              'G': {'meaning': 'Default', 'val': 0, 'desc': ''},
                                              'V': {'meaning': 'Code validated', 'val': 0, 'desc': ''},
                                              'CG': {'meaning': 'Default', 'val': 0, 'desc': ''},
                                              'FX': {'meaning': 'no extension', 'val': 0,
                                                     'desc': 'Extension indicator'},
                                              'ModeC': {'max': 1270.0, 'min': -12.0, 'val': 157.0,
                                                        'desc': 'Last Measured Mode C Code'},
                                              'CV': {'meaning': 'Code validated', 'val': 0, 'desc': ''},
                                              'SAC': {'val': 25, 'desc': 'System Area Code'},
                                              'RHO': {'max': 256.0, 'val': 186.6875, 'desc': 'Measured distance'},
                                              'SIM': {'meaning': 'Actual target report', 'val': 0, 'desc': ''},
                                              'MDA': {'val': 1, 'desc': 'Last Measured Mode 3/A code'},
                                              'SIC': {'val': 13, 'desc': 'System Identification Code'},
                                              'THETA': {'val': 259.453125, 'desc': 'Measured azimuth'},
                                              'POS': {'val': 1, 'desc': 'Measured Position'},
                                              'TYP': {'meaning': 'Single SSR detection', 'val': 2,
                                                      'desc': 'Report Type'},
                                              'RAB': {'meaning': 'Report from aircraft transponder', 'val': 0,
                                                      'desc': ''},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to zero'},
                                              'L': {
                                                  'meaning': 'MODE 3/A code as derived from the reply of the transponder',
                                                  'val': 0, 'desc': ''},
                                              'MDC': {'val': 1, 'desc': 'Last Measured Mode C code'}})
         self.assertEqual(packet[0]['I105'], {
             'Lat': {'val': 44.73441302776337,
                     'desc': 'Latitude in WGS.84 in twos complement. Range -90 < latitude < 90 deg.'},
             'Lon': {'val': 13.0415278673172,
                     'desc': 'Longitude in WGS.84 in twos complement. Range -180 < longitude < 180 deg.'}})
         self.assertEqual(packet[0]['I040'], {'TrkN': {'val': 4980, 'desc': 'Track number'}})
         self.assertEqual(packet[0]['I210'], {'Ax': {'val': 0.0, 'desc': 'Ax'}, 'Ay': {'val': 0.0, 'desc': 'Ay'}})
         self.assertEqual(packet[1]['I220'], {'RoC': {'val': 0.0, 'desc': 'Rate of Climb/Descent'}})
         self.assertEqual(packet[1]['I015'], {'SID': {'val': 4, 'desc': 'Service Identification'}})
         self.assertEqual(packet[1]['I290'], {
             'MDS': {'val': 0.0,
                     'desc': 'Age of the last Mode S detection used to update the track'},
             'ES': {'val': 0, 'desc': 'ADS-B Extended Squitter age'}, 'PSR': {'val': 1.0,
                                                                              'desc': 'Age of the last primary detection used to update the track'},
             'FX': {'meaning': 'no extension', 'val': 0, 'desc': 'Extension indicator'},
             'VDL': {'val': 0, 'desc': 'ADS-B VDL Mode 4 age'},
             'ADS': {'val': 0, 'desc': 'ADS-C age'},
             'TRK': {'val': 0, 'desc': 'Track age'}, 'SSR': {'val': 0.0,
                                                             'desc': 'Age of the last secondary detection used to update the track'}})
         self.assertEqual(packet[1]['I135'], {
             'QNH': {'meaning': 'No QNH correction applied', 'val': 0, 'desc': 'QNH'},
             'CTBA': {'max': 150000.0, 'min': -1500.0, 'val': 35000.0,
                      'desc': 'Calculated Track Barometric Alt'}})
         self.assertEqual(packet[1]['I136'], {
             'MFL': {'max': 150000.0, 'min': -1500.0, 'val': 35000.0,
                     'desc': 'Measured Flight Level'}})
         self.assertEqual(packet[1]['I185'], {'Vx': {'max': 8191.75, 'min': -8192.0, 'val': 141.5, 'desc': 'Vx'},
                                              'Vy': {'max': 8191.75, 'min': -8192.0, 'val': -170.75, 'desc': 'Vy'}})
         self.assertEqual(packet[1]['I080'], {'STP': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'MD5': {'meaning': 'No Mode 5 interrogation', 'val': 0, 'desc': ''},
                                              'FPC': {'meaning': 'Flight plan correlated', 'val': 1, 'desc': ''},
                                              'AMA': {'meaning': 'track not resulting from amalgamation process',
                                                      'val': 0, 'desc': ''},
                                              'CNF': {'meaning': 'Confirmed track', 'val': 0, 'desc': ''},
                                              'TSE': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'ME': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'FX': {'meaning': 'End of data item', 'val': 0, 'desc': ''},
                                              'CST': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'PSR': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'MDS': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'MI': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'SRC': {'meaning': 'triangulation', 'val': 3,
                                                      'desc': 'Source of calculated track altitude for I062/130'},
                                              'SIM': {'meaning': 'Actual track', 'val': 0, 'desc': ''},
                                              'KOS': {'meaning': 'Background service used', 'val': 1, 'desc': ''},
                                              'AFF': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'MRH': {'meaning': 'Barometric altitude (Mode C) more reliable',
                                                      'val': 0, 'desc': 'Most Reliable Height'},
                                              'MON': {'meaning': 'Multisensor track', 'val': 0, 'desc': ''},
                                              'TSB': {'meaning': 'default value', 'val': 0, 'desc': ''},
                                              'SUC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'MD4': {'meaning': 'No Mode 4 interrogation', 'val': 0, 'desc': ''},
                                              'SPI': {'meaning': 'default value', 'val': 0, 'desc': ''}, 'ADS': {
                 'meaning': 'Age of the last received ADS-B track update is higher than system dependent threshold',
                 'val': 1, 'desc': ''},
                                              'AAC': {'meaning': 'Default value', 'val': 0, 'desc': ''},
                                              'SSR': {'meaning': 'Default value', 'val': 0, 'desc': ''}})
         self.assertEqual(packet[1]['I070'], {'ToT': {'val': 30911.828125, 'desc': 'Time Of Track Information'}})
         self.assertEqual(packet[1]['I100'], {'Y': {'val': -36106.5, 'desc': 'Y'},
                                              'X': {'val': -72564.5, 'desc': 'X'}})
         self.assertEqual(packet[1]['I200'], {'VERTA': {'meaning': 'Level', 'val': 0, 'desc': 'Vertical Rate'},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bit set to zero'},
                                              'LONGA': {'meaning': 'Constant Groundspeed', 'val': 0,
                                                        'desc': 'Longitudinal Acceleration'},
                                              'TRANSA': {'meaning': 'Constant Course', 'val': 0,
                                                         'desc': 'Transversal Acceleration'},
                                              'ADF': {'meaning': 'No altitude discrepancy', 'val': 0,
                                                      'desc': 'Altitude Discrepancy Flag'}})
         self.assertEqual(packet[1]['I130'], {
             'Alt': {'max': 150000.0, 'min': -1500.0, 'val': 35312.5, 'desc': 'Altitude'}})
         self.assertEqual(packet[1]['I060'], {'CH': {'meaning': 'No Change', 'val': 0, 'desc': 'Change in Mode 3/A'},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to 0'},
                                              'Mode3A': {'val': '2535',
                                                         'desc': 'Mode-3/A reply in octal representation'}})
         self.assertEqual(packet[1]['I295'], {'MD2': {'val': 0, 'desc': ''}, 'MD5': {'val': 0, 'desc': ''},
                                              'MFL': {'val': 0.0, 'desc': ''}, 'MDA': {'val': 0.0, 'desc': ''},
                                              'FX': {'meaning': 'no extension', 'val': 0,
                                                     'desc': 'Extension indicator'}, 'MHG': {'val': 0, 'desc': ''},
                                              'MD1': {'val': 0, 'desc': ''}, 'MD4': {'val': 0, 'desc': ''}})
         self.assertEqual(packet[1]['I390'], {'FCT': {'val': 1, 'desc': 'Flight Category'},
                                              'TYPE': {'val': 'B738', 'desc': 'Type of Aircraft'},
                                              'NBR': {'val': 29233709, 'desc': ''},
                                              'GATOAT': {'meaning': 'General Air Traffic', 'val': 1, 'desc': ''},
                                              'STD': {'val': 0, 'desc': 'Standard Instrument Departure'},
                                              'CTL': {'val': 0, 'desc': 'Current Control Position'},
                                              'RVSM': {'meaning': 'Approved', 'val': 1, 'desc': ''},
                                              'CS': {'val': 'SXD4723', 'desc': 'Callsign'},
                                              'DST': {'val': 1, 'desc': 'Destination Airport'},
                                              'AST': {'val': 0, 'desc': 'Aircraft Stand'},
                                              'FX': {'meaning': 'no extension', 'val': 0,
                                                     'desc': 'Extension indicator'},
                                              'IFI': {'val': 1, 'desc': 'IFPS_FLIGHT_ID'},
                                              'STS': {'val': 0, 'desc': 'Stand Status'},
                                              'RDS': {'val': 1, 'desc': 'Runway Designation'},
                                              'DES': {'val': 'HELX', 'desc': 'Destination Airport'},
                                              'CFL': {'val': 350.0, 'desc': 'Current Cleared Flight Level'},
                                              'DEP': {'val': 'EDDL', 'desc': 'Departure Airport'},
                                              'PEC': {'val': 0, 'desc': 'Pre-emergency Callsign'},
                                              'TAC': {'val': 1, 'desc': 'Type of Aircraft'},
                                              'SAC': {'val': 25, 'desc': 'System Area Code'},
                                              'NU2': {'val': ' ', 'desc': 'Second number'},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'spare bit set to zero'},
                                              'PEM': {'val': 0, 'desc': 'Pre-emergency Mode 3/A code'},
                                              'HPR': {'meaning': 'Normal Priority Flight', 'val': 0, 'desc': ''},
                                              'SIC': {'val': 100, 'desc': 'System Identification Code'},
                                              'FR1FR2': {'meaning': 'Instrument Flight Rules', 'val': 0, 'desc': ''},
                                              'TAG': {'val': 1, 'desc': 'FPPS Identification Tag'},
                                              'TYP': {'meaning': 'Unit 1 internal flight number', 'val': 1,
                                                      'desc': ''}, 'TOD': {'val': 0, 'desc': 'Time of Departure'},
                                              'NU1': {'val': ' ', 'desc': 'First number'},
                                              'LTR': {'val': ' ', 'desc': 'Letter'},
                                              'CSN': {'val': 1, 'desc': 'Callsign'},
                                              'STA': {'val': 0, 'desc': 'Standard Instrument Arrival'},
                                              'WTC': {'val': 'M', 'desc': 'Wake Turbulence Category'}})
         self.assertEqual(packet[1]['I010'], {'SAC': {'val': 25, 'desc': 'System Area Code'},
                                              'SIC': {'val': 100, 'desc': 'System Identification Code'}})
         self.assertEqual(packet[1]['I340'], {'SID': {'val': 1, 'desc': 'Sensor Identification'},
                                              'Mode3A': {'val': '2535',
                                                         'desc': 'Mode 3/A reply under the form of 4 digits in octal representation'},
                                              'HEI': {'val': 0, 'desc': 'Measured 3-D Height'},
                                              'TST': {'meaning': 'Real target report', 'val': 0, 'desc': ''},
                                              'G': {'meaning': 'Default', 'val': 0, 'desc': ''},
                                              'V': {'meaning': 'Code validated', 'val': 0, 'desc': ''},
                                              'CG': {'meaning': 'Default', 'val': 0, 'desc': ''},
                                              'FX': {'meaning': 'no extension', 'val': 0,
                                                     'desc': 'Extension indicator'},
                                              'ModeC': {'max': 1270.0, 'min': -12.0, 'val': 350.0,
                                                        'desc': 'Last Measured Mode C Code'},
                                              'CV': {'meaning': 'Code validated', 'val': 0, 'desc': ''},
                                              'SAC': {'val': 25, 'desc': 'System Area Code'},
                                              'RHO': {'max': 256.0, 'val': 93.1953125, 'desc': 'Measured distance'},
                                              'SIM': {'meaning': 'Actual target report', 'val': 0, 'desc': ''},
                                              'MDA': {'val': 1, 'desc': 'Last Measured Mode 3/A code'},
                                              'SIC': {'val': 13, 'desc': 'System Identification Code'},
                                              'THETA': {'val': 271.4666748046875, 'desc': 'Measured azimuth'},
                                              'POS': {'val': 1, 'desc': 'Measured Position'},
                                              'TYP': {'meaning': 'Single ModeS Roll-Call', 'val': 5,
                                                      'desc': 'Report Type'},
                                              'RAB': {'meaning': 'Report from aircraft transponder', 'val': 0,
                                                      'desc': ''},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to zero'},
                                              'L': {
                                                  'meaning': 'MODE 3/A code as derived from the reply of the transponder',
                                                  'val': 0, 'desc': ''},
                                              'MDC': {'val': 1, 'desc': 'Last Measured Mode C code'}})
         self.assertEqual(packet[1]['I380'], {'ACID': {'val': 'SXD4723 ', 'desc': 'Target Identification'},
                                              'FSS': {'val': 0, 'desc': 'Final State SelectedAltitude'},
                                              'STAT': {'meaning': 'No alert, no SPI, aircraft airborne', 'val': 0,
                                                       'desc': 'Flight Status'},
                                              'ARC': {'meaning': '25 ft resolution', 'val': 1,
                                                      'desc': 'Altitude reporting capability'},
                                              'COM': {'meaning': 'Comm. A and Comm. B capability', 'val': 1,
                                                      'desc': 'Communications capability of the transponder'},
                                              'ID': {'val': 1, 'desc': 'Target Identification'},
                                              'TID': {'val': 0, 'desc': 'Trajectory Intent Data'},
                                              'AIC': {'meaning': 'Yes', 'val': 1,
                                                      'desc': 'Aircraft identification capability'},
                                              'B1B': {'val': 6, 'desc': 'BDS 1,0 bits 37/40'},
                                              'SAL': {'val': 0, 'desc': 'Selected Altitude'},
                                              'SAB': {'val': 0, 'desc': 'Status reported by ADS-B'},
                                              'spare': {'const': 0, 'val': 0, 'desc': 'Spare bits set to zero'},
                                              'ACS': {'val': 0, 'desc': 'ACAS Resolution Advisory Report'},
                                              'TAS': {'val': 0, 'desc': 'True Airspeed'},
                                              'ADR': {'val': '3C0A55', 'desc': 'Target Address'},
                                              'SSC': {'meaning': 'Yes', 'val': 1,
                                                      'desc': 'Specific service capability'},
                                              'MHG': {'val': 0, 'desc': 'Magnetic Heading'},
                                              'IAS': {'val': 0, 'desc': 'Indicated Airspeed/Mach Number'},
                                              'FX': {'meaning': 'no extension', 'val': 0,
                                                     'desc': 'Extension indicator'},
                                              'TIS': {'val': 0, 'desc': 'Trajectory Intent Status'},
                                              'GVR': {'val': 0, 'desc': 'Geometric Vertical Rate'},
                                              'B1A': {'val': 1, 'desc': 'BDS 1,0 bit 16'},
                                              'BVR': {'val': 0, 'desc': 'Barometric Vertical Rate'}})
         self.assertEqual(packet[1]['I105'], {'Lat': {'val': 45.40080785751343,
                                                      'desc': 'Latitude in WGS.84 in twos complement. Range -90 < latitude < 90 deg.'},
                                              'Lon': {'val': 15.13318419456482,
                                                      'desc': 'Longitude in WGS.84 in twos complement. Range -180 < longitude < 180 deg.'}})
         self.assertEqual(packet[1]['I040'], {'TrkN': {'val': 7977, 'desc': 'Track number'}})
         self.assertEqual(packet[1]['I210'], {'Ax': {'val': 0.0, 'desc': 'Ax'}, 'Ay': {'val': 0.0, 'desc': 'Ay'}})
         self.assertEqual(packet[2]['I015'], {'SID': {'val': 4, 'desc': 'Service Identification'}})
         self.assertEqual(packet[2]['I020'], {'BTN': {'val': 24, 'desc': 'Batch Number'}})
         self.assertEqual(packet[2]['I010'], {'SAC': {'val': 25, 'desc': 'Source Area Code'},
                                              'SIC': {'val': 100, 'desc': 'Source Identification Code'}})
         self.assertEqual(packet[2]['I030'], {'ToD': {'val': 30913.0546875, 'desc': 'Time Of Message'}})
         self.assertEqual(packet[2]['I000'], {'Typ': {'meaning': 'End of Batch', 'val': 2, 'desc': 'Message Type'}})
예제 #8
0
 def test_ParseCAT048(self):
     sample_filename = asterix.get_sample_file('cat048.raw')
     with open(sample_filename, "rb") as f:
         data = f.read()
         packet = asterix.parse(data)
         self.maxDiff = None
         self.assertIsNotNone(packet)
         self.assertIsNotNone(packet[0])
         self.assertIs(len(packet), 1)
         self.assertTrue('I220' in packet[0])
         self.assertEqual(packet[0]['category'], 48)
         self.assertEqual(packet[0]['len'], 45)
         self.assertEqual(packet[0]['crc'], 'C150ED0E')
         self.assertTrue('ts' in packet[0])
         self.assertEqual(packet[0]['I220']['ACAddr']['val'], '3C660C')
         self.assertEqual(packet[0]['I220']['ACAddr']['desc'], 'AircraftAddress')
         self.assertEqual(packet[0]['I010'], {'SAC': {'desc': 'System Area Code', 'val': 25},
                                              'SIC': {'desc': 'System Identification Code', 'val': 201}})
         self.assertEqual(packet[0]['I170'], {'GHO': {'desc': 'GHO', 'val': 0, 'meaning': 'True target track'},
                                              'TCC': {'desc': 'TCC', 'val': 0, 'meaning': 'Radar plane'},
                                              'RAD': {'desc': 'RAD', 'val': 2, 'meaning': 'SSR/ModeS Track'},
                                              'spare': {'desc': 'spare bits set to 0', 'const': 0, 'val': 0},
                                              'TRE': {'desc': 'TRE', 'val': 0, 'meaning': 'Track still alive'},
                                              'CDM': {'desc': 'CDM', 'val': 0, 'meaning': 'Maintaining'},
                                              'CNF': {'desc': 'CNF', 'val': 0, 'meaning': 'Confirmed Track'},
                                              'SUP': {'desc': 'SUP', 'val': 0,
                                                      'meaning': 'Track from cluster network - NO'},
                                              'FX': {'desc': 'FX', 'val': 0, 'meaning': 'End of Data Item'},
                                              'DOU': {'desc': 'DOU', 'val': 0, 'meaning': 'Normal confidence'},
                                              'MAH': {'desc': 'MAH', 'val': 0,
                                                      'meaning': 'No horizontal man. sensed'}})
         self.assertEqual(packet[0]['I200'], {'CGS': {'desc': 'Calculated groundspeed', 'val': 434.94},
                                              'CHdg': {'desc': 'Calculated heading', 'val': 124.002685546875}})
         self.assertEqual(packet[0]['I220'], {'ACAddr': {'desc': 'AircraftAddress', 'val': '3C660C'}})
         self.assertEqual(packet[0]['I250'], {'ALT_HOLD': {'val': 0, 'desc': 'ALT HOLD Mode',
                                                            'meaning': 'Not active'},
                                               'APP': {'val': 0, 'desc': 'APPROACH Mode', 'meaning': 'Not active'},
                                               'BP_STATUS': {'val': 1, 'desc': 'Barometric Pressure Status'},
                                               'MODE_STATUS': {'val': 0, 'desc': 'Status of MCP/FCU Mode Bits'},
                                               'MCP_ALT': {'val': 33008.0, 'desc': 'MCP/FCU Selected Altitude'},
                                               'VNAV': {'val': 0, 'desc': 'VNAV Mode', 'meaning': 'Not active'},
                                               'FMS_ALT_STATUS': {'val': 0, 'desc': 'FMS Altitude Status'},
                                               'FMS_ALT': {'val': 0.0, 'desc': 'FMS Selected Altitude'},
                                               'res': {'val': 0, 'desc': 'Reserved'},
                                               'MCP_ALT_STATUS': {'val': 1, 'desc': 'MCP Altitude Status'},
                                               'TARGET_ALT_STATUS': {'val': 0, 'desc': 'Status of Target ALT source bits',
                                                                     'meaning': 'No source information provided'},
                                               'BP': {'val': 227.0, 'desc': 'Barometric Pressure'},
                                               'TARGET_ALT_SOURCE': {'val': 0, 'desc': 'Target ALT source',
                                                                     'meaning': 'Unknown'}})
         self.assertEqual(packet[0]['I040'], {'THETA': {'desc': '', 'val': 340.13671875},
                                              'RHO': {'desc': '', 'max': 256.0, 'val': 197.68359375}})
         self.assertEqual(packet[0]['I240'],
                          {'TId': {'desc': 'Characters 1-8 (coded on 6 bits each) defining target identification',
                                   'val': 'DLH65A  '}})
         self.assertEqual(packet[0]['I140'], {'ToD': {'desc': 'Time Of Day', 'val': 27354.6015625}})
         self.assertEqual(packet[0]['I070'], {'Mode3A': {'desc': 'Mode-3/A reply code', 'val': '1000'},
                                              'V': {'desc': '', 'val': 0, 'meaning': 'Code validated'},
                                              'L': {'desc': '', 'val': 0,
                                                    'meaning': 'Mode-3/A code as derived from the reply of the transponder'},
                                              'spare': {'desc': 'spare bit set to 0', 'const': 0, 'val': 0},
                                              'G': {'desc': '', 'val': 0, 'meaning': 'Default'}})
         self.assertEqual(packet[0]['I161'], {'Tn': {'desc': 'Track Number', 'val': 3563}})
         self.assertEqual(packet[0]['I020'], {'SIM': {'desc': 'SIM', 'val': 0, 'meaning': 'Actual target report'},
                                              'TYP': {'desc': 'TYP', 'val': 5, 'meaning': 'Single ModeS Roll-Call'},
                                              'RAB': {'desc': 'RAB', 'val': 0,
                                                      'meaning': 'Report from aircraft transponder'},
                                              'RDP': {'desc': 'RDP', 'val': 0,
                                                      'meaning': 'Report from RDP Chain 1'},
                                              'FX': {'desc': 'FX', 'val': 0, 'meaning': 'End of Data Item'},
                                              'SPI': {'desc': 'SPI', 'val': 0, 'meaning': 'Absence of SPI'}})
         self.assertEqual(packet[0]['I090'], {'V': {'desc': '', 'val': 0, 'meaning': 'Code validated'},
                                              'FL': {'desc': 'FlightLevel', 'val': 330.0},
                                              'G': {'desc': '', 'val': 0, 'meaning': 'Default'}})
         self.assertEqual(packet[0]['I230'], {'COM': {'desc': 'COM', 'val': 1},
                                              'BDS37': {'desc': 'BDS 1,0 bits 37/40', 'val': 5},
                                              'ModeSSSC': {'desc': 'ModeS Specific Service Capability', 'val': 1,
                                                           'meaning': 'Yes'}, 'STAT': {'desc': 'STAT', 'val': 0},
                                              'AIC': {'desc': 'Aircraft identification capability', 'val': 1,
                                                      'meaning': 'Yes'},
                                              'BDS16': {'desc': 'BDS 1,0 bit 16', 'val': 1},
                                              'spare': {'desc': 'spare bit set to 0', 'const': 0, 'val': 0},
                                              'ARC': {'desc': 'Altitude reporting capability', 'val': 1,
                                                      'meaning': '25ft resolution'},
                                              'SI': {'desc': 'SI/II Transponder Capability', 'val': 0,
                                                     'meaning': 'SI-Code Capable'}})
예제 #9
0
 def test_ParseCAT048_nodescription(self):
     sample_filename = asterix.get_sample_file('cat048.raw')
     with open(sample_filename, "rb") as f:
         data = f.read()
         packet = asterix.parse(data, verbose=False)
         self.maxDiff = None
         self.assertIsNotNone(packet)
         self.assertIsNotNone(packet[0])
         self.assertIs(len(packet), 1)
         self.assertTrue('I220' in packet[0])
         self.assertEqual(packet[0]['category'], 48)
         self.assertEqual(packet[0]['len'], 45)
         self.assertEqual(packet[0]['crc'], 'C150ED0E')
         self.assertTrue('ts' in packet[0])
         self.assertEqual(packet[0]['I220']['ACAddr']['val'], '3C660C')
         self.assertEqual(packet[0]['I010'], {'SAC': {'val': 25},
                                              'SIC': {'val': 201}})
         self.assertEqual(packet[0]['I170'], {'GHO': {'val': 0},
                                              'TCC': {'val': 0},
                                              'RAD': {'val': 2},
                                              'spare': {'val': 0},
                                              'TRE': {'val': 0},
                                              'CDM': {'val': 0},
                                              'CNF': {'val': 0},
                                              'SUP': {'val': 0},
                                              'FX': {'val': 0},
                                              'DOU': {'val': 0},
                                              'MAH': {'val': 0}})
         self.assertEqual(packet[0]['I200'], {'CGS': {'val': 434.94},
                                              'CHdg': {'val': 124.002685546875}})
         self.assertEqual(packet[0]['I220'], {'ACAddr': {'val': '3C660C'}})
         self.assertEqual(packet[0]['I250'][0], {'TARGET_ALT_STATUS': {'val': 0},
                                                 'res': {'val': 0},
                                                 'FMS_ALT': {'val': 0.0},
                                                 'APP': {'val': 0},
                                                 'ALT_HOLD': {'val': 0},
                                                 'TARGET_ALT_SOURCE': {'val': 0},
                                                 'BDS': {'val': '40'},
                                                 'FMS_ALT_STATUS': {'val': 0},
                                                 'BP_STATUS': {'val': 1},
                                                 'BP': {'val': 227.0},
                                                 'MODE_STATUS': {'val': 0},
                                                 'VNAV': {'val': 0},
                                                 'MCP_ALT_STATUS': {'val': 1},
                                                 'MCP_ALT': {'val': 33008.0}})
         self.assertEqual(packet[0]['I040'], {'THETA': {'val': 340.13671875},
                                              'RHO': {'val': 197.68359375}})
         self.assertEqual(packet[0]['I240'], {'TId': {'val': 'DLH65A  '}})
         self.assertEqual(packet[0]['I140'], {'ToD': {'val': 27354.6015625}})
         self.assertEqual(packet[0]['I070'], {'Mode3A': {'val': '1000'},
                                              'V': {'val': 0},
                                              'L': {'val': 0},
                                              'spare': {'val': 0},
                                              'G': {'val': 0}})
         self.assertEqual(packet[0]['I161'], {'Tn': {'val': 3563}})
         self.assertEqual(packet[0]['I020'], {'SIM': {'val': 0},
                                              'TYP': {'val': 5},
                                              'RAB': {'val': 0},
                                              'RDP': {'val': 0},
                                              'FX': {'val': 0},
                                              'SPI': {'val': 0}})
         self.assertEqual(packet[0]['I090'], {'V': {'val': 0},
                                              'FL': {'val': 330.0},
                                              'G': {'val': 0}})
         self.assertEqual(packet[0]['I230'], {'COM': {'val': 1},
                                              'BDS37': {'val': 5},
                                              'ModeSSSC': {'val': 1},
                                              'STAT': {'val': 0},
                                              'AIC': {'val': 1},
                                              'BDS16': {'val': 1},
                                              'spare': {'val': 0},
                                              'ARC': {'val': 1},
                                              'SI': {'val': 0}})