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

Установка необходимых библиотек

Устанавливаем необходимые утилиты для компиляции 32-битных библиотек на 64-битной системе:

$ sudo apt install build-essential cmake pkg-config gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

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

$ wget https://github.com/airspy/airspyone_host/archive/master.zip
$ unzip master.zip
$ rm -f master.zip
$ cd airspyone_host-master/
$ nano -w toolchain-arm32.cmake
  SET(CMAKE_SYSTEM_NAME Linux)
  SET(CMAKE_SYSTEM_PROCESSOR arm)
  SET(TARGET_ABI "linux-gnueabihf")
  SET(CMAKE_C_COMPILER   arm-${TARGET_ABI}-gcc)
  SET(CMAKE_CXX_COMPILER arm-${TARGET_ABI}-g++)
  SET(CMAKE_FIND_ROOT_PATH /usr/arm-${TARGET_ABI})
$ mkdir build
$ cd build/
$ cmake ../ -DINSTALL_UDEV_RULES=ON -DCMAKE_TOOLCHAIN_FILE=../toolchain-arm32.cmake
$ make
$ sudo make install
$ sudo ldconfig
$ cd ../../
$ rm -rf airspyone_host-master/

Затем проверим, определился ли 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

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

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

$ wget https://github.com/airspy/airspyhf/archive/master.zip
$ unzip master.zip
$ rm -f master.zip
$ cd airspyhf-master/
$ nano -w toolchain-arm32.cmake
  SET(CMAKE_SYSTEM_NAME Linux)
  SET(CMAKE_SYSTEM_PROCESSOR arm)
  SET(TARGET_ABI "linux-gnueabihf")
  SET(CMAKE_C_COMPILER   arm-${TARGET_ABI}-gcc)
  SET(CMAKE_CXX_COMPILER arm-${TARGET_ABI}-g++)
  SET(CMAKE_FIND_ROOT_PATH /usr/arm-${TARGET_ABI})
$ mkdir build
$ cd build/
$ cmake ../ -DINSTALL_UDEV_RULES=ON -DCMAKE_TOOLCHAIN_FILE=../toolchain-arm32.cmake
$ make
$ sudo make install
$ sudo ldconfig
$ cd ../../
$ rm -rf airspyhf-master/

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

$ sudo airspyhf_info 
AirSpy HF library version: 1.4.2

S/N: 0x3652948040D23FD2
Part ID: 0x00000001
Firmware Version: R1.6.1
Available sample rate: 768 kS/s

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

$ airspyhf_info 
AirSpy HF library version: 1.4.2
No devices attached.

При выполнении этой команды с правами обычного пользователя возникает ошибка No devices attached, значит у пользователя не хватает прав для доступа к SDR-приёмнику. Т.к. в группу plugdev мы себя уже добавили – попробуйте просто переподключить SDR-приёмник к USB-порту. Это должно помочь, т.к. при установки библиотеки libairspyhf в папку /etc/udev/rules.d/ были помещены соответствующие правила, при переподключении SDR-приёмника, устройство /dev/airspyhf-* будет создано с правами позволяющими пользователям из группы plugdev работать с данным устройством.

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

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

$ wget https://airspy.com/downloads/spyserver-arm32.tgz
$ tar zxvf spyserver-arm32.tgz
$ rm -f spyserver-arm32.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#. Всё должно заработать и вывод в консоли будет таким:

$ 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 Sat 2019-02-23 13:12:08 MSK; 5s ago
 Main PID: 3245 (spyserver)
   CGroup: /system.slice/system-spyserver.slice/spyserver@mini.service
           ‣ 3245 /usr/local/bin/spyserver /home/wakko/.config/spyserver/spyserver.mini.config

Feb 23 13:12:08 NanoPi systemd[1]: Started Spy Server.
Feb 23 13:12:08 NanoPi systemd[3245]: 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

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