JS8Call: Slack на коротких волнах
Привет, Хабр.
Среди радиолюбительского софта существует немало программ для обмена сообщениями, наиболее популярными из которых можно считать FT8 и WSPR. Однако, они в большей степени ориентированы на классическую радиолюбительскую связь — подтверждение приема и/или обмен рапортом о качестве связи, и на этом все заканчивается. В этом плане, весьма интересным мне показался новый цифровой вид связи JS8Call, возможности которого гораздо шире.
Посмотрим, как это работает.
Прием и передача
Сам протокол JS8 работает на том же принципе, что и популярный среди радиолюбителей FT8. Его разбор я уже делал на Хабре, желающие могут ознакомиться подробнее. Если совсем кратко, то сообщения передаются на средних, длинных или коротких волнах в виде фиксированных «пакетов» длиной 15с, длина каждого сообщения 77 бит, что с одной стороны немного, с другой стороны, позволяет передавать краткие сообщения в виде позывного, места передачи и пр.
Сам протокол FT8 оказался весьма удачным, т.к. позволяет передавать и принимать сообщения на большие расстояния — с 5 Вт выходной мощности вполне можно связаться с корреспондентом на расстояние в 1000 км. Но схема кодирования текста в FT8 черезчур ограничена, т.к. ориентирована только на радиолюбительские позывные, практически ничего больше внутри сообщения передать нельзя (в принципе можно, но будет очень медленно и неудобно). Но используя сам принцип кодирования, другой радиолюбитель Jordan Sherer создал на базе FT8 свою программу JS8Call (как несложно догадаться, JS — инициалы автора), обладающую гораздо более гибкой функциональностью:
- Программа использует узкополосную модуляцию в разных режимах: Turbo (6с на сообщение, занимаемая полоса 160 Гц), Normal (15с на сообщение, полоса 50 Гц, Slow (30c на сообщение, полоса 25 Гц). Очевидно, тем выше скорость тем удобнее для пользователя, но тем меньше дальность. Пользователь сам может выбрать нужную скорость в зависимости от условий, качества антенны, дальности, на приемной стороне тип сообщений определяется автоматически, что весьма удобно.
- Программа имеет развитые возможности групповой связи: можно пересылать сообщения через промежуточного абонента, программа может накапливать сообщения для другого адресата, который может запросить количество входящих сообщений. Можно отправлять сообщения группам, можно включить режим автоматического подтверждения приема и пр.
- Программа может работать на практически любых частотах, от 1.8 МГц до 144 МГц УКВ.
- Имеется API для интеграции с внешним софтом по UDP или TCP.
- Программа работает на любом «железе», включая Windows, OSX и Raspberry Pi, при этом софт распространяется совершенно бесплатно и доступен в исходниках.
Важно заметить, что JS8Call ориентирована на радиолюбительское применение и эксперименты в области связи, не стоит рассматривать её просто как бесплатную замену спутникового телефона в тайге. Ни шифрования, ни закрытых каналов в программе нет — все сообщения видны всем, так что вряд ли она подойдет для проф. связи без «доработки напильником» и лицензирования выделенных частот. С другой стороны, для радиолюбительских экспериментов такой софт может быть не только интересным, но и полезным, например можно организовать свой SMS-гейт для передачи сообщений из мест, где нет сотового покрытия, чтобы иметь возможность экстренной связи, или организовать обмен сообщениями между двумя группами радиолюбителей в походе — поддержка Raspberry Pi вполне позволяет сделать компактное и автономное устройство для приема и передачи сообщений. Все это возможно, выходит за рамки «ортодоксальной» радиолюбительской связи, но ведь тем оно и интересно, что можно попробовать что-то новое.
Физически, подключение программы к трансиверу или приемнику осуществляется точно так же, как и для других цифровых видов, достаточно соединить аудиовыход трансивера с ПК и выбрать в софте соответствующее аудиоустройство.
Общий принцип понятен, перейдем к тестированию.
Тестирование
Мой радиолюбительский позывной истек уже лет 5 назад, а без действующей лицензии работать на передачу официально нельзя, так что я буду использовать программу лишь на прием, а «передачу» протестирую локально в пределах комнаты с помощью звуковой карты ПК — очевидно, программе «без разницы», откуда и куда идет сигнал.
Прием
Я установил программу на Raspberry Pi и использовал её в режиме приема: программа GQRX подключенная к приемнику SDRPlay и JS8Call обменивались данными через виртуальный звуковой кабель.
Можно обратить внимание на поле Distance в правом углу картинки. Как можно видеть, принять сообщение можно даже с другого материка. В целом, по приему, всё весьма неплохо. На мою скромную антенну AOR SA7000 (это штырь длиной 2 метра) на балконе были приняты практически все страны Европы и несколько станций из Америки и Канады. Каждая метка на карте это принятая станция:
Максимальная дистанция приема составила 7831 км на частоте 14 МГц. А вот сигналов из России, увы, не было принято ни одного.
Передача
«Передачу» я буду тестировать только локально, для чего с помощью командной строки js8call.exe -r test1… js8call.exe -r test4 были запущены 4 копии программы с разными «виртуальными» позывными USER1…USER4. В настройках также была отключена посылка данных на pskreporter, чтобы не мешать другим радиолюбителям тестовыми сообщениями. Окна приема и передачи 4х программ выглядят примерно так:
Напоминаю, что частота на экране «виртуальная», сигналы в эфир не передавались. Как оказалось, даже виртуальная звуковая карта не нужна, обычного микрофона и динамика компьютера вполне достаточно.
JS8Call предоставляет следующие возможности:
- Отправку сообщений всем абонентам или какому-то конкретному пользователю
- Возможность послать ответ с указанием качества сигнала
- Возможность переслать сообщение абоненту через другого абонента
- Возможность запросить абонента, нет ли для него принятых сообщений
- Возможность видеть, какой абонент кого «слышит», чтобы знать через кого можно послать сообщение.
Это лишь часть доступных функций, желающие могут ознакомиться с документацией к программе. Все это можно потестировать локально, с помощью динамика и микрофона, даже не выходя в эфир. Довольно любопытно наблюдать, как вторая программа в ответ на запрос о силе сигнала или информации о станции автоматически передает ответ, который появляется в «окне чата» в первой программе. В целом, возможности для радиолюбительских экспериментов довольно большие.
API
Последний интересный момент, который мы рассмотрим, это API. Для начала в программе нужно включить поддержку API в настройках, я выбрал TCP:
Пишем простейшую программу для приема сообщений через socket:
import socket
HOST = '127.0.0.1' # The server's hostname or IP address
PORT = 2442 # The port used by the server
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while True:
data = s.recv(1024)
print('Received', repr(data))
Запускаем. Результат на скриншоте:
Как можно видеть, мы имеем полный доступ к входящим сообщениям в виде JSON, что позволяет использовать их как угодно, например для гейта в Telegram, SMS, пересылки в другие сервисы и пр. Вроде API можно использовать и для передачи, но это не точно, полное описание автор пока не выложил.
Заключение
Как можно видеть, программа JS8Call определенно является довольно интересным и в чем-то новым экспериментом в области радиолюбительской связи. JS8Call ориентирована не только на «традиционный» обмен рапортами о приеме, но и поддерживает более-менее активное участие радиолюбителей в выездах, коммуникации в походе, работе с сообщениями и группами. Сейчас наблюдается определенный рост интереса к QRP-связям (связям малой мощностью с портативным оборудованием) и проведеню радиосвязей на природе, отчасти потому что в городах помех все больше, да и серьезные антенны ставить официально зачастую нельзя. Так что программа JS8Call вполне «в тему», и наверняка заинтересует радиолюбителей, увлекающихся выездами и путешествиями. В целом, все это довольно интересно, и можно надеяться, что с появлением такого софта интерес к радиолюбительству только возрастет.
Ну, а всем как обычно, удачных экспериментов.