Skip to content

TCI Server

Jeremy Fielder edited this page Apr 4, 2026 · 1 revision

TCI Server

AetherSDR includes a built-in TCI (Transceiver Control Interface) server. TCI is an open protocol that carries CAT control, RX/TX audio, IQ data, CW keying, and spot injection over a single WebSocket connection — replacing the need to configure separate rigctld, DAX audio pipes, and virtual serial ports.

AetherSDR is the first FlexRadio client with built-in TCI support.

What is TCI?

TCI was created by Expert Electronics for their ExpertSDR3 software and has become a de facto standard for SDR integration. It uses a WebSocket connection (text frames for commands, binary frames for audio/IQ) so any application on your machine or LAN can connect with zero audio routing configuration.

TCI vs traditional setup:

Task Traditional TCI
CAT control rigctld TCP or virtual serial port Single WebSocket
RX audio DAX PulseAudio pipes Same WebSocket
TX audio DAX TX pipe Same WebSocket
IQ data DAX IQ pipes Same WebSocket
Spots Separate DX cluster connection Same WebSocket
CW keying Serial DTR/RTS or rigctld Same WebSocket

Enable

Quick Start

  1. Settings menu → Autostart TCI with AetherSDR — starts the server on every radio connect
  2. Or manually: open the DIGI applet → TCI Server section → click Enable

Configuration

Setting Default Location
Port 50001 DIGI applet → Port field
Autostart Off Settings menu

The DIGI applet shows the server status and connected client count.

Connect from a TCI client

Point your TCI-capable application to:

ws://localhost:50001

Or from another machine on your LAN:

ws://192.168.1.x:50001

Supported Applications

WSJT-X Improved (Recommended)

WSJT-X Improved v3.0+ supports TCI for rig control.

Setup:

  1. In WSJT-X, go to File → Settings → Radio
  2. Set Rig to Expert Electronics (TCI)
  3. Set Network Server to localhost:50001
  4. Click Test CAT — should show green

WSJT-X uses TCI for CAT control (frequency, mode, PTT) and system audio devices for RX/TX audio. You can use DAX or PulseAudio routing for the audio side.

MSHV

MSHV supports TCI for both CAT control and audio.

Setup:

  1. Go to Settings → Interface
  2. Select TCI as the interface type
  3. Enter localhost and port 50001
  4. Enable audio streaming if desired

Log4OM v2

Log4OM v2 has full TCI support including CAT, audio, IQ, and spot display.

Setup:

  1. Go to Settings → Radio
  2. Select TCI as the radio connection type
  3. Enter localhost:50001

JTDX

JTDX has TCI support but is no longer maintained and may crash with some TCI servers. We recommend WSJT-X Improved instead.

Other TCI Clients

Any software that implements the TCI protocol can connect:

  • HamDeck — Stream Deck automation via TCI
  • TCI-Hamlib Adapter (DL3NEY) — bridges TCI to Hamlib for apps that only support rigctld
  • eesdr-tci — Python TCI client library for scripting

Testing with wscat

You can test the TCI server interactively using wscat:

# Install
npm install -g wscat

# Connect
wscat -c ws://localhost:50001

You'll see the init burst with full radio state. Try these commands:

# Get current frequency
vfo:0;

# Get current mode
modulation:0;

# Tune to 14.074 MHz (FT8)
vfo:0,0,14074000;

# Switch to DIGU
modulation:0,digu;

# Get drive level
drive;

# Set drive to 25 watts
drive:25;

# Key PTT
trx:0,true;

# Unkey PTT
trx:0,false;

# Start audio streaming
audio_start:0;

# Stop audio streaming
audio_stop:0;

Protocol Coverage

AetherSDR implements the full TCI v2.0 protocol specification (72 command handlers):

Category Commands
VFO/Mode vfo, modulation, rx_filter_band, dds, if, vfo_limits, if_limits, vfo_lock
TX trx, tx_enable, tune, drive, tune_drive, tx_frequency
RIT/XIT rit_enable/offset, xit_enable/offset, split_enable
Audio volume, mute, rx_volume, rx_mute, rx_balance, mon_enable, mon_volume
AGC/SQL agc_mode, agc_gain, sql_enable, sql_level, lock
DSP rx_nb_enable/param, rx_nr_enable, rx_anf_enable, rx_apf_enable, rx_bin_enable, rx_anc_enable, rx_dse_enable, rx_nf_enable
CW cw_macros_speed, cw_keyer_speed, cw_macros_delay, cw_msg, cw_macros, cw_macros_stop, cw_terminal, keyer
Audio Streaming audio_start/stop, audio_samplerate, audio_stream_sample_type, audio_stream_channels, audio_stream_samples
IQ iq_start/stop, iq_samplerate
Spots spot, spot_delete, spot_clear, clicked_on_spot
Sensors rx_sensors_enable, tx_sensors_enable, rx_channel_sensors, tx_sensors
Digital digl_offset, digu_offset

Audio Streaming

TCI audio streaming sends RX audio and accepts TX audio over the same WebSocket connection as binary frames.

Sample Rate

The native radio sample rate is 24 kHz. TCI clients can request a different rate:

audio_samplerate:48000;

Supported rates: 8000, 12000, 24000 (native), 48000 Hz. Resampling is handled by AetherSDR's r8brain polyphase resampler — per client, so each connected application can use its preferred rate.

Format

Default is float32 stereo. Clients can negotiate:

audio_stream_sample_type:0;   # int16
audio_stream_channels:1;      # mono

Start/Stop

Audio doesn't flow until the client requests it:

audio_start:0;    # start RX audio for receiver 0
audio_stop:0;     # stop

Sensor Telemetry

TCI clients can subscribe to meter data:

rx_sensors_enable:true;    # receive S-meter updates
tx_sensors_enable:true;    # receive TX power/SWR/mic during transmit

RX sensors broadcast per-slice S-meter readings in dBm at 200ms intervals:

rx_channel_sensors:0,0,-97.3;

TX sensors broadcast during transmit:

tx_sensors:0,-27.2,47.4,47.4,1.3;
#         trx, mic_dBm, fwd_W, peak_W, SWR

CW Keying

TCI supports both CW macros (text-based) and straight key (paddle/key input):

# Send CW text
cw_macros:CQ CQ CQ DE KK7GWY;

# Stop CW
cw_macros_stop;

# Set speed
cw_keyer_speed:25;

# Straight key (for remote keying)
keyer:0,true;     # key down
keyer:0,false;    # key up

Troubleshooting

Port conflict: If port 50001 is in use, change it in the DIGI applet Port field.

No audio: Make sure the client sends audio_start:0; after connecting. Audio doesn't flow by default.

JTDX crashes: This is a known JTDX bug (unmaintained Qt5 code). Use WSJT-X Improved instead.

Firewall: If connecting from another machine, ensure port 50001 (TCP) is open.

Clone this wiki locally