SpyServer – это бесплатный RTL-SDR совместимый SDR-сервер, предназначенный для работы с программным обеспечением SDR#. Изначально он разрабатывался для SDR-приёмников AirSpy, но автор также сделал его совместимым с приёмниками RTL-SDR. SpyServer позволяет подключать и использовать удаленно SDR-приёмники. Основное отличие spyserver от rtl_tcp в том, что для его работы требуется меньшая пропускная способность сети, т.к. по сети передаётся не весь поток данных, а только IQ-поток текущей частоты. Картинка водопада формируется на сервере и передаётся на SDR# в сжатом виде. Правда у такого поведения есть и минус – для работы spyserver требуется процессор немного мощнее чем для работы с rtl_tcp.

Подготовка для работы с приёмниками RTL-SDR:

Устанавливаем утилиты для работы с приёмниками rtl-sdr:

$ sudo apt install rtl-sdr

Далее проверяем работу подключенного SDR-приёмника. В идеальном мире должно получиться примерно так:

$ rtl_test
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Detached kernel driver
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...
Allocating 15 zero-copy buffers
lost at least 28 bytes

Но с первого раза может получиться так:

$ rtl_test 
Found 1 device(s):
  0:  , , SN: 

  Using device 0: Generic RTL2832U OEM
  usb_open error -3
  Please fix the device permissions, e.g. by installing the udev rules file rtl-sdr.rules
  Failed to open rtlsdr device #0.

Или даже так:

$ rtl_test 
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

  Using device 0: Generic RTL2832U OEM

  Kernel driver is active, or device is claimed by second instance of librtlsdr.
  In the first case, please either detach or blacklist the kernel module
  (dvb_usb_rtl28xxu), or enable automatic detaching at compile time.

  usb_claim_interface error -6
  Failed to open rtlsdr device #0.

Исправить эти ошибки достаточно просто – нужно выгрузить некоторые модули ядра из памяти, и занести их в чёрный список:

$ sudo rmmod dvb_usb_rtl28xxu dvb_usb_v2 e4000 rtl2832
$ sudo nano -w /etc/modprobe.d/rtl-sdr-blacklist.conf
blacklist dvb_core
blacklist dvb_usb_rtl28xxu
blacklist dvb_usb_v2
blacklist e4000
blacklist rtl2832

Подключение SDR-приёмников AirSpy mini / R2

Установим комплект утилит для SDR-приёмников AirSpy mini / R2:

$ sudo apt install airspy

Затем проверим, определился ли SDR-приёмник:

$ sudo airspy_info
airspy_lib_version: 1.0.9

Found AirSpy board 1
Board ID Number: 0 (AIRSPY)
Firmware Version: AirSpy MINI v1.0.0-rc9-0-ga56adfd 2016-06-12V
Part ID Number: 0x6906002B 0x00000030
Serial Number: 0x061C67DC286C91A3
Supported sample rates:
    6.000000 MSPS
    3.000000 MSPS
Close board 1

Далее пробуем выполнить эту команду с правами обычного пользователя:

$ airspy_info 
airspy_lib_version: 1.0.9
airspy_open() board 1 failed: AIRSPY_ERROR_NOT_FOUND (-5)

При выполнении этой команды с правами обычного пользователя возникает ошибка AIRSPY_ERROR_NOT_FOUND (-5), значит у пользователя не хватает прав для доступа к SDR-приёмнику. Исправим эту ситуацию:

$ sudo usermod -a -G plugdev `whoami`

После включения пользователя в группу plugdev необходимо перелогиниться и можно пробовать ещё раз:

$ airspy_info
airspy_lib_version: 1.0.9

Found AirSpy board 1
Board ID Number: 0 (AIRSPY)
Firmware Version: AirSpy MINI v1.0.0-rc9-0-ga56adfd 2016-06-12V
Part ID Number: 0x6906002B 0x00000030
Serial Number: 0x061C67DC286C91A3
Supported sample rates:
    6.000000 MSPS
    3.000000 MSPS
Close board 1

Теперь прав достаточно и у обычного пользователя.

Кстати, из вывода команды airspy_info видно, что версия прошивки SDR-приёмника – 1.0.0-rc9, а последняя сейчас 1.0.0-rc10. Для обновления прошивки, открываем страницу с прошивками, скачиваем последнюю прошивку airspy_fw_v1.0.0-rc10.zip и обновляем SDR-приёмник:

$ wget https://github.com/airspy/airspyone_firmware/releases/download/v1.0.0-rc10/airspy_fw_v1.0.0-rc10.zip
$ unzip airspy_fw_v1.0.0-rc10.zip
$ rm -f airspy_fw_v1.0.0-rc10.zip
$ cd airspy_fw_v1.0.0-rc10/
$ airspy_spiflash -w airspy_rom_to_ram.bin -s 0x061C67DC286C91A3
Board serial number to open: 0x061C67DC286C91A3
File size 21508 bytes.
Erasing 1st 64KB in SPI flash.
Writing 256 bytes at 0x000000.
...
Writing 256 bytes at 0x005300.
Writing 4 bytes at 0x005400.

Далее отсоединяем SDR-приёмник, через несколько секунд подключаем его обратно и смотрим обновилась ли на нём прошивка:

$ airspy_info 
airspy_lib_version: 1.0.9

Found AirSpy board 1
Board ID Number: 0 (AIRSPY)
Firmware Version: AirSpy MINI v1.0.0-rc10-0-g946184a 2016-09-19
Part ID Number: 0x6906002B 0x00000030
Serial Number: 0x061C67DC286C91A3
Supported sample rates:
    6.000000 MSPS
    3.000000 MSPS
Close board 1

Установка и настройка SpyServer

Теперь откроем страницу https://airspy.com/download/ и установим SpyServer. Для этого скачаем файл spyserver-linux-x64.tgz для 64-битных x86-систем, файл spyserver-linux-x86.tgz для 32-битных x86-систем и файл spyserver-arm32.tgz для систем с ARM-процессором (Raspberry Pi, ASUS Tinker Board, Odroid, NanoPi NEO и т.д.).

$ wget https://airspy.com/downloads/spyserver-linux-x64.tgz
$ tar zxvf spyserver-linux-x64.tgz
$ rm -f spyserver-linux-x64.tgz
$ sudo mv spyserver /usr/local/bin/
$ sudo mv spyserver_ping /usr/local/bin/
$ sed -i 's/\r//g' spyserver.config
$ mkdir -p ~/.config/spyserver
$ mv spyserver.config ~/.config/spyserver/

Правильнее всего для каждого устройства создавать свой конфигурационный файл:

$ cp ~/.config/spyserver/spyserver.config ~/.config/spyserver/spyserver.mini.config
$ nano -w ~/.config/spyserver/spyserver.mini.config
bind_host = 0.0.0.0
bind_port = 5555
list_in_directory = 0
maximum_clients = 1
allow_control = 1
device_type = AirspyOne
device_serial = 0x061C67DC286C91A3
minimum_frequency = 24000000
maximum_frequency = 1750000000
initial_gain = 17
enable_bias_tee = 0

Параметр initial_gain нужно будет позже подобрать экспериментальным путём. В названии конфигурационного файла вместо mini – можно указать любой алиас, я у себя использую алиасы mini (AirSpy mini), mini-gain (AirSpy mini для которого включен параметр Bias-Tee, т.к. к этому SDR-приёмнику подключен LNA), hf (AirSpy HF+), rtl1 (RTL-SDR), rtl2 (RTL-SDR) и т.д. Эти алиасы далее будут использована для создания сервисов в systemd, для автозапуска SpyServer.

Пробуем запустить SpyServer и подключиться к нему из SDR#. Опять-таки, в идеальном мире SDR# подключится сразу без ошибок, а вывод в консоли будет таким:

$ spyserver ~/.config/spyserver/spyserver.mini.config
SPY Server v2.0.1700
Copyright (C) 2016-2018 Youssef Touil - https://airspy.com
Reading the configuration file: /home/wakko/.config/spyserver/spyserver.mini.config
Listening for connections on 0.0.0.0:5555
Accepted client 192.168.255.20:52246 running SDR# v1.0.0.1700 on Microsoft Windows NT 6.2.9200.0
Device was sleeping. Wake up!
Acquired an AirspyOne device

Если всё удалось с первого раза – Вы везунчик! Покупайте лотерейный билет и переходите к настройке автозапуска. А если SDR# выдал ошибку Server is busy, а в консоли появилось сообщение Could not acquire the device – значит установленные библиотеки из пакета libairspy0 не совместимы с установленным SpyServer, в таком случае будем собирать и устанавливать эти библиотеки из исходников:

$ sudo apt remove airspy libairspy0
$ sudo apt install build-essential cmake libusb-1.0-0-dev pkg-config
$ wget https://github.com/airspy/airspyone_host/archive/master.zip
$ unzip master.zip
$ rm -f master.zip
$ cd airspyone_host-master/
$ mkdir build
$ cd build/
$ cmake ../ -DINSTALL_UDEV_RULES=ON
$ make
$ sudo make install
$ sudo ldconfig
$ cd ../../
$ rm -rf airspyone_host-master/

В случае если у Вас SDR-приёмник AirSpy HF+, то необходимо устанавливать библиотеки и утилиты для HF+:

$ wget https://github.com/airspy/airspyhf/archive/master.zip
$ unzip master.zip
$ rm -f master.zip
$ cd airspyhf-master/
$ mkdir build
$ cd build/
$ cmake ../ -DINSTALL_UDEV_RULES=ON
$ make
$ sudo make install
$ sudo ldconfig
$ cd ../../
$ rm -rf airspyhf-master/

После установки библиотек, опять пробуем запустить SpyServer и подключиться к нему из SDR#:

$ spyserver ~/.config/spyserver/spyserver.mini.config
SPY Server v2.0.1700
Copyright (C) 2016-2018 Youssef Touil - https://airspy.com
Reading the configuration file: /home/wakko/.config/spyserver/spyserver.mini.config
Listening for connections on 0.0.0.0:5555
Accepted client 192.168.255.20:52246 running SDR# v1.0.0.1700 on Microsoft Windows NT 6.2.9200.0
Device was sleeping. Wake up!
Acquired an AirspyOne device

Теперь всё получилось! Приступим к настройке автозапуска.

Настройка автозапуска в systemd

Создадим файл сервиса systemd:

$ sudo nano -w /etc/systemd/system/spyserver@.service
[Unit]
Description=Spy Server
After=network-online.target

[Service]
Type=simple
PAMName=login
Restart=always
RestartSec=2
ExecStartPre=/usr/bin/test -f ${HOME}/.config/spyserver/spyserver.%i.config
ExecStart=/usr/local/bin/spyserver ${HOME}/.config/spyserver/spyserver.%i.config
User=wakko

[Install]
WantedBy=multi-user.target

$ sudo systemctl daemon-reload

А теперь можно создавать сервисы для каждого SDR-приёмника. Как говорилось ранее, в названиях конфигурационных файлов для SpyServer содержится алиас устройства, который используется для создания соответствующего сервиса в systemd. В примере ниже используется устройство с алиасом mini:

$ sudo systemctl enable spyserver@mini.service
Created symlink /etc/systemd/system/multi-user.target.wants/spyserver@mini.service → /etc/systemd/system/spyserver@.service.
$ sudo systemctl start spyserver@mini.service
$ sudo systemctl status spyserver@mini.service
● spyserver@mini.service - Spy Server
   Loaded: loaded (/etc/systemd/system/spyserver@.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-02-21 23:40:59 MSK; 3s ago
  Process: 31858 ExecStartPre=/usr/bin/test -f ${HOME}/.config/spyserver/spyserver.mini.config (code=exited, status=0/SUCCESS)
 Main PID: 31873 (spyserver)
    Tasks: 0 (limit: 4915)
   Memory: 576.0K
   CGroup: /system.slice/system-spyserver.slice/spyserver@mini.service
           ‣ 31873 /usr/local/bin/spyserver /home/wakko/.config/spyserver/spyserver.mini.config

Feb 21 23:40:59 radio systemd[1]: Starting Spy Server...
Feb 21 23:40:59 radio systemd[31858]: pam_unix(login:session): session opened for user wakko by (uid=0)
Feb 21 23:40:59 radio systemd[1]: Started Spy Server.
Feb 21 23:40:59 radio systemd[31873]: pam_unix(login:session): session opened for user wakko by (uid=0)

Для каждого устройства нужно создавать и запускать свою копию сервиса командами:

$ sudo systemctl enable spyserver@alias.service
$ sudo systemctl start spyserver@alias.service
$ sudo systemctl status spyserver@alias.service

PS. Если у вас устройство с 64-битным ARM-процессором (типа NanoPi NEO2 с процессором ARM Cortex-A53 (Allwinner H5 64-bit ARM)), и что бы Вы не делали – всё равно появляется ошибка Could not acquire the device то читайте здесь как это исправить. Если в двух словах, то проблема в том, что библиотека libairspy собирается 64-битная под архитектуру aarch64, а сам сервер spyserver скомпилирован 32-битным под архитектуру armhf (ARM hard-float), и поэтому библиотеку libairspy нужно тоже скомпилировать 32-битной под архитектуру armhf.


Следующая запись Предыдущая запись