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 не понимает 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 хранятся данные по которым hotspot определяет параметры подключения к рефлекторам в сети.
К рефлекторам которые прописаны в файле, наш hotspot сможет подключаться, если рефлектора нет в этом файле - мы не сможем к нему подключиться.
Если нужен короткий вариант YSFHosts.txt (только русскоговорящие рефлекторы), выполните команду:
curl -s -N http://kavkaz.qrz.ru/YSF_Hosts.txt > ~/test/YSFClients/DGIdGateway/YSFHosts.txt
Эхо-репитер нужен для тестов, проверки качества модуляции и покрытия. Чтобы запустить его, выполним команды:
cd ~ ./test/YSFClients/YSFParrot/YSFParrot 42012 > /dev/null 2>&1 &
Рефлектор = комната (разговорная группа, 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, удерживаем полторы секунды, в открывшемся меню выбираем
Создадим подключение к 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...., для перехода в сети других цифровых стандартов.
Что такое Yaesu System Fusion?
YSF - модульная радиосеть
Собираем YSF hotspot с управлением X-командами
R7HJ