RaspberryPi dosyć fajnie radzi sobie w świecie radiowym a jego spektrum zastosowania czasem aż mnie zadziwia.
Można zastanawiać się dlaczego taki mały klocek ma być czymś co będzie podstawą do wielu projektów z radiem w tle.
Z przedstawionego opisu można wybrać interesujące elementy i zbudować sobie system samemu, niezależnie czy chcemy zrobić serwer czy bramkę czy tylko pobawić się emisjami cyfrowymi na HF.
Opis będzie powstawał powoli i etapami i z pewnością proszę go nie traktować jako wykładni że tak ma być. To tylko jeden z kierunków.
Przygotowanie wsadu od zera.
Osobiście używam zawsze najnowszej dystrybucji Raspbian choć należy przyznać iż w wielu projektach z tego powodu można napotkać problemy. Bo czegoś nie ma, bo coś się zmieniło i na starszej dystrybucji działa a na nowsze już nie i trzeba czekać aż znajdą się opisy jak to uruchomić na najnowszej. Problemów jest wiele ale w ramach samodoskonalenia postanowiłem iść tą drogą.
I aby była jasność - Raspberry i Linux to nie Windows i wchodząc w ten świat trzeba wyzbyć się mentalności windowsowej że albo system coś za nas załatwi albo program podczas instalacji sam się ogarnie. To wygodnictwo Windowsowe jest przyczyną lenistwa ludzi i braku kreatywnego myślenia i tym samym braku perspektyw na rozwiązywanie problemów jakie Was mogą napotkać.
Ten artykuł ma na celu pokazanie przy okazji jak ja buduje kolejny kombajn wielozadaniowy do zastosowań około radiowych. Niestety nie umieszczę w nim pełnego spektrum wiedzy ponieważ część już robię automatycznie i nie zdaję sobie sprawy iż może to być istotne z punktu człowieka rozpoczynającego zabawę. A co najważniejsze nie jestem informatykiem i mam własny specyficzny język w jakim rozumiem pewne zagadnienia - Tryb Edukacja nadal kuleje.
Wsad pobieram ze strony https://www.raspberrypi.org/software/ i wgrywam na kartę za pomocą programu tam dostępnego o nazwie Raspberry Pi Imager 1.5
Fajny zautomatyzowany proces bez zbędnego pitu-pitu. Wybieramy co chcemy i na co chcemy wgrać i się dzieje.
Teraz teoretycznie można przejść do uruchomienia systemu na RaspberryPi o ile posiadamy RaspberryPi podłączone do monitora oraz podłączona jest klawiatura i mysz.
Ja skupię opis na rozwiązaniu zdalnym ponieważ znaczna większość ludzi tak czyni - czyli raspberry posiada jedynie podłączony internet po kablu i źródło zasilania, a całe programowanie/konfigurowanie czynione jest poprzez SSH lub VNC.
I tu trzeba trochę zmian zanim wyjmiemy kartę z naszego PC.
Otóż od jakiejś wersji systemu Raspbian ze względów bezpieczeństwa SSH jest domyślnie wyłączone co uniemożliwia nam zdalne połączenie na starcie. Aby uaktywnić SSH wystarczy na partycji BOOT utworzyć plik o nazwie SSH
Przy okazji , WINDOWS nie widzi drugiej partycji ROOTFS tak więc nie ma opcji że się pomylicie.
Tworzymy sobie taki plik i temat SSH mamy już z głowy. Wyjmujemy kartę wkładamy do RaspberryPi i uruchamiamy. logujemy się do Raspberry poprzez protokół SSH i wydajemy mu komendę sudo raspi-config
Odszukujemy funkcję Expand Filesystem i uruchamiamy - wydajemy w ten sposób systemowi polecenie użycia całej dostępnej powierzchni karty SD
Odszukujemy także funkcję VNC i nakazujemy się jej uruchomić - VNC to zdalny pulpit.
I tu się zaczynają różnice jeśli chodzi o RaspberryPi2-3 a RaspberryPi4. Otóż w RPI4 samo uruchomienie VNC spowoduje że i owszem VNC pozwoli na połączenie ale nie będzie widoczny pulpit ponieważ system nie rozpoznał na żadnym ze złącz HDMI monitora co skutkuje brakiem rozdzielczości i tymsamym brakiem obrazu.
Aby zaradzić takiej sytuacji i mając na uwadze iż mój raspberry nie będzie nigdy podłaczony do monitora jestem zmuszony wymusić pewne parametry na Raspberrym jeśli chodzi o ustawniania złącza HDMI.
W tym celu należy edytować plik sudo nano /boot/config.txt i na samym dole na jego końcu dopisać
hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=16
hdmi_drive=1
Jak widzicie ja mam jeszcze dopisaną komendę
over_voltage=6
arm_freq=2147
gpu_freq=750
I jest to wykonane na moje ryzyko podkręcenie taktowania procesora ARM do prędkości 2.2GHz. Spowodowane jest to faktem iż mam odpowiednie chłodzenie i mam świadomość ile mnie czeka kompilacji różnych programów.
Trochę więc mocy przybywaj.
Po tych zmianach i restarcie na przykład komendą sudo reboot naszym oczom pojawia się zdalny pulpit o rozdzielczości 1920x1080 naszego RaspberryPi w moim przypadku z predkością CPU 2.2GHz
Możemy teraz zdalnie przejść do procesu personalizacji naszych ustawień, jezyk , układ klawiatury , sieć WiFi itd itd. Tymsamym mamy już gotowy system operacyjny do dalszej pracy.
Aktualizacja : 11.09.2022
Pi Build by KM4ACK to program ułatwiający nam instalację zautomatyzowaną wielu programów krótkofalarskich. Wystarczy wejść na stronę https://github.com/km4ack/pi-build i zapoznać się.
Instalacja ogranicza się do wklepanie w terminal komendy
git clone https://github.com/km4ack/pi-build.git \ $HOME/pi-build && bash $HOME/pi-build/build-a-pi
Dzięki temu naszym oczom ukaże się menu które pozwoli nam wybrać oprogramowanie jakie chcemy zainstalować
Po skończonej instalacji warto zrestartować system i naszym oczom ukazuje sie w menu zakładka HAM Radio z oprogramowaniem zainstalowanym automatycznie dzieki KM4ACK i jego build-a-pi.
Można uznać iż ten fragment mamy za sobą a jedyne czego mi na starcie brakuje to instalacji programu JTDX do emisji FT8 którego wielu woli wzamian za wsjtx.
Instalacje SVXlink przeprowadzam z github co zajmuje trochę czasu ale do tej pory to jedyne źródło poprawnego ModuleFrn oraz wsparcia dla HID CM108.
sudo apt-get install g++ make cmake libsigc++-1.2-dev libgsm1-dev libpopt-dev tcl8.5-dev libgcrypt-dev libspeex-dev libasound2-dev alsa-utils libqt4-dev git-core libjsoncpp-dev tclsh libcurl4-openssl-dev opus-tools libopus-dev libogg-dev rtl-sdr librtlsdr-dev doxygen groff libsigc++-2.0-dev qttools5-dev-tools qttools5-dev
A następnie.
sudo adduser svxlink
git clone https://github.com/sm0svx/svxlink.git
cd svxlink
mkdir build
cd build
cmake ..
make
make doc
make install
ldconfig
Testowo możemy wydać komende svxlink w terminalu i powinniśmy zobaczyć coś takiego
SvxLink v1.7.99.47 Copyright (C) 2003-2020 Tobias Blomberg / SM0SVX
SvxLink comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
welcome to redistribute it in accordance with the terms and conditions in the
GNU GPL (General Public License) version 2 or later.
Using configuration file: /usr/local/etc/svxlink/svxlink.conf
--- Using sample rate 48000Hz
Starting logic: SimplexLogic
Loading RX: Rx1
*** ERROR: Open capture audio device failed: No such file or directory
*** ERROR: Could not open audio device for receiver "Rx1"
*** ERROR: Could not initialize RX "Rx1"
*** ERROR: Could not initialize Logic object "SimplexLogic". Skipping...
*** ERROR: No logics available. Bailing out...
Możemy teraz pobrać pliki dźwiękowe
cd /usr/local/share/svxlink/sounds/
wget https://github.com/sm0svx/svxlink-sounds-en_US-heather/releases/download/19.09.99.1/svxlink-sounds-en_US-heather-16k-19.09.99.1.tar.bz2
sudo tar xvjf svxlink-sounds-en_US-heather-16k-19.09.99.1.tar.bz2
sudo ln -s en_US-heather-16k en_US
Możemy przejść do konfiguracji sudo nano /usr/local/etc/svxlink/svxlink.conf
( konfiguracja będzie opisana szczegółowiej trochę później )
Opis instalacji HBLink3 chciałem wykonać przekierowanie do strony http://sp2ong.noip.pl/pl/blog/stworz-swoj-wlasny-serwer-dmr niestety okazuje się to już niemożliwe ponieważ opisane repozytorium zostało zamknięte lub jest ograniczony dostęp - nie wiem.
Dlatego niniejszy opis wykonam na innym źródle HBLink lecz odsyłam na w/w stronę bo to kopalnia wiedzy jak ktoś chce się w to bawić. ( edycja: 30.06.2021 - Podana strona od jakiegoś czasu nie istnieje )
cd /opt
git clone https://github.com/HBLink-org/hblink3.git
cd hblink3
pip3 install -r requirements.txt
Konieczne jest jeszcze utworzenie pliku z konfiguracją oraz z regułami
cp hblink_SAMPLE.cfg hblink.cfg
cp rules_SAMPLE.py rules.py
Zanim zaczniemy konfigurację serwera warto jeszcze wykonać plik startowy
nano /lib/systemd/system/hblink.service
I wklejamy do niego
[Unit]
Description=HBLink
After=network-online.target syslog.target
Wants=network-online.target
[Service]
StandardOutput=null
WorkingDirectory=/opt/hblink3
RestartSec=3
ExecStart=/usr/bin/python3 /opt/hblink3/bridge.py
Restart=on-abort
[Install]
WantedBy=multi-user.target
Teraz można poprzez komendy systemctl start/stop/restart hblink sterować programem
Można zająć się konfiguracją samego serwera i jego testowym uruchomieniem. W konfiguracji najważniejsze są na poczatku dwa pliki.
hblink.cfg - odpowiedzialny za konfigurację serwera - kto na jakim porcie i haśle ma być połączony
rules.py - zawierający instrukcje co z czym łączyć i na jakich zasadach tzw. reguły
Edytujemy plik hblink.cfg
nano /opt/hblink3/hblink.cfg
[GLOBAL]
PATH: ./
PING_TIME: 5
MAX_MISSED: 3
USE_ACL: True
REG_ACL: PERMIT:ALL
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
[REPORTS]
REPORT: True
REPORT_INTERVAL: 60
REPORT_PORT: 4321
REPORT_CLIENTS: 127.0.0.1
[LOGGER]
LOG_FILE: /tmp/hblink.log
LOG_HANDLERS: console-timed
LOG_LEVEL: DEBUG
LOG_NAME: HBlink
[ALIASES]
TRY_DOWNLOAD: True
PATH: ./
PEER_FILE: peer_ids.json
SUBSCRIBER_FILE: subscriber_ids.json
TGID_FILE: talkgroup_ids.json
PEER_URL: https://www.radioid.net/static/rptrs.json
SUBSCRIBER_URL: https://www.radioid.net/static/users.json
STALE_DAYS: 7
[OBP-1]
MODE: OPENBRIDGE
ENABLED: True
IP:
PORT: 62035
NETWORK_ID: 3129100
PASSPHRASE: password
TARGET_IP: 1.2.3.4
TARGET_PORT: 62035
BOTH_SLOTS: True
USE_ACL: True
SUB_ACL: DENY:1
TGID_ACL: PERMIT:ALL
[MASTER-1]
MODE: MASTER
ENABLED: True
REPEAT: True
MAX_PEERS: 10
EXPORT_AMBE: False
IP:
PORT: 54000
PASSPHRASE: s3cr37w0rd
GROUP_HANGTIME: 5
USE_ACL: True
REG_ACL: DENY:1
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
[REPEATER-1]
MODE: PEER
ENABLED: True
LOOSE: False
EXPORT_AMBE: False
IP:
PORT: 54001
MASTER_IP: 172.16.1.1
MASTER_PORT: 54000
PASSPHRASE: homebrew
CALLSIGN: W1ABC
RADIO_ID: 312000
RX_FREQ: 449000000
TX_FREQ: 444000000
TX_POWER: 25
COLORCODE: 1
SLOTS: 1
LATITUDE: 38.0000
LONGITUDE: -095.0000
HEIGHT: 75
LOCATION: Anywhere, USA
DESCRIPTION: This is a cool repeater
URL: www.w1abc.org
SOFTWARE_ID: 20170620
PACKAGE_ID: MMDVM_HBlink
GROUP_HANGTIME: 5
OPTIONS:
USE_ACL: True
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
Szczegułowe opisy konfiguracji i wyjaśnienie poszczególnych opcji znajdziecie w internecie, ja tylko przedstawię parę z nich w wariancie SERWER TESTOWY w pełni otwarty bez zabezpieczeń DMRiD
[GLOBAL]
PATH: ./
PING_TIME: 10
MAX_MISSED: 5
USE_ACL: False
REG_ACL: PERMIT:ALL
SUB_ACL: PERMIT:ALL
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
[REPORTS]
REPORT: True
REPORT_INTERVAL: 20
REPORT_PORT: 4321
REPORT_CLIENTS: 127.0.0.1
[LOGGER]
LOG_FILE: /var/log/hblink.log
LOG_HANDLERS: file-timed
LOG_LEVEL: DEBUG
LOG_NAME: HBlink
[ALIASES]
TRY_DOWNLOAD: False
PATH: ./
PEER_FILE: peer_ids.json
SUBSCRIBER_FILE: subscriber_ids.json
TGID_FILE: talkgroup_ids.json
PEER_URL: https://www.radioid.net/static/rptrs.json
SUBSCRIBER_URL: https://www.radioid.net/static/users.json
STALE_DAYS: 7
[OBP-1]
MODE: OPENBRIDGE
ENABLED: False
IP:
PORT: 62035
NETWORK_ID: 3129100
PASSPHRASE: password
TARGET_IP: 1.2.3.4
TARGET_PORT: 62035
BOTH_SLOTS: True
USE_ACL: True
SUB_ACL: DENY:1
TGID_ACL: PERMIT:ALL
[MASTER-1]
MODE: MASTER
ENABLED: True
REPEAT: True
MAX_PEERS: 2
EXPORT_AMBE: False
IP:
PORT: 54001
PASSPHRASE: s3cr37w0rd
GROUP_HANGTIME: 5
USE_ACL: False
REG_ACL: PERMIT:ALL
SUB_ACL: PERMIT:ALL
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
Dopisujemy kolejnego MASTER
[MASTER-2]
MODE: MASTER
ENABLED: True
REPEAT: True
MAX_PEERS: 2
EXPORT_AMBE: False
IP:
PORT: 54002
PASSPHRASE: s3cr37w0rd2
GROUP_HANGTIME: 5
USE_ACL: False
REG_ACL: PERMIT:ALL
SUB_ACL: PERMIT:ALL
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
[REPEATER-1]
MODE: PEER
ENABLED: False
LOOSE: False
EXPORT_AMBE: False
IP:
PORT: 54001
MASTER_IP: 172.16.1.1
MASTER_PORT: 54000
PASSPHRASE: homebrew
CALLSIGN: W1ABC
RADIO_ID: 312000
RX_FREQ: 449000000
TX_FREQ: 444000000
TX_POWER: 25
COLORCODE: 1
SLOTS: 1
LATITUDE: 38.0000
LONGITUDE: -095.0000
HEIGHT: 75
LOCATION: Anywhere, USA
DESCRIPTION: This is a cool repeater
URL: www.w1abc.org
SOFTWARE_ID: 20170620
PACKAGE_ID: MMDVM_HBlink
GROUP_HANGTIME: 5
OPTIONS:
USE_ACL: True
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
Dzięki takim zmianom mamy dwa konta MASTER dla dwóch hotspotów, wyłączyliśmy OpenBridge oraz Repeter a także zabroniliśmy pobierać aktualną bazę MARC-DMR ID bo jest ona zbyteczna, utworzylismy plik LOG i kilka innych funkcji.
Tak wstępnie przygotowany serwer pozwala na uruchomienie i testy. Lecz aby można rozmawiać na nim konieczne jest napisanie komend co ma robić gdy
nano /opt/hblink3/rules.py
Interesujący nas fragment wygląda tak:
BRIDGES = {
'WORLDWIDE': [
{'SYSTEM': 'MASTER-1', 'TS': 1, 'TGID': 1, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'ON', 'ON': [2,], 'OFF': [9,10], 'RESET': []},
{'SYSTEM': 'CLIENT-1', 'TS': 1, 'TGID': 3100, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'ON', 'ON': [2,], 'OFF': [9,10], 'RESET': []},
],
'ENGLISH': [
{'SYSTEM': 'MASTER-1', 'TS': 1, 'TGID': 13, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [3,], 'OFF': [8,10], 'RESET': []},
{'SYSTEM': 'CLIENT-2', 'TS': 1, 'TGID': 13, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [3,], 'OFF': [8,10], 'RESET': []},
],
'STATEWIDE': [
{'SYSTEM': 'MASTER-1', 'TS': 2, 'TGID': 3129, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [4,], 'OFF': [7,10], 'RESET': []},
{'SYSTEM': 'CLIENT-2', 'TS': 2, 'TGID': 3129, 'ACTIVE': True, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [4,], 'OFF': [7,10], 'RESET': []},
]
A opis znajdziecie na stronie http://sq9lm.lukaszmisiura.com/hblink-opis-pliku-rules-py/
Musicie zrozumieć zależności występujące bo inaczej wysypie się cały serwer. Mając w pamięci że podczas edycji pliku hblink.cfg mamy taki status:
OBP - openbridge - Enable=False czyli wyłaczony
MASTER-1 Enable=True czyli włączony
MASTER-2 Enable=True czyli włączony
REPEATER-1 Enable=False czyli wyłaczony
To konfiguracji wymagają jedynie elementy włączone czyli MASTER-1 oraz MASTER-2. Przykładowo napiszemy regułe dla 3 grup rozmownych TG 10,20 i 30
Przy założeniu że mamy tylko SIMPLEX hotspot pracujące na TS2 i że chcemy mieć wszystkie grupy nieaktywne po restarcie serwera a aktywacja jakiejś grupy przez użytkownika jest na stałe do momentu gdy on sam nie zdecyduje się na zmianę grupy rozmownej
BRIDGES = {
'TG10': [
{'SYSTEM': 'MASTER-1', 'TS': 2, 'TGID': 10, 'ACTIVE': False, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [10,], 'OFF': [20,30], 'RESET': []},
{'SYSTEM': 'MASTER-2', 'TS': 2, 'TGID': 10, 'ACTIVE': False, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [10,], 'OFF': [20,30], 'RESET': []},
],
'TG20': [
{'SYSTEM': 'MASTER-1', 'TS': 2, 'TGID': 20, 'ACTIVE': False, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [20,], 'OFF': [10,30], 'RESET': []},
{'SYSTEM': 'MASTER-2', 'TS': 2, 'TGID': 20, 'ACTIVE': False, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [20,], 'OFF': [10,30], 'RESET': []},
],
'TG30': [
{'SYSTEM': 'MASTER-1', 'TS': 2, 'TGID': 30, 'ACTIVE': False, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [30,], 'OFF': [10,20], 'RESET': []},
{'SYSTEM': 'MASTER-2', 'TS': 2, 'TGID': 30, 'ACTIVE': False, 'TIMEOUT': 2, 'TO_TYPE': 'NONE', 'ON': [30,], 'OFF': [10,20], 'RESET': []},
]
Aby zobaczyć wizualnie efekty naszych zmagań konieczny jest program HBMonitor którego instalacja w nastepnej części.
Edycja: 30.06.2021
Możliwe jest wzbogacenie naszego HBLink o opcję hotspot proxy umożliwiający wszystkim użytkownikom wejście na serwer poprzez ten samo port i hasło.
Możliwe jest także wzbogacenie o obsługę private call, sms czy nawet obsługę D-APRS.
HBmonitor to interface www ukazujący w graficzny sposób jak działa HBLink.
sudo -s
cd /opt
git clone https://github.com/sp2ong/HBmonitor.git
cd HBmonitor
chmod +x install.sh
./install.sh
cp config_SAMPLE.py config.py
cp utils/hbmon.service /lib/systemd/system/
Teraz możemy już używać komend w celu sterowania programem.
systemctl enable hbmon
systemctl start hbmon
systemctl status hbmon
Możemy przejśc do konfiguracji HBmonitor poprzez edycję pliku config.py
nano config.py
Naszym oczom pojawi się podobna zawartość
REPORT_NAME = 'Dashboard of local DMR network' # Name of the monitored HBlink system
#
CONFIG_INC = True # Include HBlink stats
HOMEBREW_INC = True # Display Homebrew Peers status
LASTHEARD_INC = True # Display lastheard table on main page
BRIDGES_INC = False # Display Bridge status and button
EMPTY_MASTERS = False # Display (True) or not (False) empty master in status
#
HBLINK_IP = '127.0.0.1' # HBlink's IP Address
HBLINK_PORT = 4321 # HBlink's TCP reporting socket
FREQUENCY = 10 # Frequency to push updates to web clients
WEB_SERVER_PORT = 8080 # Has to be above 1024 if you're not running as root
CLIENT_TIMEOUT = 0 # Clients are timed out after this many seconds, 0 to disable
# Put list of NETWORK_ID from OPB links to don't show local traffic in lastheard, for example: "260210,260211,260212"
OPB_FILTER = ""
# Authorization of access to dashboard
WEB_AUTH = False
WEB_USER = 'hblink'
WEB_PASS = 'hblink'
Początkowa konfiguracja może się streścić do zmiany nazwy serwera i portu. Port 8080 to domyślny proxy port i mogą wystąpić komplikacje jesli jakaś usługa w sieci lokalnej pracuje już na tym porcie, w moim przypadku UniFi Controller.
REPORT_NAME = 'NAZWA SERWERA wyświetlana pod Logiem'
WEB_SERVER_PORT = 8090
Po wydaniu komendy uruchomienia HBLink oraz HBmonitor pod adresem http://IP-MALINY:8090 zobaczymy taki obraz
A po podłączeniu hotspot do serwera będzie on widoczny i jego aktywność.
Z instalacji to wszystko, więcej informacji na stronach o tematyce HBLink lub HBmonitor.
FreeDMR to odmiana lub wariant programu HBLink3. (edycja 30.06.2021 - opis powstał na początku 2021roku i może być już nieaktualny. Proszę śledzić zmiany na stronach developer'ów )
Zanim przejdziemy do instalacji proszę abyście zapoznali się z tym projektem na stronach
https://github.com/hacknix/FreeDMR
https://github.com/hacknix/FreeDMR/wiki
Instalacja
sudo -s
cd /opt
wget https://github.com/hacknix/FreeDMR/archive/v1.0.tar.gz
tar zxvf v1.0.tar.gz
mv FreeDMR-1.0 FreeDMR
cd FreeDMR
sh ./install.sh
Kolejnym krokiem jest konfiguracja bazy danych MySQL i przyznam się że to chyba mój pierwszy kontakt z MySQL i przyspożyło mi to wielu problemów. Dlatego zapoznanie się z działaniem MySQL jest ważne aby zrozumieć jak to działa i jak rozwiazywać problemy które nas napotkają. Mam nadzieję iż niedługo kompetentniejsze osoby opiszą instalację lepiej tak aby przy okazji nauczyć innych a nie tylko CTRL+C / CTRL+V.
Dlatego proszę tego opisu nie traktować jako wykładnika - z powodów ograniczonej wiedzy w tym temacie, "rosyjskim" sposobem prób i błedów udało mi sie przebrnąć przez ten etap instalacji.
W moim przypadku wydanie komendy
mysql -u root -p
Dało wynik
root@raspberrypi:/opt/FreeDMR# mysql -u root -p
bash: mysql: command not found
Co oznacza że mój system nie ma zainstalowanej bazy danych MySQL. Dla systemów raspbian odpowiednikiem MySQL jest mariadb-server-10.0 którą musimy zainstalować.
apt update
apt install mariadb-server-10.0
Po tej czynności możeny przejść do Create database (recommended) opisanej instrukcji instalacji https://github.com/hacknix/FreeDMR/wiki/Installation-guide
Opis oworzenia użytkownika zaczerpnięty z https://linuxize.com/post/how-to-create-mysql-user-accounts-and-grant-privileges/
mysql -u root
CREATE USER 'freedmr'@'localhost' IDENTIFIED BY 'passw0rd';
CREATE DATABASE freedmr;
GRANT ALL PRIVILEGES ON freedmr.* TO 'freedmr'@'localhost';
USE freedmr;
Teraz zgodnie z opisem musimy wkleić zawartość pliku repeaters.sql która wygląda tak:
CREATE TABLE `repeaters` (
`CALLSIGN` varchar(8) NOT NULL,
`MODE` varchar(8) NOT NULL,
`ENABLED` tinyint(1) NOT NULL,
`_REPEAT` tinyint(1) NOT NULL,
`MAX_PEERS` int(11) NOT NULL,
`EXPORT_AMBE` tinyint(1) NOT NULL,
`IP` varchar(255) DEFAULT NULL,
`PORT` int(11) NOT NULL,
`PASSPHRASE` varchar(255) NOT NULL,
`GROUP_HANGTIME` int(11) NOT NULL,
`USE_ACL` tinyint(1) NOT NULL,
`REG_ACL` varchar(255) NOT NULL,
`SUB_ACL` varchar(255) NOT NULL,
`TGID_TS1_ACL` varchar(255) NOT NULL,
`TGID_TS2_ACL` varchar(255) NOT NULL,
`DEFAULT_UA_TIMER` int(11) NOT NULL,
`SINGLE_MODE` tinyint(1) NOT NULL,
`VOICE_IDENT` tinyint(1) NOT NULL,
`TS1_STATIC` varchar(255) DEFAULT NULL,
`TS2_STATIC` varchar(255) DEFAULT NULL,
`DEFAULT_REFLECTOR` int(11) NOT NULL,
PRIMARY KEY (`CALLSIGN`),
KEY `PORT` (`PORT`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4`
Tylko coś tu nie pasuje, ponieważ baza nie chce przyjąć tego wpisu. Mi osobiście wychodzi na to że ów wpis będzie działał ale po zamianie ostatniego znaku ' zawartego w nim na ; wszystko działa. Czyli kończy się linijką
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Nie wiem czym to jest spowodowane lecz kiedyś może się dowiem :)
Tak więc wklejamy zmodyfikowaną zawartość pliku repeaters.sql
CREATE TABLE `repeaters` (
`CALLSIGN` varchar(8) NOT NULL,
`MODE` varchar(8) NOT NULL,
`ENABLED` tinyint(1) NOT NULL,
`_REPEAT` tinyint(1) NOT NULL,
`MAX_PEERS` int(11) NOT NULL,
`EXPORT_AMBE` tinyint(1) NOT NULL,
`IP` varchar(255) DEFAULT NULL,
`PORT` int(11) NOT NULL,
`PASSPHRASE` varchar(255) NOT NULL,
`GROUP_HANGTIME` int(11) NOT NULL,
`USE_ACL` tinyint(1) NOT NULL,
`REG_ACL` varchar(255) NOT NULL,
`SUB_ACL` varchar(255) NOT NULL,
`TGID_TS1_ACL` varchar(255) NOT NULL,
`TGID_TS2_ACL` varchar(255) NOT NULL,
`DEFAULT_UA_TIMER` int(11) NOT NULL,
`SINGLE_MODE` tinyint(1) NOT NULL,
`VOICE_IDENT` tinyint(1) NOT NULL,
`TS1_STATIC` varchar(255) DEFAULT NULL,
`TS2_STATIC` varchar(255) DEFAULT NULL,
`DEFAULT_REFLECTOR` int(11) NOT NULL,
PRIMARY KEY (`CALLSIGN`),
KEY `PORT` (`PORT`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
I efektem jest taki komunikat
Query OK, 0 rows affected (0.22 sec)
Kolejny krok narazie sobie odpuszczam, ponieważ ten warian serwera będzie konfigurowany tak aby każdy użytkownik wchodził na serwer poprzez port 62031 z hasłem passw0rd,
dlatego ten wpis jest mi zbyteczny
insert into repeaters VALUES ('<yourcall>','MASTER',1,1,1,0,'',54001,'passw0rd',5,1,'DENY:1','DENY:1','PERMIT:ALL','PERMIT:ALL',10,1,1,'','',0);
I wychodzę z bazy danych komendą
quit
Kolejnymi krokami opisanymi w instrukcji jest utworzenie folderu konfiguracyjnego oraz przekopiowanie do niego pliku konfiguracji i pliku reguł
mkdir config
cp FreeDMR-SAMPLE.cfg config/FreeDMR.cfg
cp rules_SAMPLE.py config/rules.py
Konfiguracja odbywa się poprzez edycję pliku FreeDMR.cfg
nano /opt/FreeDMR/config/FreeDMR.cfg
Plik jest taki jak w przypadku HBLink'a standardowego z paroma dodatkami.
[GLOBAL]
PATH: ./
PING_TIME: 10
MAX_MISSED: 3
USE_ACL: True
REG_ACL: PERMIT:ALL
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
[REPORTS]
REPORT: True
REPORT_INTERVAL: 60
REPORT_PORT: 4321
REPORT_CLIENTS: 127.0.0.1
[LOGGER]
LOG_FILE: /tmp/hblink.log
LOG_HANDLERS: console-timed
LOG_LEVEL: DEBUG
LOG_NAME: HBlink
[ALIASES]
TRY_DOWNLOAD: True
PATH: ./
PEER_FILE: peer_ids.json
SUBSCRIBER_FILE: subscriber_ids.json
TGID_FILE: talkgroup_ids.json
PEER_URL: https://www.radioid.net/static/rptrs.json
SUBSCRIBER_URL: https://www.radioid.net/static/users.json
STALE_DAYS: 7
[MYSQL]
USE_MYSQL: False
USER: hblink
PASS: mypassword
DB: hblink
SERVER: 127.0.0.1
PORT: 3306
[OBP-TEST]
MODE: OPENBRIDGE
ENABLED: False
IP:
PORT: 62044
NETWORK_ID: 1
PASSPHRASE: mypass
TARGET_IP:
TARGET_PORT: 62044
USE_ACL: True
SUB_ACL: DENY:1
TGID_ACL: PERMIT:ALL
[G9XYZ]
MODE: MASTER
ENABLED: False
REPEAT: True
MAX_PEERS: 1
EXPORT_AMBE: False
IP:
PORT: 54001
PASSPHRASE: passw0rd
GROUP_HANGTIME: 5
USE_ACL: True
REG_ACL: DENY:1
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
DEFAULT_UA_TIMER: 10
SINGLE_MODE: True
VOICE_IDENT: True
TS1_STATIC:
TS2_STATIC:
DEFAULT_REFLECTOR: 0
[REPEATER-1]
MODE: PEER
ENABLED: False
LOOSE: False
EXPORT_AMBE: False
IP:
PORT: 54001
MASTER_IP: 172.16.1.1
MASTER_PORT: 54000
PASSPHRASE: homebrew
CALLSIGN: W1ABC
RADIO_ID: 312000
RX_FREQ: 449000000
TX_FREQ: 444000000
TX_POWER: 25
COLORCODE: 1
SLOTS: 1
LATITUDE: 38.0000
LONGITUDE: -095.0000
HEIGHT: 75
LOCATION: Anywhere, USA
DESCRIPTION: This is a cool repeater
URL: www.w1abc.org
SOFTWARE_ID: 20170620
PACKAGE_ID: MMDVM_HBlink
GROUP_HANGTIME: 5
OPTIONS:
USE_ACL: True
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
Pojawił się dodatkowy wpis
[MYSQL]
USE_MYSQL: False
USER: hblink
PASS: mypassword
DB: hblink
SERVER: 127.0.0.1
PORT: 3306
A także trochę więcej opcji przy kontach MASTER
[G9XYZ]
MODE: MASTER
ENABLED: False
REPEAT: True
MAX_PEERS: 1
EXPORT_AMBE: False
IP:
PORT: 54001
PASSPHRASE: passw0rd
GROUP_HANGTIME: 5
USE_ACL: True
REG_ACL: DENY:1
SUB_ACL: DENY:1
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
DEFAULT_UA_TIMER: 10
SINGLE_MODE: True
VOICE_IDENT: True
TS1_STATIC:
TS2_STATIC:
DEFAULT_REFLECTOR: 0
W zakładce MYSQL wpisujemy dane z konta jakie utworzyliśmy w bazie MySQL, jak ktoś nie pamieta to przypomnę
CREATE USER 'freedmr'@'localhost' IDENTIFIED BY 'passw0rd';
Czyli wpis powinien wygladać tak
[MYSQL]
USE_MYSQL: True
USER: freedmr
PASS: passw0rd
DB: freedmr
SERVER: 127.0.0.1
PORT: 3306
Natomiast MASTER powielamy na przykład 3 razy lub 30 razy w zależności kto ile chce hotspotów przyjąc na serwer. Nie zapominany o nadaniu każdemu MASTER innej nazwy i portu
[HOTSPOT-1]
MODE: MASTER
ENABLED: True
REPEAT: True
MAX_PEERS: 1
EXPORT_AMBE: False
IP:
PORT: 54001
PASSPHRASE: passw0rd
GROUP_HANGTIME: 5
USE_ACL: False
REG_ACL: PERMIT:ALL
SUB_ACL: PERMIT:ALL
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
DEFAULT_UA_TIMER: 10
SINGLE_MODE: True
VOICE_IDENT: True
TS1_STATIC:
TS2_STATIC:
DEFAULT_REFLECTOR: 0
[HOTSPOT-2]
MODE: MASTER
ENABLED: True
REPEAT: True
MAX_PEERS: 1
EXPORT_AMBE: False
IP:
PORT: 54002
PASSPHRASE: passw0rd
GROUP_HANGTIME: 5
USE_ACL: False
REG_ACL: PERMIT:ALL
SUB_ACL: PERMIT:ALL
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
DEFAULT_UA_TIMER: 10
SINGLE_MODE: True
VOICE_IDENT: True
TS1_STATIC:
TS2_STATIC:
DEFAULT_REFLECTOR: 0
[HOTSPOT-3]
MODE: MASTER
ENABLED: True
REPEAT: True
MAX_PEERS: 1
EXPORT_AMBE: False
IP:
PORT: 54003
PASSPHRASE: passw0rd
GROUP_HANGTIME: 5
USE_ACL: False
REG_ACL: PERMIT:ALL
SUB_ACL: PERMIT:ALL
TGID_TS1_ACL: PERMIT:ALL
TGID_TS2_ACL: PERMIT:ALL
DEFAULT_UA_TIMER: 10
SINGLE_MODE: True
VOICE_IDENT: True
TS1_STATIC:
TS2_STATIC:
DEFAULT_REFLECTOR: 0
Ponieważ posiadamy juz HBMonitor zainstalowany to można go uruchomić, a sam FreeDMR serwer można testowo uruchomić komendą w terminalu
systemctl restart hbmon
cd /opt/FreeDMR
python3 ./bridge_master.py -c ./config/FreeDMR.cfg -r ./config/rules.py
Naszym oczom na terminalu powinien się ukazać taki komunikat
Teraz przechodzimy do konfiguracji naszego PROXY które będzie odpowiedzialne za przyjmowanie od wszystkich klientów połączenia na porcie 62031 i przekierowywanie ich na porty zapisane w kontach MASTER w naszym przypadku 54001-54003.
Na stronie WIKI jest opis https://github.com/hacknix/FreeDMR/wiki/Hotspot-Proxy
Otwieramy drugie okno terminala i przechodzimy do edycji pliku proxy
sudo -s
cd /opt/FreeDMR
nano hotspot_proxy_v2.py
Odnajdujemy fragment z opisem CONFIG HERE
#*** CONFIG HERE ***
Master = "127.0.0.1"
ListenPort = 62031
DestportStart = 54000
DestPortEnd = 54001
Timeout = 30
Stats = True
Debug = True
BlackList = [1234567]
#*******************
Zmieniamy wartości w rubryce DestPortStar oraz DestPortEnd. W naszym przypadku MASTER jakie mamy już zaprogramowane mają porty 54001 do 54003
#*** CONFIG HERE ***
Master = "127.0.0.1"
ListenPort = 62031
DestportStart = 54000
DestPortEnd = 54003
Timeout = 30
Stats = True
Debug = True
BlackList = [1234567]
#*******************
Możemy zapisać i uruchomić ten plik
python3 hotspot_proxy_v2.py
Niestety w moim przypadku mam komunikat o brakującym elemencie o nazwie resettabletimer , dlatego musimy go zainstalować
pip3 install resettabletimer
Ponawiamy próbe uruchomienia i powinniśmy zaobserwować komunikat
0 ports out of 3 in use (3 free)
W momencie podłączania hotspot PROXY powinien w logach pokazać coś takiego
Program działa i można przejść do napisania skryptu startowego oraz ikon w menu.
Nie jest to może jakiś dobry poradnik lecz starałem się krok po kroku przedstawić proces instalacji jaki ja przechodziłem.
Ponieważ mój RaspberryPi4 ma już podłączenie AUDIO+CAT+PTT do radia HF/VHF a także połączenie AUDIO+PTT do radia VHF/UHF to dla uzupełnienia jego funkcjonalności przyszedł czas na MMDVM i emisje DMR,Dstar
W celu łatwiejszego dostępu do portu GPIO na przyszłośc użyłem adaptera powielającego istniejace GPIO x2
Lecz zanim zaczniemy instalację najpierw przygotowanie maliny do współpracy z MMDVM.
sudo -s
nano /boot/config.txt
I wklejamy na koncu pliku linijkę
dtoverlay=pi3-disable-bt
Następnie restartujemy naszą malinę.
MMDVMHost pobieram z własnej strony https://www.d4a.uk/git/MMDVMHost.zip ale polecam zapoznać sie z instalacją ze źródła opisaną na https://www.f5uii.net/en/installation-calibration-adjustment-tunning-mmdvm-mmdvmhost-raspberry-motorola-gm360/3/
sudo -s
cd /opt
wget https://www.d4a.uk/git/MMDVMHost.zip
unzip MMDVMHost.zip
mkdir /var/log/mmdvmhost
sudo apt-get install git-core libi2c-dev i2c-tools lm-sensors wiringpi
sudo nano /etc/modules
i2c-dev spidev
cd /opt/MMDVMHost/ArduiPi_OLED sudo make
cd /opt/MMDVMHost
make clean
make
nano /opt/MMDVMHost/MMDVM.ini
W pliku zmieniamy na poczatek następujące fragmenty
[General]
Callsign=DEMO
Id=1234567
Timeout=180
Duplex=0
# ModeHang=10
RFModeHang=10
NetModeHang=3
Display=None
Daemon=0
[Info]
RXFrequency=434000000
TXFrequency=434000000
Power=1
# The following lines are only needed if a direct connection to a DMR master is being used
Latitude=0.0
Longitude=0.0
Height=0
Location=RPI4 HOTSPOT
Description=Multi-Mode Repeater
URL=www.google.co.uk
[Log]
# Logging levels, 0=No logging
DisplayLevel=1
FileLevel=0
FilePath=.
FileRoot=MMDVM
FileRotate=1
[Modem]
# Port=/dev/ttyACM0
Port=/dev/ttyAMA0
# Port=\\.\COM4
Protocol=uart
# Address=0x22
[DMR Network]
Enable=1
# Type may be either 'Direct' or 'Gateway'. When Direct you must provide the Master's
# address as well as the Password, and for DMR+, Options also.
Type=Gateway
Address=144.91.99.196
Port=62031
Local=62032
Password=passw0rd
Jitter=360
Slot1=0
Slot2=1
# Options=
# ModeHang=3
Debug=0
Warto także przy wszystkich opcjach gdzie są podane nazwy P25, SystemFusion,FM,D-Star,NXDN,POCSAG przy opcji ENABLE wpisać 0 zamias 1.
Gdy próbujemy uruchomić MMDVMHost na RaspberryPi4 po restarcie zobaczymi że program wykazuje błąd
W celu uruchomienia MMDVM na RaspberryPi4 konieczne jest wciśniecie przycisku restart na płycie nakładki przed uruchomieniem MMDVMHost lub możemy napisać skrypt startowy wzorowany na rozwiązaniu z PiStar.
cd /opt
nano startmmdvm.sh
Wklejamy tam następującą treść
#!/bin/bash
#
##############################################################################
# #
# Pi-Star MMDVM HS_HAT Reset Tool #
# #
# Version 1.0, Code, Design and Development by Andy Taylor (MW0MWZ). #
# #
# Make it simple to reset an MMDVM bosard from the CLI on Pi-Star. #
# #
##############################################################################
#
# Reset process for MMDVM HS_HAT Board (20,-21,21:-20,21)
echo "Restart GPIO"
echo 20 > /sys/class/gpio/export
echo 21 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio20/direction
echo out > /sys/class/gpio/gpio21/direction
sleep 0.5
echo 0 > /sys/class/gpio/gpio20/value
echo 0 > /sys/class/gpio/gpio21/value
echo 1 > /sys/class/gpio/gpio21/value
sleep 1
echo 0 > /sys/class/gpio/gpio20/value
echo 1 > /sys/class/gpio/gpio20/value
sleep 0.5
echo 20 > /sys/class/gpio/unexport
echo 21 > /sys/class/gpio/unexport
echo "Modem reset complete"
sleep 2
echo "Start MMDVMHost"
/opt/MMDVMHost/MMDVMHost /opt/MMDVMHost/MMDVM.ini
chmod +x startmmdvm.sh
I możemy już uruchamiać bez najmniejszych problemów przy użyciu tego skryptu. Komenda do uruchomienia lub ikony to
sudo sh /opt/startmmdvm.sh
sudo apt-get update
sudo apt-get install mumble-server
sudo apt-get install mumble
sudo dpkg-reconfigure mumble-server
Po wydaniu tej komendy wyskoczy okienko z zapytaniem czy serwer Mumble ma uruchamiać się po restarcie systemu.
Kolejne pytanie dotyczy czy serwer ma mieć wysoki PRIORYTET.
Będziemy także zapytani o hasło jakie ma mieć konto SuperUser który ma uprawnienia do konfiguracji nakałów na serwerze.
Dodatkowo możemy edytować plik konfiguracyjny aby precyzyjnie zmienić ustawienia
sudo mcedit /etc/mumble-server.ini
Serwer jest sterowany komendami
systemctl status mumble-server
systemctl restart mumble-server
systemctl start mumble-server
systemctl stop mumble-server
DVSwitch Serwer prędzej nazywany potocznie DVSwitch_tools lub nawet DVSwitch_mobile to narzędzie pozwalające obecnie na wiele zastosowań. Do serwera można połączyć się przy użyciu aplikacji DVSwitch_mobile i prowadzić rozmowy w sieciach cyfrowych. Obecnie to zastosowanie wyparte zostało poprzez aplikacje DROID STAR. DVSwitch mobile pozwala na ustawienie mostów między-systemowych przy użyciu sprzętowego Vocodera lub programowych emulatorów.
Ja osobiście obecnie używam tego narządzia do mostów DMR do ZELLO czy EchoLink, ponieważ DVSwitch wypluwa z siebie strumień analogowego audio USRP co pozwala podłączyć sie do niego na przykład programami USRP Client czy AllStarLink.
Należy tu wspomnieć o ciekawym projekcie DVPi http://www.hamskey.com/2020/07/creating-network-transceiver-using.html
Rozwiązanie wpisująca się w mój koncept "nie chce przedłużki mikrofonu w postaci hotspota i radia"
Wracając do samego DVSwitch to opis instalacji jest umieszczony na stronie https://dvswitch.groups.io/g/main/topic/dvswitch_server_instructions/69407946?p=,,,20,0,0,0::recentpostdate%2Fsticky,,,20,2,60,69407946 ale można go znaleść także na polskich stronach. Można także pobrać gotowy wsad który przygotował kolega SP2ONG i jest dostępny na jego stronie http://sp2ong.noip.pl/pl/blog/programowy-hotspot-multimode-dv-czesc-ii
Edycja: 30.06.2021
Generalnie instalacja to poniższe komendy:
wget http://dvswitch.org/buster
sudo chmod +x buster
sudo ./buster
sudo apt-get update
- gdy chcemy mieć DVSwitch SERWER z dashboardem
sudo apt-get install dvswitch-server
- dla klasycznego DVSwitch
sudo apt-get install dvswitch
Przykładowy wygląd DVSwitch Serwer z dashboard autorstwa Waldka SP2ONG
Wydaje mi się że można spokojnie zainstalować samemu na podstawie w/w stron i nie będę powielał opisów. Sam program znajdzie się w okrojonej wersji na wsadzie.
Mvoice to program pozwalający na pracę w sieci M17 Network przy użyciu karty dźwiękowej w naszym RaspberryPi.
Więcej o samym projekcie można przeczytać na stronach https://m17project.org/ oraz http://sp2ong.noip.pl/pl/tag:M17
Sama instalacja programu opisana jest na stronie https://github.com/n7tae/mvoice
Po uruchmieniu programu należy dokonać konfiguracji poprzez wpisanie własnego ZNAKU oraz wybranie konfiguracji AUDIO
Następnie wybrać interesujący nas serwer z listy dostępnych, wybrać MODULE i kliknąć LINK.
Połączenie będzie potwierdzone na Dashboard serwera i możemy rozpocząć używanie sieci M17
Dla przykładu pokazałem połączenie z moim serwerem lecz polskojęzyczni prędzej znajdą korespondentów na poskim reflectorze https://m17.hblink.network/ prowadzonym przez kolegę SP7LAK.
Z pewnością poręczniejsze jest używanie aplikację na telefony android o nazwie DROID-Star - lecz to opis na RPI dlatego warto było to ty opisać.
To chyba już koniec całej serii Multi_RoIP która ku memu zaskoczeniu przyjeła się jak ciepłe bułeczki i muszę podziękować za wszystkim za pobranie w sumie ponad 1500 razy całej serii i jednocześnie przeprosić za błędy lecz uczymy się wszyscy.
Jako osoba która rozpoczęła zabawę z Raspberrym Pi w 2019 roku sam się uczę a nauka polega na popełnianiu błędów, niemniej staram się podzielić wiedzą z innymi pomimo swojego niskiego poziomu IT.
Jeśli udało mi się kogokolwiek nakłonić do zabawy na RaspberryPi do jest mi bardzo miło i jest to największa nagroda dla mnie.
Opisany w tym artykule powstający wsad na RaspberryPi 4 będzie opublikowany jako Multi-RoIP_v2.0-BETA ponieważ dopiero teraz po zakończeniu podejdę do testowania wszystkich programów i ich poprawności pracy.
Mam nadzieję iż jedno zdjęcie pokaże jakie oprogramowanie zostało zainstalowane. W sumie tydzień pracy aby jakos to udokumentować i mam nadzieję że choć w części udało mi się tym artykułem odpowiedzieć na pytania jakie mogą nurtować podczas instalacji.
Jak dotarliście do tej części to szacunek dla was :)
Pozdrawiam serdercznie
Marcin London "ZEUS"
op. M0IQF / HF4ALL