Posiadanie własnego SvxReflektora stało się ostatnio dosyć popularne wśród użytkowników sieci FM i wiele ostatnio było zapytań o to jak to zrobić, a nawet kilkukrotnie pomagałem taki reflector w wersji podstawowej uruchomić nie tylko w europie. Zdałem sobie sprawę że moje zasoby czasowe są ograniczone i aby ułatwić chętnym zabawę w budowanie własnej sieci, napisze coś co nie aspiruje ale może być przez kogoś traktowane jako poradnik "Jak uruchomić własny SVXreflector"
Na wstępie trzeba wspomnieć że svxreflector jest integralną częścią programu svxlink i można go uruchomić na wszystkim co było w stanie uruchomić svxlink, RaspberryPi, OrangePi i InnePi, klasyczny PC, terminal czy nawet na wynajętym VPS. Jest duże prawdopodobieństwo że jeśli posiadasz hotspot FM to masz już możliwość uruchomienia svxreflector ponieważ instaluje się on automatycznie z svxlink, aczkolwiek czasami kasowany jest plik konfiguracyjny przez twórców obrazu.
Opisywany proces można podzielić na trzy części, Instalacja svxlink, konfiguracja svxlink, instalacja dashboard.
Podobny opis instalacji jest zawarty na stronie https://g4nab.co.uk/svxreflector-installation/ , aczkolwiek jest on "skrojony" na instalację SvxPortal jako dashboard.
Instalacja
Jako przykład posłuży mi RaspberryPi 4 ( Debian 12 , 64bit ) i to z tego urządzenia będą pochodzić zdjęcia. Aby przejść do procesu instalacji zdalnej konieczne jest połączenie SSH z naszym urządzeniem lub jeśli robicie bezpośrednio na urządzeniu to należy uruchomić terminal. ( Nie będę opisywał tego kroku ponieważ jeśli to komuś sprawia problem to powinien poważnie się zastanowić czy chce brnąć dalej - naprawdę bez urazy )
W terminalu najpierw wydajemy komendy aktualizacji systemu
sudo apt update
sudo apt upgrade -y
Następnie instalujemy niezbędne "zależności" programy niezbędne do prawidłowej kompilacji svxlink.
sudo apt install -y build-essential git alsa-utils mc
sudo apt install -y libasound2-dev g++ gcc make cmake groff gzip doxygen tar tcl
sudo apt install -y libspeex-dev libspeexdsp-dev libopus-dev libvorbis-dev
sudo apt install -y libpopt-dev libsigc++-2.0-dev python3-dev python3-pip
sudo apt install -y libgcrypt20-dev libgsm1-dev swh-plugins tap-plugins ladspa-sdk
sudo apt install -y librtlsdr-dev libjsoncpp-dev nodejs node-ws dos2unix
sudo apt install -y bc tcl-dev libgpiod2 libgpiod-dev gpiod gawk lynx curl rtl-sdr
sudo apt install -y libcurl4-openssl-dev curl libjson-perl libwww-perl net-tools sqlite3
sudo apt install -y sox libsox-dev curl python3 python3-dev python3-numpy python3-pip python3-suds
sudo apt install -y libssl-dev
Jeśli chcemy na tym urządzeniu zainstalować także dashboard to musimy przygotować dla niego środowisko pracy
sudo apt install -y apache2 php libapache2-mod-php php-mbstring php-cgi php-common php-curl php-sqlite3 apache2-utils
Kolejnym krokiem jest utworzenie użytkownika svxlink
ponieważ jest on wymagany do instalacji. W późniejszym etapie możecie sobie sami zmienić ustawienia, lecz na etapie instalacji taki użytkownik powinien być istniejący.
W przypadku RaspberryPi komenda jest taka:
sudo /usr/sbin/useradd -c "svxlink user" -G audio,dialout,daemon,plugdev,gpio -d /home/svxlink -m -s /sbin/nologin svxlink
Natomiast urządzenia typu PC lub inne nie posiadają złacza GPIO dlatego komenda dla nich jest zmniejszona o ta wartość
sudo /usr/sbin/useradd -c "svxlink user" -G audio,dialout,daemon,plugdev -d /home/svxlink -m -s /sbin/nologin svxlink
Można powiedzieć że jeśli wszystkie wymienione kroki zakończyły się sukcesem i nie wystąpiły jakieś problemy z ich instalacją to możemy przejść do instalacji samego svxlink.
Oto spis komend prowadzących nas przez proces pobrania, kompilacji i instalacji svxlink / svxreflector
sudo -s
cd /opt
mkdir src
cd src
git clone http://github.com/sm0svx/svxlink.git
mkdir svxlink/src/build
cd svxlink/src/build
cmake -DUSE_QT=OFF -DCMAKE_INSTALL_PREFIX=/usr -DSYSCONF_INSTALL_DIR=/etc -DLOCAL_STATE_DIR=/var -DCMAKE_BUILD_TYPE=Release ..
make
make install
/usr/sbin/ldconfig
Praktycznie proces instalacji został zakończony i pliki konfiguracyjny naszego reflektora jest dostępny pod /etc/svxlink/svxreflector.conf
, jest tam także pełnoprawny svxlink którego możemy sobie użyć do budowania połączeń mostowych pomiędzy naszym i innym svxreflector.
Konfiguracja
Tak wyglada plik konfiguracyjny svxreflector.conf po instalacji.
###################################################################
#
# Configuration file for the SvxReflector SvxLink conference node
#
###################################################################
[GLOBAL]
#CFG_DIR=svxreflector.d
TIMESTAMP_FORMAT="%c"
LISTEN_PORT=5300
#SQL_TIMEOUT=600
#SQL_TIMEOUT_BLOCKTIME=60
#CODECS=OPUS
TG_FOR_V1_CLIENTS=999
#RANDOM_QSY_RANGE=12399:100
#HTTP_SRV_PORT=8080
COMMAND_PTY=/dev/shm/reflector_ctrl
#ACCEPT_CALLSIGN="[A-Z0-9][A-Z]{0,2}\\d[A-Z0-9]{1,3}[A-Z](?:-[A-Z0-9]{1,3})?"
#REJECT_CALLSIGN=""
#CERT_PKI_DIR=pki/
#CERT_CA_KEYS_DIR=private/
#CERT_CA_PENDING_CSRS_DIR=pending_csrs/
#CERT_CA_CSRS_DIR=csrs/
#CERT_CA_CERTS_DIR=certs/
CERT_CA_HOOK=/usr/share/svxlink/ca-hook.py
[ROOT_CA]
#KEYFILE=svxreflector_root_ca.key
#CRTFILE=svxreflector_root_ca.crt
#COMMON_NAME=SvxReflector Root CA
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[ISSUING_CA]
#KEYFILE=svxreflector_issuing_ca.key
#CSRFILE=svxreflector_issuing_ca.csr
#CRTFILE=svxreflector_issuing_ca.crt
#COMMON_NAME=SvxReflector Issuing CA
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[SERVER_CERT]
#KEYFILE=svxreflector.key
#CSRFILE=svxreflector.csr
#CRTFILE=svxreflector.crt
#COMMON_NAME=svxreflector.example.org
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#SUBJECT_ALT_NAME=DNS:public-hostname.example.org,IP:172.17.1.42
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[USERS]
#SM0ABC-1=MyNodes
#SM0ABC-2=MyNodes
#SM3XYZ=SM3XYZ
[PASSWORDS]
#MyNodes="Change this key now!"
#SM3XYZ="A strong password"
#[TG#9999]
#AUTO_QSY_AFTER=300
#ALLOW=S[A-M]\\\\d.*|LA8PV
#SHOW_ACTIVITY=0
Przedstawię opis w kolejności jak on występuje w pliku z uwzględnieniem tego co uważam za konieczne na początku do uruchomienia
[GLOBAL]
#CFG_DIR=svxreflector.d
TIMESTAMP_FORMAT="%c"
LISTEN_PORT=5300
#SQL_TIMEOUT=600
#SQL_TIMEOUT_BLOCKTIME=60
#CODECS=OPUS
TG_FOR_V1_CLIENTS=999
#RANDOM_QSY_RANGE=12399:100
#HTTP_SRV_PORT=8080
COMMAND_PTY=/dev/shm/reflector_ctrl
#ACCEPT_CALLSIGN="[A-Z0-9][A-Z]{0,2}\\d[A-Z0-9]{1,3}[A-Z](?:-[A-Z0-9]{1,3})?"
#REJECT_CALLSIGN=""
#CERT_PKI_DIR=pki/
#CERT_CA_KEYS_DIR=private/
#CERT_CA_PENDING_CSRS_DIR=pending_csrs/
#CERT_CA_CSRS_DIR=csrs/
#CERT_CA_CERTS_DIR=certs/
CERT_CA_HOOK=/usr/share/svxlink/ca-hook.py
W tej części będzie nas interesowało kilka funkcji wpływających bezpośrednio na to jak będzie pracował na serwer a bardzie jak będzie widoczny.
LISTEN_PORT=5300
Odpowiada za port na jakim będzie pracował reflektor i za pośrednictwem którego będą łączyć się klienci.
#CODECS=OPUS
Warto aktywować ta funkcję poprzez usunięcie #. Jest to niejako narzucenie klientom jakiego kodeka audio mają używać podczas komunikacji z reflektorem
#HTTP_SRV_PORT=8080
Ta funkcja odpowiada na publikację danych które możecie znać pod nazwą API lub status. Jest to zbiór informacji udostępnianych przez klientów za pośrednictwem pliku node_info.json a które to pozwalają na realizację interaktywnych map, czy elementów dashboard przykładowo kto teraz nadaje lub "kafelkowy" spis stacji z informacjami jakie to one grupy TG monitor. Aby ją aktywować kasujemy #
Praktycznie wszystko co dotyczy certyfikatów możemy sobie pominąć na obecnym etapie ponieważ naszym celem jest uruchomienie svxreflector z protokołem V2 a instalka i konfig są przygotowane do pracy z protokołem V3 opartym o certyfikaty.
[ROOT_CA]
#KEYFILE=svxreflector_root_ca.key
#CRTFILE=svxreflector_root_ca.crt
#COMMON_NAME=SvxReflector Root CA
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[ISSUING_CA]
#KEYFILE=svxreflector_issuing_ca.key
#CSRFILE=svxreflector_issuing_ca.csr
#CRTFILE=svxreflector_issuing_ca.crt
#COMMON_NAME=SvxReflector Issuing CA
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[SERVER_CERT]
#KEYFILE=svxreflector.key
#CSRFILE=svxreflector.csr
#CRTFILE=svxreflector.crt
#COMMON_NAME=svxreflector.example.org
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#SUBJECT_ALT_NAME=DNS:public-hostname.example.org,IP:172.17.1.42
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
Tak więc tej części nie omawiamy i idziemy dalej.
[USERS]
#SM0ABC-1=MyNodes
#SM0ABC-2=MyNodes
#SM3XYZ=SM3XYZ
W tej części mamy spis dopuszczonych ZNAKÓW do połączenia z naszym reflektorem i przypisanymi do znaku pęku kluczy. Musimy tu dopisać znak i nazwę pęku kluczy.
M0IQF=M0IQF
M0IQF-N1=M0IQF
M0IQF-N2=M0IQF
Przykładowo mamy dopisany 3 znaki M0IQF, M0IQF-N1, M0IQF-N2 i pękiem kluczy do tych trzech znaków jest M0IQF. Uwaga M0IQF nie jest hasłem, jest to grupa haseł a raczej hasłem przypisanym do grupy. Nazwa =M0IQF może być dowolna przykładowo "Moje" lub cokolwiek innego co pozwoli na identyfikację.
[PASSWORDS]
#MyNodes="Change this key now!"
#SM3XYZ="A strong password"
Oryginalny wpis nie zawiera wpisu M0IQF dlatego musimy go dopisać
[PASSWORDS]
M0IQF="SilneHaslo
Moje="SilniejszeHaslo"
Reasumując mamy stację M0IQF, M0IQF-N1 M0IQF-N2 z przypisaną grupą hasła M0IQF z ta grupa ma hasło SilneHasło - w skrócie M0IQF-N1 ma hasło SilneHasło. Podobno takie rozwiązanie pozwala grupować znaki do grup haseł i potem łatwiejsze ich zmiana dla całej dupy znaków, dla mnie to upierdliwość i wolałbym rozwiązanie ZNAK = HASŁO , ale jest jak jest.
Czyli przykładowy plik konfiguracyjny naszego SvxReflector pracujacego na porcie przykładowo 5390 z dostępem dla stacji M0IQF, HF4ALL i MB7ITN, przy założeniu że M0IQF i HF4ALL mają mieć to samo hasło będzie wyglądał tak :
###################################################################
#
# Configuration file for the SvxReflector SvxLink conference node
#
###################################################################
[GLOBAL]
#CFG_DIR=svxreflector.d
TIMESTAMP_FORMAT="%c"
LISTEN_PORT=5390
#SQL_TIMEOUT=600
#SQL_TIMEOUT_BLOCKTIME=60
CODECS=OPUS
TG_FOR_V1_CLIENTS=999
#RANDOM_QSY_RANGE=12399:100
HTTP_SRV_PORT=8091
COMMAND_PTY=/dev/shm/reflector_ctrl
#ACCEPT_CALLSIGN="[A-Z0-9][A-Z]{0,2}\\d[A-Z0-9]{1,3}[A-Z](?:-[A-Z0-9]{1,3})?"
#REJECT_CALLSIGN=""
#CERT_PKI_DIR=pki/
#CERT_CA_KEYS_DIR=private/
#CERT_CA_PENDING_CSRS_DIR=pending_csrs/
#CERT_CA_CSRS_DIR=csrs/
#CERT_CA_CERTS_DIR=certs/
CERT_CA_HOOK=/usr/share/svxlink/ca-hook.py
[ROOT_CA]
#KEYFILE=svxreflector_root_ca.key
#CRTFILE=svxreflector_root_ca.crt
COMMON_NAME=SvxReflector Root CA
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[ISSUING_CA]
#KEYFILE=svxreflector_issuing_ca.key
#CSRFILE=svxreflector_issuing_ca.csr
#CRTFILE=svxreflector_issuing_ca.crt
COMMON_NAME=SvxReflector Issuing CA
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[SERVER_CERT]
#KEYFILE=svxreflector.key
#CSRFILE=svxreflector.csr
#CRTFILE=svxreflector.crt
COMMON_NAME=svxreflector.example.org
#ORG_UNIT=SvxLink
#ORG=MyOrg
#LOCALITY=MyTown
#STATE=StateOrProvince
#COUNTRY=XX
#SUBJECT_ALT_NAME=DNS:public-hostname.example.org,IP:172.17.1.42
#EMAIL_ADDRESS=Ten adres pocztowy jest chroniony przed spamowaniem. Aby go zobaczyć, konieczne jest włączenie w przeglądarce obsługi JavaScript.
[USERS]
M0IQF=grupa1
HF4ALL=grupa1
MB7ITN=grupa2
[PASSWORDS]
grupa1=mojehaslo1
grupa2=mojehaslo2
#[TG#9999]
#AUTO_QSY_AFTER=300
#ALLOW=S[A-M]\\\\d.*|LA8PV
#SHOW_ACTIVITY=0
Tak przygotowany svxreflector uruchamiamy komendą svxreflector i możemy obserwować połączenia przychodzące.
Połączenie przychodzące od stacji M0IQF ale odrzucone z powodu błędnego hasła
192.168.1.245:49786: Client connected
*** WARNING: Unknown user "M0IQF"
*** ERROR[192.168.1.245:49786]: Authentication failed for user 'M0IQF'
192.168.1.245:49786: Client disconnected: Connection closed by remote peer
Połączenie przychodzące od stacji M0IQF z prawidłowym hasłem.
192.168.1.245:32810: Client connected
M0IQF: Received valid auth key
M0IQF: Login OK from 192.168.1.245:32810 with protocol version 2.0
M0IQF: Monitor TG#: [ 23511 26004 31019 ]
Ponadto będziecie widzieli kto i na jakiej TG pracuje
M0IQF: Select TG #23511
M0IQF: Talker start on TG #23511
M0IQF: Talker stop on TG #23511
M0IQF: Talker start on TG #23511
M0IQF: Talker stop on TG #23511
Wszystkie te dane mogą się zawierać w pliku log, i aby się tak stało można utworzyć plik nano /lib/systemd/system/svxreflector.service
i wkleić do niego poniższa zawartość
[Unit]
Description=SvxLink repeater control software
[Service]
ExecStart=/usr/bin/svxreflector --logfile=/var/log/svxreflector.log
Restart=on-failure
TimeoutStartSec=60
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
Pozwoli to na sterowanie praca naszego reflektora komendami
systemctl start svxreflector
systemctl stop svxreflector
systemctl restart svxreflector
Można to też zrobić tak jak opisane jest na stronie https://g4nab.co.uk/svxreflector-installation/
Dashboard
Tematyka dashboard jest problematyczna ponieważ jest w przestrzeni kilka ich wersji ale niewiele jest publicznych do pobrania.
Z pewnością można użyć oryginalnego SVXportal którego możecie zobaczyć tutaj https://svxportal.sm2ampr.net/ który potrafi być trochę problematyczny w instalacji dla poczatkujących. Link do github https://github.com/sa2blv/SVXportal
Jak wpiszecie w google "svxreflector dashboard" to będziecie w obrazkach mieć wiele możliwych wariacji różnych dashboard.
Kiedyś już poczyniłem opis jak powstawał mój Svxreflector Dashboard , i wspomnieć mogę tylko tyle ze niegdyś był dostępny tylko taki do pobrania publicznie
i jest to dashboard którego można było pobrać z https://github.com/SkyAndy i nazywał się svxrdb. Chyba już go nie ma
Fajną wersję tego dashboard zrobili koledzy z MiniLink Polska i może warto tam zapukać z pytaniami o niego.
Potem zabrałem się za modernizację https://github.com/SkyAndy/svxrdb-server który nadal jest do pobrania.
Podobno koledzy z Niemiec własny dashboard bazowali na tym bazowym, ale jakoś mi tu bliżej do tego co mieli wcześniej i było podobne do FM Poland - aczkolwiek nie mam pojęcia kto miał co od kogo.
Ponieważ chciałem mieć coś więcej, a sieć w której zaczynałem FM POLAND, miała fajny dashboard ale niestety nie był i chyba nadal nie jest publiczny, ale był dla mnie inspiracją
do zbudowania sobie tego i kilku jego wersji, poprzez inżynierię wsteczną dashbord dla klienta svxlink napisanego przez Waldka SP2ONG.
Finalnie ja zakończyłem na takim i zaprzestałem dalszej zabawy z dashboard gdyż to nie jest celem samym w sobie. Chciałem zbudować coś co nie było dostępne publicznie i na swój ułomny sposób mi się to udało, i tyle mi wystarczy.
Wydaje mi się że jeśli chodzi o dashboard to pozostaje albo pobrać z github cos co zostało opublikowane i sobie go dostosować, albo zapytać się posiadacza jakiegoś alternatywnego dashboard czy go Wam nie udostępni. Czasami ludzie tak jak Ja cos zrobią ale jest to na tyle nie doskonałe lub zawiera błędy że nie chcą tego upubliczniać , ale czasami jest tak że nie publikuje się własnego Dashboard tylko po to aby nie dawać narzędzi
Linki do pobrania jakie znam:
https://github.com/sa2blv/SVXportal
https://github.com/SkyAndy/svxrdb-server
https://github.com/CN8VX/Dashboard_SvxReflector_by_CN8VX
Przykładowe Linki do dashboard
https://d4a.uk/hublink/other/svxrdb/
https://d4a.uk/hublink/other/svxrdb-server/
https://d4a.uk/hublink/other/cn8vx/