Skip to content

aethersdr/Aether-gate

 
 

Repository files navigation

Aether-gate

Put any radio into AetherSDR.

Aether-gate is a universal bridge that presents any radio — an Icom or Kenwood transceiver, an RTL-SDR/Airspy dongle, anything you can read — to AetherSDR as if it were a FlexRadio. AE speaks exactly one protocol (FlexRadio's); the gate does the translation, so AE keeps a single, clean ingest boundary and the zoo of radio sources lives outside it.

You pick your radio on a web page, hit Start, and it appears in AetherSDR's radio chooser with a live panadapter and waterfall.

An IC-9700 in AetherSDR, showing only its real 2m/440/23cm bands
An Icom IC-9700 bridged into AetherSDR — offered exactly the bands it can tune.

Status: working, but very young. Proven end-to-end on real hardware — an Icom IC-9700 (LAN, 2m/70cm/23cm) and a Kenwood TS-450S (CAT + SDR dongle for spectrum) both run live in AetherSDR with waterfall and control, and a Raspberry Pi runs both at once as a boot-time appliance. That said, this is early software: expect a few growing pains — rough edges, radios not yet covered, and things that need broader testing than one bench can give. Bug reports, fixes, and new radio adapters are all very welcome. Licensed GPL-3.0-or-later.


What it does

  • Presents a radio to AetherSDR as a Flex 6000. AE discovers it on the LAN and connects exactly as it would to a real FlexRadio — panadapter, waterfall, slices, frequency/mode control.
  • Two ways to get spectrum, chosen per radio:
    • radios with their own spectrum scope (e.g. Icom LAN rigs) stream it directly;
    • radios without one (most CAT transceivers) get their waterfall from a cheap SDR dongle tapped off-air, steered to follow the rig's dial.
  • Declares its real bands. A gateway rig that must impersonate a FLEX-6700 would otherwise be offered a full HF band menu it can't tune. Aether-gate tells AE the radio's true band set (via the bands= discovery key), so an IC-9700 shows only 2m/440/23cm. (Needs an AetherSDR build with radio-declared-band support.)
  • Runs headless as a service — on a Raspberry Pi it's a flash-and-go appliance; each radio is its own systemd service, always ready in AE's chooser.

⚠️ Receive & control only — no transmit yet. Aether-gate does frequency/mode control and spectrum/waterfall/audio receive. It does not key the radio. If you press TX/MOX/TUNE in AetherSDR, AE's UI will light up as if transmitting, but no RF is produced — the gate acknowledges the transmit command and reports "transmitting" back to AE, but never asserts PTT on the rig. This applies to every radio family below (Icom LAN, hamlib/CAT, dongles). PTT wiring + arm/tx-band safety is the next planned feature; until then treat the gate as a receiver + controller. See How it works for the detail.

Supported radios

All entries below are receive + control. The Status column is about how well the RX/control path works; none of these transmit yet (see the note above).

Family How Spectrum Status
Icom LAN (IC-9700, RS-BA1-style) native LAN / CI-V radio's own scope ✅ proven (IC-9700)
Icom IC-7300 USB USB CI-V + USB Audio CODEC radio's own scope ✅ proven RX/control only
Kenwood / Yaesu / Elecraft / Icom-USB (CAT) hamlib (rigctld) SDR dongle, CAT-steered ✅ proven (Kenwood TS-450S); other hamlib rigs = same path
SoapySDR dongles (RTL-SDR, Airspy, SDRplay) SoapySDR the dongle itself
sim built-in test patterns synthetic ✅ (no hardware — for trying it out)

See RADIO_SUPPORT.md for the two-axis (control + spectrum) model and how to add a radio.

Aether-gate radios in AetherSDR's chooser
Bridged radios appear in AetherSDR's chooser by name, alongside real FlexRadios.


Quick start

Try it with no hardware

python -m aether_gate --adapter sim --ae <your-AE-ip>

A synthetic radio appears in AetherSDR's chooser. (Same host as AE? add --port 5992 so it doesn't clash with AE's own :4992.)

The Setup page — pick a real radio in your browser

Just run it with no arguments:

python -m aether_gate            # opens the Setup UI + your browser
python -m aether_gate --setup    # same, explicit
python -m aether_gate --setup --no-browser   # headless: just prints the URL

This opens the Radio Setup & launcher at http://localhost:8730/ — pick your radio family (Icom / Kenwood / dongle / sim), fill in its connection fields, and hit Start. Save it as a profile with "connect on launch" and it comes up on its own next time.

Aether-gate Setup & launcher web page
The Setup page (:8730) — choose a radio, fill its fields, Start.

The Radio type dropdown picks the adapter family — Icom (LAN), Kenwood (CAT), an SDR dongle, or the built-in sim:

The Radio type / adapter dropdown
Pick the adapter family from the Radio type dropdown.

The Setup page links to a Known Info / status page (/known) — a turn-it-on health check: is your advertise IP reachable, are the dependencies present, which dongles/serial ports are found, and can each saved profile's radio actually be reached.

The Diagnostics page — what the gate sees from the radio

Every running gate serves a live diagnostics page on its control port (--ctl-port, default 8731): open

http://<gate-ip>:<ctl-port>/radio

for a 1-Hz view of the radio as the gate sees it — link/auth state, VFO frequency + mode, scope frame rate, S-meter, tune counters. There's also raw JSON at /diagnostics if you want to script against it.

Aether-gate radio diagnostics page
The diagnostics page (/radio on the gate's ctl-port) — the radio as the gate sees it.

Command line (the power path)

Anything the Setup page can launch, you can also run directly from the command line:

# Icom IC-9700 over its LAN interface
python -m aether_gate --adapter icom9700 \
    --radio-ip 10.0.0.7 --user <net-user> --pass <net-pass> \
    --ae <AE-ip> --ctl-port 8732

# Icom IC-7300 over USB CI-V + USB audio, RX/control only
python -m aether_gate --adapter icom7300 \
    --usb-civ-port /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_IC-7300_03031092-if00-port0 \
    --usb-civ-baud 115200 \
    --ae <AE-ip> --ctl-port 8731

# Kenwood TS-450S: hamlib CAT + an RTL-SDR-Blog V4 dongle for the waterfall
python -m aether_gate --adapter kenwood --kw-model TS-450S \
    --rig-serial-port /dev/ttyUSB0 --rig-baud 4800 \
    --soapy-driver rtlsdr --gain 40 \
    --ae <AE-ip> --ctl-port 8734

python -m aether_gate --help lists every option.


Run it on a Raspberry Pi (the appliance)

A Pi is the natural home: it runs unattended, survives reboots, and can serve several radios at once. See PI_APPLIANCE.md for the flash-and-go install (deploy/install-pi.sh) and deploy/systemd/ for the service units (each radio a boot-enabled service; systemctl stop shuts it down cleanly).

Until AetherSDR gains multi-radio connections, AE connects to one gate at a time — so several radios can sit in the chooser and you pick one like changing rigs on the desk. When AE grows multi-radio, the same Pi already serves them all.


How it works

Aether-gate reuses flex-sim's proven FlexRadio-emulation core (discovery + FlexLib control + VITA-49 streaming) and adds a per-radio adapter in front of it. Each source normalises to one Flex stream before AE, so AE only ever implements one ingest path.

  your radio ──►  RadioAdapter  ──►  Flex-protocol engine  ──VITA-49 / FlexLib──►  AetherSDR
   (Icom LAN,      (per family)       (from flex-sim)
    CAT+dongle,
    SoapySDR)

Writing an adapter is small: subclass aether_gate.adapters.base.RadioAdapter, set provides, implement one source method, and register it. See adapters/sim.py for the reference and DESIGN.md / RADIO_SUPPORT.md for the architecture.

Why there's no transmit. When AE keys TX it sends a transmit set mox=1 command. The engine's handler records the state and echoes an interlock/MOX status back to AE (so AE's UI shows "transmitting"), but there is no adapter-TX seam — it never calls down to the radio to assert PTT. The hamlib backend has a working set_ptt (T 1/0) and the Icom LAN path could send CI-V 1C 00, but nothing invokes them from the transmit handler yet. So keying is cosmetic end-to-end and no RF leaves the rig. Wiring this up (PTT seam + a default-off arm flag + TX-band limiting + a TX-audio route) is the next planned milestone; it's kept deliberately unwired until that safety scaffolding exists, because a real transceiver on a real antenna/amp is high blast radius.

aether_gate/
  core/       Flex-protocol engine (from flex-sim) + FFT
  adapters/   RadioAdapter contract + per-radio adapters (icom9700, kenwood, soapy, sim)
  setup.py    the Setup/launcher web UI (:8730)
  tests/      offline tests
deploy/       Raspberry Pi installer + systemd service units

Test

python -m aether_gate.tests.test_smoke
python -m aether_gate.tests.test_hamlib

Credits

Aether-gate stands on other people's work:

  • The Icom IC-9700 LAN support would not exist without Justin, W5JWP. The gate's entire Icom RS-BA1 / CI-V-over-LAN transport — the discovery, login/token handshake, the ping/keepalive cadence, the CI-V framing, and the band-scope decoding — is derived from his GPL-3.0 project w5jwp/SDR9700. That project reverse-engineered and documented the protocol the hard way; this gate is only possible because he did that work and released it openly. Attribution and license headers are preserved on every derived file. Thank you, Justin. 🙏
  • The Icom IC-7300 USB adapter was contributed by s53zo. The receive-safe IC-7300 bridge — USB CI-V control, the radio's native 27h band-scope decode, and USB Audio CODEC RX capture — came in as an external contribution, hardware-verified on the author's own IC-7300. TX/PTT is deliberately left disabled. Thank you! 🙏
  • The FlexRadio-emulation core (discovery, FlexLib control, VITA-49 streaming) comes from flex-sim.
  • CAT control is Hamlib; dongle spectrum is SoapySDR.

License

GPL-3.0-or-later. Because the Icom transport is derived from the GPL-3.0 w5jwp/SDR9700, the whole of Aether-gate is GPL-3.0-or-later; the derived files carry SDR9700's copyright and license headers.

About

AetherSDR for any radio

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages

  • Python 98.4%
  • Shell 1.6%