TETRA stack — base station (TETRA hotspot) with microservice architecture
TetraSpot is an implementation of the TETRA protocol stack. The project enables running a TETRA base station with support for voice calls (group, individual simplex and full-duplex), SDS messages, GPS location (LIP) and integration with external networks (TetraPack via the TetraPoland hub, SIP/PABX). The microservice-based architecture allows flexible deployment — from a single Raspberry Pi 5 to multi-site configurations.
BS #1 (RPi5) BS #2 (RPi5) BS #N
┌──────────┐ ┌──────────┐ ┌─────┐
│ PHY/LMAC │ │ PHY/LMAC │ │ ... │
│ UMAC/LLC │ │ UMAC/LLC │ │ │
│ MLE │ │ MLE │ │ │
└────┬─────┘ └────┬─────┘ └──┬──┘
│ │ │
└───────────────┼─────────────┘
│ QUIC (bitcode)
┌────────────┴────────────┐
│ SWITCH (DXT) :4433 │
│ MM / CMCE / SNDCP │
│ Service Registry │
└────────────┬────────────┘
│
┌─────────┬────────┬───┼───┬──────────┬───────────┐
│ │ │ │ │ │
Audio GW SDS Auth LIP Telephony Management
(ACELP, Server Server Server GW Panel
Brew/RTP) (REST) (TEA/ (GPS) (SIP/PABX) :8080
OTAR)Star topology with a central Switch (DXT). All microservices communicate via QUIC with bitcode serialization.
author: SP8MB
Web-based TETRA network analyzer on Raspberry Pi. Real-time monitoring of 64 channels with voice playback, call recording, spectrum analysis, SDS decoding and terminal location tracking — all from a browser.

RTL-SDR USB Dongle
|
GNURadio 3.10
(TETRA demodulation + FFT)
|
+---> UDP:42001 ---------> tetra-rx (osmo-tetra)
+---> TCP:42002 (FFT/ZMQ) |
+---> UDP:7379 (TETMON)
+---> TCP:42003 (constellation)
|
TLA Backend
(FastAPI + WS)
HTTP:8080
|
BrowserSoftware TETRA terminal — PTT-over-Cellular
Android app connecting to a TetraSpot server via the Brew protocol (WebSocket). It works as a software TETRA terminal — users get full radio functionality (group and individual calls, SDS, talkgroup scanning) on a regular phone with a cellular or Wi-Fi connection. Compatible with hardware PTT buttons and Bluetooth headsets (SCO).
ATAK integration with TETRA radio
Plugin for ATAK (Android Team Awareness Kit) integrating the tactical map with TETRA radio. Terminal positions (LIP) appear on the ATAK map as CoT (Cursor on Target), SDS messages show as alerts, and PTT allows transmission without leaving the map. Radio connection via USB/Serial, Bluetooth SPP or TCP gateway.
JavaCard SIM applet for TETRA terminals
JavaCard applet implementing the TETRA identity module (TIM/TSIM) per ETSI TS 100 812-2. Provides the full TAA1 authentication chain (HURDLE + TA11/TA12/TA21/TA22/TB4), OTAR key management (TA32/TA52/TA71/TA82/TA92) and the DF_TETRA file structure with required EFs (ITSI, SPN, forbidden networks, SCK/CCK/GCK addresses). Operates via UICC/APDU interface — can replace the original card in any TETRA terminal.
NXP JCOP4 J3R150 — 150 KB EEPROM, JavaCard 3.0.5, GlobalPlatform 2.3
Remote TETRA radio control panel via PEI
Web control panel for a Motorola TETRA radio driven by AT commands over the PEI (RS232) interface. The Flask backend exposes a REST API, SSE event stream and full-duplex audio over WebRTC (aiortc) — so any browser can operate the radio like a physical control head: group and individual calls, SDS, talkgroup switching, scanning, GPS, network status. Designed for vehicle mounting (e.g. BMW R1250RT) with the radio in the case and the panel on a phone.

TETRA radio (Motorola MTM/MTP)
|
RS232 / PEI (AT, 9600 bps)
|
v
/dev/ttyS2
|
pei_mux (multiplexer: PTY symlinks, AT serialization, URC broadcast)
| |
v v
svxlink tetra_remote_head (Flask + flask-sock + aiortc)
REST :443 SSE :443 WebRTC (audio)
|
ALSA: radio_capture / radio_playback
|
Browser (PWA, control head)Target deployment: BMW R1250RT motorcycle — radio in the case, phone on the handlebar as the panel.