-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathparser.py
78 lines (63 loc) · 2.48 KB
/
parser.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import bluebox, fec, predict
import beacon, config
import binascii, struct
import time, aenum, threading
import argparse
from datetime import datetime
class CSP_adress(aenum.Enum):
ESP = 0
FP = 1
LOG = 1
SWISS = 1
AIS2 = 3
UHF = 4
ADCS1 = 5
ADCS2 = 6
MCC = 9
class Parser():
def __init__(self, verify_packets=False):
self.verify_packets = verify_packets
self.ec = fec.PacketHandler()
def verify_packet(self, packet):
pass
def parse_data(self, bin_data):
data, bit_corr, byte_corr = self.ec.deframe(bin_data)
payload = None
if self.verify_packets:
resp = self.verify_packet(bin_data)
# print resp['status'] - something linke: payload data from ss to ss
# : failed verification
# : beacon packet
# if beacon, extract payload
else:
# Parsing with verification
hexdata = binascii.b2a_hex(data)
header = struct.unpack("<I", data[0:4])[0]
# Parse CSP header
src = ((header >> 25) & 0x1f)
dest = ((header >> 20) & 0x1f)
dest_port = ((header >> 14) & 0x3f)
src_port = ((header >> 8) & 0x3f)
if CSP_adress(src) == CSP_adress.UHF and CSP_adress(dest) == CSP_adress.MCC and dest_port == 10:
payload = hexdata[8:-4]
else:
raise Exception("Possibly payload data from {0} to {1}. Will not attempt to parse".format(CSP_adress(src), CSP_adress(dest)))
if payload:
beacon_decode = beacon.Beacon(payload)
return str(beacon_decode)
if __name__ == '__main__':
import binascii
args_parser = argparse.ArgumentParser(description='AAUSAT4 Beacon Parser')
args_parser.add_argument('--file', dest='file_name', required=False, type=str, default=None,
help='Parse beacon from a binary file')
args_parser.add_argument('--data', dest='data', required=False, type=str, default=None,
help='Parse the data specified')
args = args_parser.parse_args()
parser = Parser()
if args.file_name:
raise Exception("Not implemented")
if args.data:
bin_data = binascii.a2b_hex(args.data)
beacon = parser.parse_data(bin_data)
if beacon:
print beacon