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?

[edit | edit source]
  • 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)

[edit | edit source]
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

[edit | edit source]
💡 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

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]
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"

[edit | edit source]
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

[edit | edit source]
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

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

Keep it up — forever

[edit | edit source]

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)

[edit | edit source]

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

[edit | edit source]

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

[edit | edit source]
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

[edit | edit source]
  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

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