RTL-TCP-сервер на Linux ARM.

Автор: Administrator вкл. . Опубликовано в RTL-SDR

Одноплатный компьютер OrangePi PC 2 я приобретал в 2017 году под одну конкретную задачу – запуск Spy Server. Однако, я не учел один важный момент, ставший впоследствии фатальным – процессор ARM 64-битный, соответственно ОС тоже 64-битные можно устанавливать, а вот программки далеко не все существуют под такую разрядность (правда мне так и непонятно, почему же нельзя ставить 32-битные ОС?). Нет, конечно, если есть исходный код, то можно скомпилировать файлы программы практически под любую архитектуру процессора и разрядность, но вот ребята из Airspy в общий доступ выкладывают уже готовые скомпилированные файлы, и они только под 32-битные ОС для процессоров ARM. Т.е. на OrangePi PC 2 запустить Spy Server на текущий момент времени (2017-2018 г.) никак нельзя. Для запуска Spy Server мне пришлось купить OrangePi Zero, и на нем все заработало просто отлично. Дабы хоть как-то использовать этот одноплатный ПК (OrangePi PC 2), гонял я на нем ведроид в качестве ТВ-приставки (и это его лучшее применение, учитывая написанное выше), но проблем там тоже хватает, да и вот настала пора писать про rtl_tcp.

Вообще, rtl_tcp я уже немного занимался под Windows, но сразу стали видны недостатки этого решения, и я переключился на другие варианты реализации идеи удаленного управления SDR-приемником. Теперь вот хочу описать наблюдения о настройке rtl_tcp-сервера в ОС Linux.

Конечно, технические и мощностные возможности OrangePi PC 2 в ОЧЕНЬ большом избытке для поставленной задачи, за глаза хватило бы и более слабой модели, но, вот, решил дать второй шанс этому ПК, применяя для радио-задач - тестовый стенд на его основе.

/ Ниже будут встречаться скриншоты, где видно, что плата уже OrangePi One и IP-адрес, отличный от описываемого в тексте – это я некоторые скриншоты делал несколько позже и уже на плате OrangePi One. Суть, которую передают изображения на скриншотах, это не меняет. /

В данном примере не важно какой именно RTL-SDR используется (на фото синий), также не важно применяется конвертер или нет, т.к. сдвиг частоты настраивается в клиентских приложениях, а не на стороне сервера.

 

 

 

Общие моменты процесса запуска RTL_TCP-сервера на одноплатном компьютере на базе процессора ARM-архитектуры:

1 – Скачивание образа ОС из интернета и запись его на карту microSD.

Задача несложная, однако есть один нюанс- если одноплатный ПК НЕ Raspberry Pi какой-либо версии, то с 99% вероятностью гарантированы пляски с бубном, либо в виде доустановки чего-то отсутствующего в ОС, либо в переборе некоторого количества этих самых образов ОС до момента «попадания» на тот, в котором запустится rtl_tcp (или какой-то другой софт, в зависимости от задачи) без проблем. Иными словами, с первого раза образ может не подойти для задачи rtl_tcp-сервера и к процедуре «вынуть microSD из одноплатного ПК, вставить в большой комп, записать образ, вынуть microSD из большого компа, вставить в одноплатный комп» придется прибегать некоторое количество раз.

2 – Установка драйверов для свистка RTL-SDR и тестирование на ошибки в работе средствами этих драйверов. Тут есть грабли с драйвером ТВ-тюнера (ТВ-драйвером).

3 – Пробный запуск rtl_tcp вручную. Проверка на наличие ошибок в процессе обращения к свистку.

4 – В случае успеха с пунктом 3 переход к пляскам вокруг автоматического запуска rtl_tcp после каждой перезагрузки одноплатного ПК. К автозагрузке, автостарту rtl_tcp, иными словами.

5 – Если надо режим Direct Sampling (КВ без конвертера), то предстоят пляски с бубном с другим дистрибутивом rtl_tcp, который я еще не мучил. Вопрос требует изучения (мною).

 

В качестве дополнения к пункту 1: мне пришлось перепробовать четыре разных образа ОС. Конечно, можно в каждом поковыряться до потери пульса и, вероятно, найти решение проблемы, но проще перебрать образы ОС, благо есть из чего выбрать:

 

Сперва была использована актуальная (на момент написания статьи это «Armbian_5.59_Orangepipc2_Debian_stretch_next_4.14.65.img» ) серверная версия Armbian с https://www.armbian.com/orange-pi-pc2/ - Тут все заработало, но при подключении SDR Sharp, SDR Console и SDR Touch(Ведроид) на панораме уровень сигнала зашкаливал и слышен сплошной треск. Регулировки усиления не действовали. Вывод программы rtl_test в терминале усыпан сообщениями вида “lost at least xxxxxx bytes”.

 

Вторым попробовал «Raspbian_server_For_PC2_H5_V0_1.img» с сайта Orangepi http://www.orangepi.org/downloadresources/orangepipc2/2017-06-15/orangepipc2_ffb2ffb666f1e91b9dc942e9.html

Тут все заработало нормально. Все, кроме автозапуска rtl_tcp …

 

Третьим пробовал «DietPi_v6.0_OPiPC2-ARMv8-Stretch.img», хотя на официальном сайте dietpi https://dietpi.com/ сейчас нет вообще ни одного образа для orangepi, их почему-то убрали… У меня образ сохранился от прошлых экспериментов.

Тут затык возник почти сразу :

root@DietPi:~/rtl-sdr/build# sudo cmake ../ -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON

CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. You probably need to select a different build tool.

CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage

-- Configuring incomplete, errors occurred!

 

Четвертым образом стал «Debian_Server_jessie_PC2_V0_9_1.img» с сайта orangepi http://www.orangepi.org/downloadresources/orangepipc2/2017-05-11/orangepipc2_107bbe84513d359564d21a4f.html

В этом образе заработало все, в том числе и автозапуск. Остановился на нем. Версия ядра Linux 3.10.65, архитектура aarch64, версия ОС Debian GNU/Linux 8 (jessie)

Описываемые далее действия частично основаны на совокупности вычлененной информации из двух статей – этой http://gimmor.blogspot.com/2014/01/sdr-dvb-t-realtek-rtl2832u-ubuntu.html и вот этой https://ur7hbq.blogspot.com/2016/09/rtl-sdr-openwebrxrtltcp-odroid-c1.html , плюс куча информации из поисковых запросов. И, конечно, мои собственные «сочинения».

Итак, после скачивания образа ОС, он записывается на microSD-карту. Процесс весьма обычный для подобных устройств, руководства без труда можно найти в интернете. Отмечу лишь, что для записи образов я использую программу Win32DiskImager в среде Windows 8.1 x64. Карту в этот раз использовал на 4Гб и Class 4, т.к. очередная восьмигигабайтная десятого класса внезапно умерла (уже имею некоторое количество разных дохлых microSD карточек…).

Питание я подключал непосредственно к гребенке GPIO, т.к. через microUSB-разъем подача питания не предусмотрена, а для подачи питания через специальный разъем у меня не нашлось подходящего штекера.

Распиновку гребенки посмотреть можно тут https://micro-pi.ru/orange-pi-pinout-pin-definition-gpio/#_Orange_Pi_PC_PC_2_PC_Plus Исходя из чего подключать + от блока питания нужно ко 2 пину или 4, а минус к 6. Первый пин на плате и на рисунке ниже помечен треугольничком.

 

 

 

После установки карты памяти в одноплатный ПК и подачи на него питания 5В (с током Ампера 2, не меньше), нужно немного подождать (наблюдая загоревшийся зеленый или красный светодиод на плате, а иногда оба, а иногда они моргают (зависит от ОС) и моргающие индикаторы интерфейса LAN), а после в DHCP-сервере роутера выяснить новоназначенный IP-адрес. Если ни один светодиод на плате не загорелся спустя несколько минут (5 минут хватит) после подачи питания, то проблема с образом ОС на карте microSD (битый, криво записанный, не для этой платы, убилась microSD).

 

 

Далее через PuTTY подключаемся по протоколу SSH к выясненному ранее IP, первичные логин и пароль зависят от образа ОС и представлены мною в качестве справочного материала в конце данной статьи. Опять же, в зависимости от версии ОС, сразу же после успешного входа система может предложить сменить пароль, а после его изменения приступит к диалогу создания пользовательской учетной записи. В случае с образом «Debian_Server_jessie_PC2_V0_9_1.img» система ничего не предлагает, и в системе уже существует учетная запись пользователя «orangepi» с паролем «orangepi» - под ней и надо авторизовываться. Для учетной записи «root» пароль также «orangepi» - это пригодится для выполнения команд, начинающихся с «sudo».

Перво-наперво надо обновить информацию о программных пакетах и обновить сами пакеты. Одноплатный ПК (сервер) должен иметь доступ к интернету.

sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade

И перезагрузка:

sudo reboot 0

Отмечу, что установка драйверов для RTL-SDR и блокирование запуска ТВ-драйвера одинакова для всех типов задач (RTL-TCP, Spy Server, dump1090, еще чего-то, использующего RTL-SDR), разница начинается с этапа настройки самих программ.

Итак, теперь надо скачать и установить необходимые пакеты компонентов. Но для начала просто проверим, определила ли система, подключенный RTL-SDR в USB-порту хоть как-то. Команда lsusb.

 

 

Строка, содержащая слова «2838 Realtek Semiconductor Corp. RTL2838 DVB-T» говорит, что определила. Олично! Едем далее – ставим libusb-1.0-0-dev и git :

sudo apt-get install libusb-1.0-0-dev

sudo apt-get install git     – в некоторых образах ОС git уже есть и руками его ставить нет необходимости.

 

Установка RTL-SDR:

git clone git://git.osmocom.org/rtl-sdr.git

cd rtl-sdr/

mkdir build

cd build

Надо установить cmake:

sudo apt-get install cmake

А вот эта строка запускает сборку пакета из исходника с ключами, исключающими драйвер ТВ-тюнера (он мешает работе программ, использующих RTL-SDR):

cmake ../ -DINSTALL_UDEV_RULES=ON -DDETACH_KERNEL_DRIVER=ON

make

sudo make install

sudo ldconfig

Установка драйверов закончена. Проверяем успешность этой процедуры:

sudo rtl_test –t

Результатом выполнения команды будет следующая информация, из которой можно понять, что приемник найден и им можно управлять. Если тут нет ошибок, то уже хорошо.

 

Однако, еще нужно запустить просто sudo rtl_test и, если не будет кучи сообщений “lost at least xxxxxx bytes”, то, вероятно, все хорошо. Если есть куча сообщений “lost at least xxxxxx bytes”, то все плохо.

Вот пример ситуации, когда все плохо:

 

 

А вот, когда все хорошо.

 

 

Убеждаемся, что на данном этапе все хорошо, мне вот пришлось перепробовать несколько образов ОС, для достижения такого результата. Теперь можно вручную запустить серверную часть RTL-TCP:

sudo rtl_tcp -a 192.168.3.118 -p 3476

 

 

Как видно, rtl_tcp запущен и ожидает подключений. Сейчас можно, теста ради, подключиться с компьютера или ведроида программами SDR Sharp, SDR Console и SDR Touch, используя адрес 192.168.3.118 и порт 3476.

Убедившись в работоспособности сервера, настало время автоматизировать запуск rtl_tcp.

 

 

 

 

Автозапуск rtl_tcp.

В некоторых образах ОС для одноплатных ПК при старте системы сетевой интерфейс запускается с некоторым запозданием относительно программ в автозагрузке, и отсутствие IP-адреса на сетевом интерфейсе для программ заканчивается невозможностью их старта. Поэтому запускать программы лучше с задержкой. 10-30 секунд вроде бы хватает.

Надо создать файл с именем start_rtl.sh в папке /home/orangepi , например.

Применительно к рассматриваемому образу ОС папка по пути /home/orangepi уже существует и чтобы в нее перейти нужно дать команду cd ~ или cd /home/orangepi , а далее:

sudo touch start_rtl.sh                 -   создать файл с именем start_rtl.sh

sudo nano start_rtl.sh               - открыть его на редактирование в редакторе nano

В теле файла написать такой скрипт, подставив локальный IP-адрес одноплатного ПК :

#!/bin/sh

sleep 10

/usr/local/bin/rtl_tcp -a 192.168.3.118 -p 3476

 

В принципе, вместо /usr/local/bin/rtl_tcp можно писать просто rtl_tcp, т.е. rtl_tcp -a 192.168.3.118 -p 3476

CTRL+O и нажать Enter

CTRL+X

sudo chmod +x start_rtl.sh                 - дать файлу права на исполнение

Ради проверки можно запустить этот скрипт командой sudo ./start_rtl.sh и убедится, что через 10 секунд rtl_tcp запускается.

 

 

sudo nano /etc/rc.local                   - открыть на редактирование файл /etc/rc.local

И дописать следующую строчку до строки exit 0:

sudo /home/orangepi/start_rtl.sh

 

 

CTRL+O и нажать Enter

CTRL+X

Ради проверки (проверки правильности написания пути) можно дать команду sudo /home/orangepi/start_rtl.sh и убедится, что через 10 секунд rtl_tcp запускается.

 

 

Получилась такая схема - в файле rc.local указываем какой файл скрипта запускать при старте системы (start_rtl.sh), а в файле start_rtl.sh указываем какую программу запускать с задержкой в 10 секунд (rtl_tcp).

sudo reboot 0

После перезапуска сервера, ждем 10 секунд, запускаем на нем htop и убеждаемся, что процесс rtl_tcp запущен:

 

 

Теперь можно клиентскими программами (SDR Sharp, SDR Console, SDR Touch(Ведроид), еще какие-то) подключаться к серверу.

 

 

 

 

 

 

 

Справочно-вспомогательные материалы:

Логин и пароль первичного входа к образу «Armbian_5.59_Orangepipc2_Debian_stretch_next_4.14.65.img» - Log in as: root Password: 1234

------------------------------------------------------

Логин и пароль первичного входа к образу «Raspbian_server_For_PC2_H5_V0_1.img» - user(root), password(orangepi)

----------------------------------------------------

Логин и пароль первичного входа к образу «DietPi_v6.0_OPiPC2-ARMv8-Stretch.img» - username: root password: dietpi

----------------------------------------------------

Логин и пароль первичного входа к образу «Debian_Server_jessie_PC2_V0_9_1.img» - user(orangepi), password(orangepi)

--------------------------------------------------------

Возможные ключи запуска rtl_test:

-------------------------------------------------

Возможные ключи запуска rtl_tcp:

--------------------------------------------------------------------------------------

На некоторых дистрибутивах ОС для одноплатных ПК для отключения ТВ-драйвера надо еще давать такую команду с последующей перезагрузкой:

bash -c 'echo -e "\n# for RTL-SDR:\nblacklist dvb_usb_rtl28xxu\n" >> /etc/modprobe.d/blacklist.conf'

-------------------------------------

Для автозапуска rtl_tcp еще есть такой вариант, который ждет получения IP и только тогда запускает rtl_tcp, но он чего-то не во всех ОС работает. Отсюда http://photobyte.org/auto-start-rtl-sdr-server/

sleep 10

_IP=$(hostname -I) || true

if ["$_IP"]; then

   printf"My IP address is %s\n" "$_IP"

   /usr/local/bin/rtl_tcp -a $_IP &

Fi

--------------------------------------------------------------------

Вариант еще проще, тоже не везде работает http://radman.no-ip.ca:96/wordpress/?p=2051

Insert a line in /etc/rc.local and rtl_tcp will autostart on every reboot without need to keep terminal window open.

1. CTRL+ALT+T – this will open terminal window

2. sudo nano /etc/rc.local – with this you will edit that file

3. insert your password if any is use

4. above “exit 0″ insert this line: sudo rtl_tcp -a YOUR local IP where RTL2832u is running

5. CTRL+X

6. Y – to save that file

7. ENTER – to accept changes

Reboot and thats it. Every time you reboot rtl_tcp will run all the time.

------------------------------------------------------------------------------------------------------------

Установка часового пояса -     sudo timedatectl set-timezone Europe/Moscow

----------------------------------------------------------------------------------

Чтобы не было сообщения "sudo: unable to resolve host server", надо в /etc/hosts добавить строку 127.0.1.1 и указать доменное имя компа.

127.0.1.1       доменное_имя_компа

-------------------------------------------------------------------------------------------

Доменное имя компа меняется в файлах /etc/hostname и /etc/hosts

-------------------------------------------------------------------------------------------------

Добавить юзера

sudo useradd -p password -s /bin/bash имя юзера

---------------------------------------------------------------------------

Группа должна у нового юзера быть sudo, чтобы сменить группу надо -              usermod -a -G sudo имя_юзера

---------------------------------------------------------------

Нужно создать папку юзера в /home/имя_юзера, т.к. иногда при ручном создании юзера папка не создается - sudo mkdir /home/имя_юзера  

-------------------------------------------------------------------

Сменить пароль юзеру -                       sudo passwd имя_юзера

---------------------------------------------------------------------------------------

Если надо удалить прогу, установленную из иходников, то make uninstall делается в той же папке, где делалось make

------------------------------------------------------------------------------------------

Если lsusb не работает, то надо -         sudo apt-get install usbutils

--------------------------------------------------------------

Узнать версию и название дистрибутива ОС -       cat /etc/*-release

---------------------------------------------------------------

Узнать версию ядра Linux -                 uname -a    или   uname –r

------------------------------------------------------------------

Просмотреть содержимое текущей директории -     ls –lh

-------------------------------------------------------------------

Узнать в какой директории вы сейчас работаете -               pwd