ultra_tnc exposes a legacy-compatible TCP TNC shell backed by ProjectUltra's
ProtocolEngine, StreamingEncoder/StreamingDecoder, and SDL audio I/O.
./build/ultra_tnc \
--audio-output "USB Audio Device" \
--audio-input "USB Audio Device" \
--callsign N0CALL \
--port 8300The command port is --port and the binary data port is --port + 1.
By default, ultra_tnc binds to 127.0.0.1:8300 and 127.0.0.1:8301.
Use --bind 0.0.0.0 only when you intentionally want LAN access.
For TCP-only smoke tests, use --audio-output none --audio-input none.
Point the client at the command port:
[[ax25]]
port = "ultra"
[[transport.legacy_tnc]]
address = "127.0.0.1:8300"If your client separates command and data ports, use:
- Command:
127.0.0.1:8300 - Data:
127.0.0.1:8301
The TNC shell accepts the Phase 1/2 command set:
VERSIONMYCALL <call> [secondary...]LISTEN ON|OFF|CQCONNECT <src> <dst>DISCONNECTABORTBW500,BW2300,BW2750BUFFERSNBITRATESTATS(ProjectUltra extension; see below.)COMPRESSION,CHAT,CWIDPUBLIC,P2P, client-mode probes,IGNOREKISSDCD,RETRIES,CALLINT
STATS\r returns a single-line snapshot of ARQ counters and the current
PHY configuration:
STATS frames_sent=42 frames_recv=38 retx=5 timeouts=2 failed=0 \
out_of_order=1 rate=R1_2 mod=DQPSK mode=OFDM_CHIRP snr=15 bps=2300 \
backlog=128
Fields are space-separated key=value pairs. Counters are session-
scoped (cleared on disconnect/reset). rate, mod, mode track the
current adaptive selection; snr/bps mirror the existing SN/BITRATE
events; backlog mirrors BUFFER. Existing clients ignore unknown
commands, so this is safe to leave on.
Bandwidth mapping:
BW500selectsOFDM_NARROWBW2300selectsOFDM_CHIRPBW2750is accepted for legacy compatibility and maps toOFDM_CHIRP
Binary payload bytes are sent on the data port while connected. Received ProtocolEngine binary payloads are emitted on the data port.
./build/ultra_tnc --audio-output none --audio-input none --port 18300
printf 'VERSION\r' | nc 127.0.0.1 18300Expected reply:
VERSION 0.3.1