📡

TetraSpot — TETRA hotspot

TETRA stack — base station (TETRA hotspot) with microservice architecture

Pre-alpha

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.

Features

Full BS radio stack: PHY → LMAC → UMAC → LLC → MLE → MM/CMCE/SNDCP
π/4-DQPSK modulation/demodulation (USRP, LimeSDR, sxceiver)
SYNC/SYSINFO broadcast — network visible as a valid TETRA network
Terminal registration (MM Location Update)
Group voice calls with ACELP codec
Individual P2P calls (half-duplex and full-duplex)
Floor control for half-duplex calls
SDS messages — send, receive, store & forward
GPS/LIP location — terminal position tracking
TEA authentication (TEA1/TEA2/TEA3) with whitelist
OTAR key distribution (Over-The-Air Rekeying) — SCK/CCK/GCK
Dynamic group assignment (DGNA)
Integration with TetraPack via the TetraPoland hub
SIP/PABX telephony gateway
Web management panel (dashboard, call logs, configuration)
Raspberry Pi 5 deployment with systemd services

In development

Multi-site supportSNDCP (packet data transmission)LLC retransmissionMS mode (mobile terminal)

Architecture

  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.

📻

TLA — Tetra Light Analyzer

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.

TLA — screenshot

Features

Monitoring

  • Real-time monitoring of 64 TETRA channels
  • GSSI/ISSI identifier display
  • Call type recognition (group, individual, PSTN)
  • Encryption detection (none / TEA1-3)
  • Color-coded channel activity grid

Audio

  • Live call playback (ACELP codec)
  • Automatic call recording to MP3
  • Channel selection and muting
  • Download and manage recordings

Spectrum & signal

  • FFT spectrum with waterfall visualization
  • DQPSK constellation diagram
  • Signal/noise/SNR monitoring
  • Quality metrics: MER, burst errors, carrier number
  • AFC tracking (automatic frequency correction)

Data

  • SDS message decoding
  • Terminal location tracking via LIP protocol
  • Call registry with full session history
  • Network statistics (call count, active terminals)

Network

  • MCC/MNC identification with operator name
  • Known networks database with quick tuning
  • Neighbor frequency detection
  • Auto-tune to NETINFO frequencies
  • Auto PPM correction from AFC value

System

  • Responsive web UI (desktop and mobile)
  • Bilingual UI (Polish / English)
  • Light / dark theme
  • HTTPS with SSL certificate
  • Optional password protection

Architecture

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
                                                    |
                                                Browser
📱

TetraPoland (Android)

Software TETRA terminal — PTT-over-Cellular

Beta

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).

Features

Group PTT calls (RX/TX) with floor control
Individual calls (half/full-duplex)
SDS messages — send and receive
Talkgroup scanning with hold/priority
ACELP codec (ETSI ref C, NDK)
Oboe audio (8 kHz mono, jitter buffer, AGC, NR)
Foreground service — runs in background
Hardware PTT and Bluetooth SCO headset
Contact list and call history (Room)
HTTP Digest auth + TLS

Stack

JVM 17Jetpack Compose + Material 3Hilt (KSP)RoomOkHttp (WebSocket)NDK / CMakeOboeminSdk 21 / targetSdk 35
🎯

ATAK TETRA Plugin

ATAK integration with TETRA radio

Beta

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.

Features

SDS — short text messages (SDS-1 / SDS-2)
LIP — automatic position reporting on CoT map
Status messages — predefined and custom
PTT — transmit button from the tactical map
Group and individual calls
Team positions visible on the ATAK map
Floating PTT overlay on map (draggable)
RX / TX, signal and radio battery indicators
Talkgroup switching from radio keypad (+MCTGS)
Connection: USB/Serial, Bluetooth SPP or TCP gateway
🔐

TSIM — TETRA SIM Applet

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.

Features

Full TAA1 — HURDLE + TA11/TA12/TA21/TA22/TB4
OTAR — TA32/TA52 (SCK), TA71 (GCK), TA82 (CCK), TA92 (MGCK)
DF_TETRA with required EFs (EF_ITSI, EF_SPN, EF_FORBIDDEN, etc.)
PIN1 / PIN2 / ADM / PUK management
UICC / APDU interface — compatible with TETRA terminals
Personalization (ITSI, K key, SPN, MCC/MNC, security class)
Security classes SC1 (clear) / SC2 (SCK) / SC3 (CCK)

Target card

NXP JCOP4 J3R150 — 150 KB EEPROM, JavaCard 3.0.5, GlobalPlatform 2.3

Standards

ETSI TS 100 812-2 V2.4.1 — TSIM ApplicationETSI EN 300 812-3 V2.3.1 — IC card TSIMETSI EN 300 392-7 — Security (TAA1, TEA)
🎛

TETRA Remote Head

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 Remote Head — screenshot

Features

Full radio control via AT/PEI
WebRTC full-duplex audio (RX/TX) with low latency
PTT from the browser (click, key, touchscreen)
Group and individual calls, SDS
Talkgroup selection and scanning
GPS, RSSI, battery, network status, alarm/TXI
PEI multiplexer (pei_mux) — shared port for svxlink + remotehead
HTTPS + optional authentication
systemd service, autostart

Architecture

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.

tetra-poland.pl — by SP8MB