Running radio sites over the internet from one panel

A self-hosted EchoLink alternative built from Raspberry Pi gateways, a low-latency media relay and a Laravel panel.

Running radio sites over the internet from one panel
Industry
Telecommunications
Type
Özel Yazılım
Duration
2 months
Client
Radio network operator
Download as PDF
Industry
Telecommunications
Duration
2 months
Technologies
Php-LaravelPythonGoMySQLRedisDockerWireGuardRaspberry Pi
4 Independent system planes
20 ms Opus audio frame
T01–T16 Defined acceptance tests

The problem: scattered sites, invisible faults

The usual way to link analog radio sites is to rely on a third-party internet linking service — leaving connection policies, monitoring data and device management outside the operator's control.

The hard part is in the field, not in software: RF interference, internet outages, wrong audio levels or a stuck PTT are not fixed by a new app. The goal was to make these problems measurable and diagnosable remotely.

  • Add a new site without writing code
  • Split repeaters into independent talk groups, or join them under control
  • See dropouts, silent audio, clipping and stuck PTT remotely
  • Version, roll out and roll back configuration safely
Mimari

Four planes, clear responsibilities

Audio never passes through the web app, its queues or its database. Even if the panel goes down, established talks continue until their grants expire.

  1. Field At every site
    • Radio Handheld or mobile, analog FM
    • Audio / PTT interface Level matching, isolation, PTT driver
    • Raspberry Pi gateway Go agent: audio, Opus, COS/VOX, state machine
  2. Media plane Server
    • Media relay Go; one talker per group
    • Sessions & grants Verified identity, time-limited grants
  3. Control plane Server
    • Control panel Organizations, inventory, groups
    • Live view Real-time status and talk history
    • Versioned config Saved and applied tracked separately
  4. Extensions Separate nodes
    • DMR bridge Link to a network talkgroup
    • Voice assistant Node that answers by callsign
    • APRS iGate Receive only
Orange-edged boxes are the critical parts of the real-time audio path.
A small computer at every site, strict rules
Field gateway

A small computer at every site, strict rules

Each site has a Raspberry Pi, a full-duplex USB sound card and a radio interface. The Go agent on the Pi captures audio, encodes it with Opus, detects an open receiver from the COS signal or audio level, and drives PTT.

The agent runs an explicit state machine: PTT is held off in hardware at boot, and a restarted application never resumes a previous transmission. If the link to the server is lost, the safe shutdown happens locally; an independent watchdog also limits continuous transmit time.

Connections are opened from the site outwards, so no port forwarding is needed at the site.

Konuşma akışı

How one transmission travels between sites

Only one source can talk in a group at a time. The first valid request wins; talks are never queued and played out later.

  1. 1 · Receive Site A
    • User talks Radio A, analog FM
    • Receiver opens COS or audio detection; a short pre-buffer keeps the first syllable
  2. 2 · Floor Relay
    • Request evaluated First valid request wins
    • Others get busy No queue; the user tries again
  3. 3 · Distribution Relay
    • Authorized targets only Gateways in the group
    • Stale packets dropped Session and sequence checks
  4. 4 · Transmit Site B
    • Is the channel clear? No transmit while receiving locally
    • PTT and audio PTT released at the end
Ses profili

Audio transport tuned for speech

Audio transport tuned for speech
ParameterStarting valueWhy
Codec Opus, mono Tunable compression and loss tolerance for speech
Encoder input 16 kHz, 16-bit Resampled with filtering if the card runs at another rate
Bitrate 20 kbit/s (16–24) Quality vs. bandwidth compared by measurement
Frame size 20 ms (≈50 packets/s) Balance between latency and efficiency
Jitter buffer 40–80 ms Upper bound and late-packet drop policy
Packet loss concealment On Softens the effect of lost frames
DTX Off in the first release Keeps silence, loss and end of talk distinguishable

Starting values; tuned per site by measurement.

Saha donanımı

Hardware per site

Hardware per site
PartRoleSelection criteria
Core
Raspberry Pi Runs the agent Small model for the prototype; Ethernet and measured load decide in the field
USB sound card Audio capture and playback Stable on Linux over long runs, separate in/out
Analog FM radio Transmit and receive External mic, speaker and PTT access
Interface
RX/TX matching board Levels and isolation Attenuation, DC blocking
PTT driver Keys the radio Isolates the Pi from the radio's electrical interface
COS input Is the receiver open? If the radio exposes it; otherwise audio-based detection
Field release
Independent watchdog Cuts transmit on a hang Runs independently of the application
Power, enclosure, ferrites Uptime and interference Pi and radio power budgeted separately

Reliability is part of the design

A fault in the field must never leave a radio stuck on air, and an outage at the server must not drop talks.

Güvenli açılış

PTT açılışta donanımsal olarak kapalı; yeniden başlayan uygulama önceki yayını sürdürmez.

Bağımsız watchdog

Uygulama kilitlenirse ya da yayın süresi aşılırsa telsizi yayından çeker.

Cihaz kimliği

Her geçidin kendi anahtarı vardır; cihazın beyanına değil doğrulanmış kimliğe güvenilir.

Sürümlü ayarlar

Panelde kaydedilen ile sahada uygulanan ayar ayrı izlenir; hatalı ayar geri alınır.

Panelden bağımsız ses

Ses yolu ayrı servistedir; panel ya da arka plan işleri durduğunda konuşmalar sürer.

Geri besleme koruması

Her RF alanında tek yayın geçidi; aynı frekansı duyan noktalar sesi geri döndüremez.

New capabilities without touching the core
Extension nodes

New capabilities without touching the core

New capabilities are not built into the core; they are added as separate nodes that use the same talk-group contract.

The DMR bridge links a network talkgroup to the platform. The voice assistant node answers time, weather and propagation questions in amateur radio style when called by callsign. The APRS iGate node is receive-only and forwards position packets to the internet.

Each extension was designed through its own architecture decision record and runs as its own service.

Lessons from the field

The field test surfaced details the lab simulation could not. A talk session that stayed open long after the radio fell silent was traced with a field recording: a small DC offset at the sound card input made silence look like audio and kept VOX open. The agent now filters DC on the capture path; on the same recording VOX closes in 1.8 seconds.

Busy repeater traffic also reshaped the alarm logic: back-to-back short transmissions could falsely trigger the "stuck transmitter" alarm. The alarm now uses the PTT time measured by the agent and only fires after more than 70 seconds of continuous transmit.

Timeline

  1. October 2026

    Scope and architecture decisions

    Project specification, acceptance tests (T01–T16) and the first architecture decision records.

  2. October 2026

    Panel, relay and field agent

    Control panel, Go media relay and Pi agent; end-to-end lab simulation with two virtual gateways.

  3. October 2026

    Live view and hardware guide

    Real-time status and talk history; a step-by-step hardware wiring guide inside the panel.

  4. October 2026

    Extension nodes

    DMR bridge, voice assistant and APRS iGate nodes.

  5. October 2026

    Field test

    Tried with real radios in two separate analog FM cells. Field recordings directly shaped the agent's audio and alarm settings.

Technology

Technologies

Backend

Php-Laravel Python Go

Database

MySQL Redis

DevOps

Docker WireGuard

Other

Raspberry Pi

Planning a system that runs in the field?

We design the hardware, real-time software and control panel together.

Have a similar project?

Share your needs and we will design and deliver a tailored solution.

Contact Us