Собираем YSF hotspot с управлением DG-ID кодами

февраль 2023

Cоберём из исходников простую конфигурацию, для работы (с цифровой радиостанцией Yaesu) в YSF рефлекторах, с возможностью дальнейшего расширения в рамках hotspot или городского линка.

Что такое DG-ID?
Это групповые коды, которые передаются и декодируются радиостанциями Yaesu в цифровом режиме C4FM. Всего доступно 100 кодов. Можно сказать что DG-ID ближайший аналог DCS кодов, только в цифре.

Блок-схема hotspot выглядит так:

Для тестирования описанной здесь конфигурации, я использовал Raspberry_Pi (версия не имеет значения) с дистрибьютивом Raspbian и DV-MEGA в качестве радиостанции с модемом. Подключение к малине по usb-порту.

DV-MEGA не требует калибровки девиации, offset-ы у неё также по нулям, поэтому эту часть опускаем.

Приступаем к настройке:

sudo apt update && sudo apt upgrade -y
sudo apt install mc git curl libsamplerate-dev -y

Особенность этого примера в том, что весь рабочий комплект находится в ~/test/ (домашняя директория пользователя pi). Это не unix-style, но удобно для быстрых тестов. Удалив единственную папку, мы удалим всё что было установлено и можем быстро всё переделать.

Выполним команды:

cd ~ && rm -fr test && mkdir test && cd test

git clone https://github.com/g4klx/MMDVMHost.git
cd MMDVMHost
make

cd ..
git clone https://github.com/g4klx/YSFClients.git
cd YSFClients
make

Мы собрали необходимый комплект, теперь настроим его. Обращаем внимание на следующие строки:

mcedit ~/test/MMDVMHost/MMDVM.ini

[General]
Callsign=ваш_позывной
Id=ваш_dmr-id
Duplex=0
....
Daemon=0

[Info]
RXFrequency=438080000
TXFrequency=438080000
....

[Log]
....
FilePath=/tmp
FileRoot=MMDVM
....

[CW Id]
Enable=0
....

[Modem]
Protocol=uart
UARTPort=/dev/ttyUSB0
....
TXInvert=0
RXInvert=0
....
RXOffset=0
TXOffset=0
....
RXLevel=100
....

[Transparent Data]
Enable=0
....


[D-Star]
Enable=0
....

[DMR]
Enable=0
....

[System Fusion]
Enable=1
....

[P25]
Enable=0
....

[NXDN]
Enable=0
....
[M17]
Enable=0
....

[POCSAG]
Enable=0
....

[FM]
Enable=0
....

[AX.25]
Enable=0
....

[D-Star Network]
Enable=0
....


[DMR Network]
Enable=0
....

[System Fusion Network]
Enable=1
LocalAddress=127.0.0.1
LocalPort=3200
GatewayAddress=127.0.0.1
GatewayPort=4200
....

[P25 Network]
Enable=0
....

[NXDN Network]
Enable=0
....

[M17 Network]
Enable=0
....

[POCSAG Network]
Enable=0
....

[FM Network]
Enable=0
....

[AX.25 Network]
Enable=0
....

DMR_ID не нужен для работы в YSF сети, но мы его указываем для того чтобы станции других стандартов, могли видеть ваш позывной.

Проверим что связка "радиостанция + модем + mmdvm" работает как нам нужно, для этого запускаем mmdvmhost:

cd ~
./test/MMDVMHost/MMDVMHost test/MMDVMHost/MMDVM.ini

Включаем c4fm радиостанцию на установленной частоте, нажимаем ptt и наблюдаем как бегут строки:

Нажимаем Ctrl+C чтобы остановить программу.
1. Если всё так, меняем параметр Daemon=0 на 1 и идём дальше.
2. Если что-то не работает. Дальше не продолжаем, пока не разберемся в чём дело!

Мы всегда можем видеть что делает этот модуль в режиме онлайн, командой (только дату в имени лога ставьте текущую):

tail -f /tmp/MMDVM-2023-02-17.log


 DGIdGateway

DGIdGateway не понимает X-команд!

Разберём работу с приведённой конфигурацией. По умолчанию, hotspot подключен к локальному эхо-репитеру. Если вы передаёте DG-ID 2 сигнал транслируется в рефлектор KAVKAZ. DG-ID 3 направляет сигнал в рефлектор MAYKOP. Это простая конфигурация, от которой можно отталкиваться развивая функционал.

Параметры RFHangTime=60 и NetHangTime=60 определяют продолжительность работы с текущим подключением, в не зависимости от того какой DG-ID был установлен после соединения (например с рефлектором).

Через 60 секунд после окончания переговоров на частоте, DGIdGateway снова будет готов перенаправить принятый сигнал в зависимости от установленного DG-ID.

Параметр Static=1 обозначает статическое подключение, которое будет транслироваться в эфир, если в нём начнутся переговоры.

DGIdGateway (который понимает dg-id) может перенаправить подключение на YSFGateway (который понимает x-команд) и таким образом можно задействовать как команды, так и коды! Круто!

Настроим DGIdGateway:

mcedit ~/test/YSFClients/DGIdGateway/DGIdGateway.ini

[General]
Callsign=ваш_позывной
Suffix=ND
Id=ваш_dmr-id
....
Daemon=0

[Log]
....
FilePath=/tmp
FileRoot=DGIdGateway
....

[YSF Network]
Hosts=./YSFHosts.txt
....

[DGId=0]
# Local YSFGateway
Type=Gateway
Static=0
Address=127.0.0.1
Port=42025
Local=42026
Debug=0


[DGId=1]
# YSF Local Parrot
Type=Parrot
Static=1
Address=127.0.0.1
Port=42012
Local=42013
RFHangTime=30
NetHangTime=30
Debug=0

[DGId=2]
# YSF Reflector
Type=YSF
Static=0
Name=RU-KAVKAZ
Local=42014
Debug=0

[DGId=3]
# YSF Reflector
Type=YSF
Static=0
Name=RU-MAYKOP
Local=42015
Debug=0
....

Теперь (согласно блок-схеме) запустим нашу конструкцию, скопировав команды по очереди:

killall -q MMDVMCal MMDVMHost DGIdGateway YSFGateway YSFReflector YSFParrot

cd ~/test/MMDVMHost
./MMDVMHost MMDVM.ini

cd ~/test/YSFClients/DGIdGateway
./DGIdGateway DGIdGateway.ini

Если мы видим что-то подобное, значит всё получилось, наш DGIdGateway декодирует DG-ID и направляет сигнал куда указано в конфиге.

Нажимаем Ctrl+C чтобы остановить программу.
В конфигурационный файл DGIdGateway.ini оставляем Daemon=0.

Чтобы видеть что делает модуль в онлайне, вводим в консоли команду (дату в имени лога ставьте текущую):

tail -f /tmp/DGIdGateway-2023-02-17.log


 файл YSFHosts.txt

В конфиге должен быть указан полный путь к файлу YSFHosts.txt, как на примере выше.

В файле YSFHosts.txt хранятся данные по которым hotspot определяет параметры подключения к рефлекторам в сети.

К рефлекторам которые прописаны в файле, наш hotspot сможет подключаться, если рефлектора нет в этом файле - мы не сможем к нему подключиться.

Если нужен короткий вариант YSFHosts.txt (только русскоговорящие рефлекторы), выполните команду:

curl -s -N http://kavkaz.qrz.ru/YSF_Hosts.txt > ~/test/YSFClients/DGIdGateway/YSFHosts.txt


 YSFParrot

Эхо-репитер нужен для тестов, проверки качества модуляции и покрытия. Чтобы запустить его, выполним команды:

cd ~
./test/YSFClients/YSFParrot/YSFParrot 42012 > /dev/null 2>&1 &


 YSFReflector

Рефлектор = комната (разговорная группа, TG) к которой может подключиться множество hotspot/линков/шлюзов/репитеров, а радиолюбители из эфира получат возможность общаться между собой.

Редактируем конфигурационный файл для локальной комнаты. Регистрация не требуется:

mcedit ~/test/YSFClients/YSFReflector/YSFReflector.ini

[General]
Daemon=1

[Info]
....
Name=RU-LOCAL
....

[Log]
....
FilePath=/tmp
....

[Network]
Port=42090
....

Добавляем нашу комнату в файл YSFHosts.txt, что-бы к ней можно было подключиться.

mcedit ~/test/YSFClients/DGIdGateway/YSFHosts.txt

12345;RU-local;only test;127.0.0.1;42090;001;http://kavkaz.qrz.ru

Добавляем подключение в шлюз DGIdGateway.

mcedit ~/test/YSFClients/DGIdGateway/DGIdGateway.ini

....
[DGId=4]
Type=YSF
Static=0
Name=RU-local
Local=42016
....

Запускаем.

cd ~/test/YSFClients/YSFReflector
./YSFReflector YSFReflector.ini

Нужно понимать, что комната доступна только в вашей локальной сети. Скорее всего это домашняя сеть на базе WI-FI роутера. Для подключения из вне, требуется белый IP и открытый порт 42090.

Для подключения из эфира, нажимаем на радиостанции клавишу GM, удерживаем полторы секунды, в открывшемся меню выбираем DG-ID TX 04.


 DGID + YSFGateway

Создадим подключение к YSFGateway через DGIdGateway. Зачем? Для использования заложенных в радиостанцию возможностей, а именно, управления hotspot посредством и DG-ID и X-команд.

Создадим отдельный конфигурационный файл YSFGateway2.ini для этого выполним команду:

cp ~/test/YSFClients/YSFGateway/YSFGateway.ini ~/test/YSFClients/YSFGateway/YSFGateway2.ini

Нужно сделать небольшие изменения в двух ini файлах (поменять порты), чтобы состыковать DGIdGateway и YSFGateway между собой. Меняем порты в указанной секции.

mcedit ~/test/YSFClients/DGIdGateway/DGIdGateway.ini

[DGId=0]
....
Port=42010
Local=32010
....

Предполагается что YSFGateway2.ini уже настроен, так как было описано в статье 'Собираем hotspot с управлением X-командами'. Значит нам осталось поменять порты внутри секции General, в следующем конфиге.

mcedit ~/test/YSFClients/YSFGateway/YSFGateway2.ini

[General]
....
RptPort=32010
....
LocalPort=42010
....

Поставьте в конфиге Daemon=1 и выполните следующие команды, для запуска настроенных модулей.

killall -q MMDVMCal MMDVMHost DGIdGateway YSFGateway YSFReflector YSFParrot

cd ~/test/YSFClients/YSFParrot
./YSFParrot 42012 > /dev/null 2>&1 &

cd ~/test/MMDVMHost
./MMDVMHost MMDVM.ini

cd ~/test/YSFClients/DGIdGateway > /dev/null 2>&1 &
./DGIdGateway DGIdGateway.ini

cd ~/test/YSFClients/YSFGateway
./YSFGateway YSFGateway2.ini

Проконтролируйте командой ps ax | tail что все модули запущены и работают.

Подведём итог работы:
1. Если в радиостанции стоит DG-ID 00, вы можете использовать X-команды, получать список и ходить по YSF рефлекторам, также как вы это бы делали если бы работал только YSFGateway.

2. Если вы поставили DG-ID 01 на вашу передачу в эфире ответит ZZ Parrot (эхо-репитер). Это уже включился в работу DGIdGateway. Х-команды он не понимает.

3. При выборе DG-ID 02 вы попадёте в YSF рефлектор KAVKAZ.

4. При выборе DG-ID 03 вы попадёте в YSF рефлектор MAYKOP.

Важно помнить, что переходить мгновенно из одного направления в другое не получится, так как существует таймер RFHangTime/NetHangTime который не даст это сделать без определённой паузы в эфире.


 Эпилог

Что ещё сделать? Можно увеличить кол-во DG-ID в конфигурационном файле DGIdGateway.ini и предусмотреть другие направления или добавить модули YSF2...., для перехода в сети других цифровых стандартов.


 Cсылки

Что такое Yaesu System Fusion?
YSF - модульная радиосеть
Собираем YSF hotspot с управлением X-командами

R7HJ