Complete AX.25 frame with encoding/decoding.
frame = AX25Frame(
destination=AX25Address(\"DEST\", ssid=1),
source=AX25Address(\"SRC\", ssid=2),
control=0x03,
pid=0xF0,
info=b\"Hello\"
)
raw = frame.encode()
decoded = AX25Frame.decode(raw)
Address field with callsign, SSID, C/H bits.
addr = AX25Address(\"KE4AHR\", ssid=1, c_bit=True)
Connected mode session.
conn = AX25Connection(local, remote, initiate=True)
conn.connect()
conn.send_data(b\"Test\")
conn.disconnect()
State transitions per v2.2 SDL.
Immutable protocol parameters.
config = AX25Config(modulo=128, window_size=63)
Window, REJ/SREJ, busy handling.
Adaptive T1 and T3 management.
build_xid_frame(), parse_xid_frame(), negotiate_config()
Full hierarchy under AX25Error.
Abstract base class for all transports (interfaces/transport.py).
Abstract transport-agnostic KISS framing (_stuff, _destuff, _process_byte).
KISS over serial port (pyserial, threaded reader).
tnc = KISSSerial("/dev/ttyUSB0")
KISS over TCP socket with keepalive.
tnc = KISSTCP("localhost", 8001)
G8BPQ multi-drop KISS with active/passive polling and per-port DIGIPEAT.
xk = XKISS("/dev/ttyUSB0", our_calls={"KE4AHR"}, digipeat_ports={0})
xk.enable_digipeat(0)
CRC-16 KISS (Stuttgart Modified Amateur Radio CRC-KISS) with auto-switch.
smack = SMACK("/dev/ttyUSB0")
asyncio-based KISS over TCP. Supports plain and coroutine on_frame callbacks
and asyncio.Queue delivery.
tnc = AsyncKISSTCP("localhost", 8001, on_frame=my_callback)
await tnc.connect()
await tnc.send(raw_ax25_bytes)
Backward-compatible alias for KISSSerial.
Full AGWPE TCP client. Exponential backoff, TCP keepalive, all frame types.
Callbacks: on_frame, on_connected_data, on_outstanding, on_heard_stations.
client = AGWPEClient("localhost", 8000, callsign="KE4AHR")
client.connect()
client.send_ui(port=0, dest="APRS", src="KE4AHR", pid=0xF0, info=b"Hello")
asyncio-based AGWPE client. All callbacks support plain or coroutine functions.
client = AsyncAGWPEClient("localhost", 8000, callsign="KE4AHR")
await client.connect()
await client.send_ui(port=0, dest="APRS", src="KE4AHR", pid=0xF0, info=b"Hello")
TCP server bridging AGWPE protocol clients to a serial KISS TNC.
bridge = AGWSerial("/dev/ttyUSB0", 9600, agw_host="0.0.0.0", agw_port=8000)
bridge.start()
Wraps AX.25 frames with Reed-Solomon FEC (TAPR FX.25). Auto-selects smallest tag.
enc = FX25Encoder()
packet = enc.encode(raw_ax25_frame)
Stream state machine (HUNT / DATA states) that strips FX.25 framing and error-corrects the enclosed AX.25 frame.
dec = FX25Decoder(on_frame=my_callback)
dec.feed(received_bytes)
Legacy module-level aliases kept for backward compatibility.
Import from pyax25_22.interfaces.kiss / pyax25_22.interfaces.agw for new code.
get_logger(__name__) for structured logs.
All public APIs have type hints, docstrings, logging, and tests.
License: LGPL-3.0-or-later
Copyright (C) 2025-2026 Kris Kirby, KE4AHR