Jump to content

Hamradio/chan svx sat

From MediaWiki For Hamradio Analog/Digital and Debian v13 software/Raspberry PI v3/4/5 howto

A hand-held, step-by-step guide to bridging an AllStarLink 3 node straight to a SVXReflector with chan_svx_sat — install it, get it connected, and get the audio right. No prior SvxLink knowledge needed. Copy-paste friendly.

💡 In one sentence: chan_svx_sat is an Asterisk channel driver that lets your AllStar node talk Opus directly to a SVXReflector — so you drop the old chan_usrp → svxlink hop and the extra vocoder tandem that came with it.
Before: app_rpt via USRP and svxlink to the reflector. After: app_rpt straight to the reflector over one Opus stream.
One Opus hop instead of two transcodes. Less latency, cleaner audio.

Do I even need this?

  • You run an AllStarLink 3 node (on a Raspberry Pi or x86) and you want it on a SVXReflector talkgroup.
  • Today you probably bridge it with chan_usrp → svxlink. That works, but it transcodes the audio twice and adds a box to babysit.
  • chan_svx_sat replaces that whole hop with one driver. The audio path becomes just PCM ↔ Opus, once.

If you are not going to a SvxReflector — e.g. you only link AllStar-to-AllStar, or you use DMR/YSF — you don't need this. See Hamradio for those.

Words you'll see (plain-language glossary)

Term What it means here
AllStarLink 3 (ASL3) The VoIP linking system built on Asterisk. Your node runs asl3-asterisk.
app_rpt The Asterisk application that is your repeater/node controller (COS, PTT, IDs, links).
SVXReflector A server that joins many SvxLink-style clients on shared talkgroups. Your node logs in to it.
Talkgroup (TG) A "channel" on the reflector. You transmit on one TG and hear whoever else is on it.
Opus The audio codec on the wire between your node and the reflector. One transcode, 8 kHz, 20 ms frames.
Trunk One TCP connection (login) to the reflector. Several nodes can share one trunk — see below.
Section A [block] in svx_sat.conf. One section = one node = one TG.

What you need before you start

💡 Tick all four. If one is missing, fix it first — the bridge can't work without them.
  1. A working AllStarLink 3 node. Check: asterisk -V shows Asterisk 22.x+asl3-....
  2. A 64-bit OS. Debian 12 (bookworm) or 13 (trixie), on x86-64 or arm64 (Pi 3/4/5). Check: dpkg --print-architecture and . /etc/os-release; echo $VERSION_CODENAME. (The Pi Zero 2 W is intentionally not supported — heat + Wi-Fi.)
  3. A reflector login of your own — a dedicated login + auth-key, not shared with svxlink or another node. Sharing one gets the other kicked off. SvxReflector logins are upper-case callsigns.
  4. The reflector is reachable. Check: nc -vz REFLECTOR_HOST 5300.

The worked example below is a real node: AllStar node 1999 bridging to a reflector at 172.16.1.1:5300, talkgroup 24016. Swap in your own host / login / TG everywhere you see them.

How it all fits together

Two small config files on the node, and one matching SECRET line on the reflector. That is the entire wiring:

rpt.conf points at a section in svx_sat.conf, which logs in to the reflector whose SECRET must match.
rpt.conf → a section in svx_sat.conf → a login the reflector recognises.

Step 1 — Install the package

Pick the .deb that matches your OS and architecture:

OS / arch Package
trixie x86-64 asl3-chan-svx-sat_<ver>~trixie_amd64.deb
trixie arm64 (Pi) asl3-chan-svx-sat_<ver>~trixie_arm64.deb
bookworm x86-64 asl3-chan-svx-sat_<ver>~bookworm_amd64.deb
bookworm arm64 (Pi) asl3-chan-svx-sat_<ver>~bookworm_arm64.deb
sudo apt install ./asl3-chan-svx-sat_<ver>~<os>_<arch>.deb

Dependencies (asl3-asterisk, libopus0, libssl3) resolve automatically. The package installs the module, a sample config, this kind of documentation under /usr/share/doc/asl3-chan-svx-sat/, and adds a commented load line to modules.conf for you to enable in Step 4. Nothing loads or connects yet.

Step 2 — Create the reflector config

Copy the sample and open it for editing:

sudo cp /etc/asterisk/svx_sat.conf.sample /etc/asterisk/svx_sat.conf
sudo chown asterisk:asterisk /etc/asterisk/svx_sat.conf
sudo chmod 640 /etc/asterisk/svx_sat.conf      # it holds your reflector password
sudoedit /etc/asterisk/svx_sat.conf

Make it look like this (name the section after the node — tidy and unambiguous):

[1999]
host     = 172.16.1.1       ; reflector hostname or IP
port     = 5300             ; reflector port (default 5300)
login    = SA7AUX-AC        ; your OWN login, UPPER-CASE, not shared
password = CHANGE_ME        ; your reflector auth-key
callsign = SA7AUX           ; name shown to the reflector
tg       = 24016            ; talkgroup to select (TX + primary RX)
💡 The login + password must match the reflector. On the reflector's [SATELLITE] section there must be a line SECRET_SA7AUX-AC=CHANGE_ME (case-sensitive). If you run the reflector too: add/change the SECRET_ line and restart the reflector — it only reads secrets at startup.

The callsign is shown as the node's name if it is free on the reflector right now; on a collision (or if left empty) it falls back to ASL-<section> (e.g. ASL-1999), re-checked automatically as names free up.

Step 3 — Point the node at it

In /etc/asterisk/rpt.conf, in your node's stanza, comment out the old rxchannel — never delete it — and add the SVX line:

[1999](node-main)
; rxchannel = USRP/127.0.0.1:4001:4002   ; old bridge, kept so you can revert
rxchannel = SVXSAT/1999                  ; chan_svx_sat -> section [1999]
💡 Want it to survive package upgrades? Put the node stanza in /etc/asterisk/custom/rpt.conf instead — ASL3 includes that file and never overwrites it. Use the direct edit above for a quick change; use custom/ if you want your config to survive asl3-asterisk updates cleanly.

Step 4 — Enable the module

ASL3 has autoload = no, so the module must be listed by hand. The package added a commented line — turn it on. It must live inside the [modules] section (a load line after a later section is silently ignored):

sudo sed -i 's/^; *load = chan_svx_sat.so/load = chan_svx_sat.so/' /etc/asterisk/modules.conf
grep -n '^load = chan_svx_sat.so' /etc/asterisk/modules.conf     # confirm it's active

Step 5 — Apply and verify

An rxchannel change needs app_rpt to re-init, so restart Asterisk, then check:

sudo asterisk -rx "core restart now"
sudo asterisk -rx "svxsat show"

A healthy bridge looks like this — CONNECTED means you're done with the basic hookup:

Annotated svxsat show output explaining CONNECTED, txframes, rxframes, starts/stops, fec and plc.

Key up on the node → txframes climbs and the reflector opens the talker on your TG. When someone else talks on the TG → rxframes climbs. Done. The rest of this page is tuning and extras.

Getting the audio right

This is where most people get stuck, so take it slow. Only the yellow stages have knobs — everything grey is automatic.

The TX and RX audio chains showing which stages are tunable (gain, AGC, jitter, tx_hold) and which are automatic (limiter, Opus FEC/PLC).

All of these live in the node's section in svx_sat.conf. After changing any of them, run sudo asterisk -rx "core restart now".

The four audio knobs

Setting Default What it does
tx_gain 0 Preamp on TX (node → reflector), in dB. Raise if others say you're quiet; lower if they say you clip.
rx_gain 0 Preamp on RX (reflector → node), in dB. Raise if the reflector audio is too quiet on your repeater.
tx_agc / rx_agc no Automatic gain control. Turn on to even out loud/quiet stations. yes or no.
bitrate 16000 Opus bitrate in bit/s. Leave it unless you have a reason.
💡 A limiter is always on in both directions — it stops the audio clipping even if you raise the gain too far. Opus inband FEC + PLC are always on too: a lost packet is rebuilt from the next one's FEC, and an underrun is concealed instead of clicking. You don't configure any of that.

"My audio is X → do Y"

Symptom Fix
Others say you're too quiet Raise tx_gain a few dB at a time (e.g. 3, then 6).
Others say you clip / distort Lower tx_gain a notch. The limiter guards the peak, but clean input is better.
Reflector audio too quiet on your repeater Raise rx_gain a few dB.
Loud and quiet stations are wildly uneven Turn on rx_agc = yes (and/or tx_agc = yes).
Choppy / chopped audio going out See the tx_hold fix below.
Crackle/dropouts coming in on a poor link Raise jitter (see below). FEC/PLC already help; this adds headroom.

Two more knobs: tx_hold and jitter

Setting Default What it does
tx_hold 250 TalkerStop hold time, in ms. A brief unkey/rekey mid-over (COS flicker, link hangtime) would otherwise close and reopen the reflector talker and chop the audio. The hold keeps it open across the gap. 0 = stop immediately on unkey.
jitter 40 Jitter-buffer prefill, in ms. Higher = smoother on a poor/long link, but more latency. 0 = minimal (fine on a clean LAN). Max 500.

If audio going out is chopped: run svxsat show and watch starts/stops. One each per over is healthy. Many per over means your key is flapping — raise tx_hold (try 400).

Optional: listen to extra talkgroups

monitor = 24020, 9990     ; extra TGs you HEAR (RX only); TX still goes to 'tg'

Keep it up — forever

Two independent things stay up: the reflector link and the AllStar node-to-node link.

  • The reflector link is automatic. chan_svx_sat reconnects on its own (TCP + UDP heartbeats, backoff after any drop). Nothing to configure; svxsat show goes back to CONNECTED within seconds of any outage.
  • Keep the AllStar node linked to a hub? Use app_rpt's permanent connect, which re-establishes itself:
sudo asterisk -rx "rpt cmd 1999 ilink 13 403870"   # 13 = permanent, transceive

Link automatically at boot via the node stanza:

[1999](node-main)
rxchannel = SVXSAT/1999
startup_macro = *3403870     ; auto-connect to 403870 (transceive) on startup

Belt-and-suspenders cron (ilink 3 is idempotent — a no-op if already linked):

# keep node 1999 linked to 403870 every 2 minutes
*/2 * * * * /usr/sbin/asterisk -rx "rpt cmd 1999 ilink 3 403870" >/dev/null 2>&1

Bonus: change talkgroup from the radio (DTMF)

You can move the node to another TG live — over RF with DTMF, gated by a PIN — then drop back. Handy for pushing a bulletin/net out on a different TG, then reverting.

DTMF dial pattern star-855 plus PIN plus action digit, with a table of actions and the control flow.

Dial pattern: *855 + PIN + action. Put the commands in rpt.conf under [functions] (PIN is the control code — a wrong PIN simply does nothing). Default PIN is 0000 — change it before use:

; /etc/asterisk/rpt.conf  —  base 855, PIN 0000 (CHANGE IT!)
[functions]
85500001 = cmd,asterisk -rx "svxsat settg 403872 3149060"   ; *855 0000 1 -> bulletin TG
85500002 = cmd,asterisk -rx "svxsat settg 403872 3149070"   ; *855 0000 2 -> another TG
85500000 = cmd,asterisk -rx "svxsat revert 403872"          ; *855 0000 0 -> default TG
85500009 = cmd,asterisk -rx "svxsat down   403872"          ; *855 0000 9 -> link down
85500008 = cmd,asterisk -rx "svxsat up     403872"          ; *855 0000 8 -> link up

Set the default TG and an auto-revert timeout in svx_sat.conf:

[403872]
tg         = 3149050     ; the DEFAULT TG (revert/up target)
tg_timeout = 30          ; minutes on another TG before auto-revert (0 = off)

A temporary TG always drops back to default on a reboot, a reconnect, or after tg_timeout — so a forgotten switch never strands the node.

Several nodes on one login

Give several sections the same login + password (and a tg each) and they multiplex onto one reflector trunk — one handshake, one heartbeat — while each still appears as its own node with its own callsign and TG. Sections with different logins open separate trunks.

[403872]
host = reflector.example.org
login = SA7AUX-N      ; SAME login  -> shared trunk
password = CHANGE_ME  ; SAME secret
callsign = SA7AUX-1
tg = 24016

[403873]
host = reflector.example.org
login = SA7AUX-N      ; SAME login  -> same connection
password = CHANGE_ME
callsign = SA7AUX-2
tg = 24021            ; different TG per node

Troubleshooting

Symptom Check
svxsat show empty / "No such command" / node has no rxchannel Is load = chan_svx_sat.so enabled inside [modules]? Did you core restart now?
down instead of CONNECTED Host/port reachable? login/password correct? Watch: sudo tail -f /var/log/asterisk/messages.log | grep -i svx
auth rejected: Invalid callsign Login must be a valid upper-case callsign, and the account must exist on the reflector.
auth rejected: Access denied Wrong password, or the login isn't registered on the reflector (SECRET_ missing / reflector not restarted).
txframes climbs but nobody hears you Is the listening client actually selecting/monitoring the same TG?
Choppy audio out, starts climbing many-per-over Key/unkey flapping → raise tx_hold (e.g. 400).
txbadsize climbing app_rpt is feeding non-slin frames — check the node's audio path.
Loads but refuses ("compile-time options") The package must match the installed asl3-asterisk version — install the deb for your exact OS.

Reverting

  1. Restore the old rxchannel (uncomment it) and comment rxchannel = SVXSAT/....
  2. Comment load = chan_svx_sat.so in modules.conf.
  3. sudo asterisk -rx "core restart now".

Remove entirely: sudo apt remove asl3-chan-svx-sat (add --purge to also drop the sample config and the modules.conf line).

See also

  • Hamradio — all the digital-voice and gateway how-tos.
  • Author / bug reports: SA7AUX <bjorne@sa7aux.se>. GNU GPL v2.