-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPacket.py
46 lines (36 loc) · 1.3 KB
/
Packet.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
import binascii
""""
msg type | seqno | data | checksum
The message is 1472 bytes divided up into the following:
- 5 bytes: type
- 4 bytes: seqno
- 1458 bytes: message/data
- 2 bytes: checksum
- 3 bytes: packet delimiters '|'
"""
def make_packet(msg_type=None, seqno=None, msg=None, packet=None):
if msg_type is not None:
body = b"".join([msg_type.encode(), b'|', bytes(str(seqno).encode()), b'|', msg, b'|'])
checksum = generate_checksum(body)
return_packet = body + checksum
return return_packet
else:
body = b"".join([packet[0].encode(), b'|', bytes(str(packet[1]).encode()), b'|', packet[2], b'|'])
checksum = generate_checksum(body)
return_packet = body + checksum
return return_packet
def split_packet(message):
pieces = message.split(b'|')
msg_type, seqno = pieces[0:2] # type and seqno
checksum = pieces[-1] # checksum
data = b'|'.join(pieces[2:-1]) # data
return msg_type.decode(), int(seqno), data, checksum
def validate_checksum(message):
try:
msg, reported_checksum = message.rsplit(b'|', 1)
msg += b'|'
return generate_checksum(msg) == reported_checksum
except:
return False
def generate_checksum(message):
return str(binascii.crc32(message) & 0xffffffff).encode()