Skip to content

Instantly share code, notes, and snippets.

@darksidelemm
Created November 22, 2020 10:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darksidelemm/4bd3ca722f4b2dd7079aa8c8c5bb24b3 to your computer and use it in GitHub Desktop.
Save darksidelemm/4bd3ca722f4b2dd7079aa8c8c5bb24b3 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
#
# Print out AX25 dst/src callsigns, and packet path from a SatNOGS HexTDump
#
# Example: python ax25_callsigns.py "AE 90 64 B0 A0 9A 60 9C 6E A6 96 86 40 E1 03 F0 00"
#
import codecs
import sys
def extract_callsign(data):
_dst = data[:6]
_dst_flags = data[6]
_dst_chars = []
for x in _dst:
_dst_chars.append(x>>1)
_dst_ssid = (_dst_flags & 0b00011110) >> 1
_src = data[7:13]
_src_flags = data[13]
_src_chars = []
for x in _src:
_src_chars.append(x>>1)
_src_ssid = (_src_flags & 0b00011110) >> 1
print(f"DST: {bytes(_dst_chars).decode()}-{_dst_ssid} SRC: {bytes(_src_chars).decode()}-{_src_ssid}")
if (_src_flags & 1) == 0:
# Address extension bit set!
_repeater = data[14:20]
_repeater_flags = data[20]
_repeater_chars = []
for x in _repeater:
_repeater_chars.append(x>>1)
_repeater_ssid = (_repeater_flags & 0b00011110) >> 1
print(f"Layer 2 Repeater: {bytes(_repeater_chars).decode()}-{_repeater_ssid}")
if (_repeater_flags & 0x80) != 0:
print("Packet has been repeated.")
else:
print("Packet has NOT been repeated.")
data = sys.argv[1]
#print(f"Source Data: {data}")
_data = data.replace(' ', '')
_data_bytes = codecs.decode(_data, 'hex_codec')
#print(_data_bytes)
extract_callsign(_data_bytes)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment