В этой заметке речь пойдет о Software Defined Radio, или SDR. SDR — это когда у вас есть некое специальное устройство для работы с радио-сигналами, подключенное к компьютеру, а софт на компьютере определяет, что именно это устройство будет принимать и передавать. В сущности, SDR — это отладчик для радио. С его помощью вы можете как отлаживать собственное железо, так и искать баги / уязвимости в чужом, а также реверсить закрытые беспроводные протоколы и притворяться приемником или передатчиком, работающим по определенному протоколу.

Почему LimeSDR?

Так вот, упомянутых «устройств для работы с радио-сигналами» существует уже немало. Естественно, все они отличаются по цене и характеристикам.

Самым дешевым решением, пожалуй, является RTL-SDR . Различные его модификации стоят от 7$ до 30$ (я бы советовал версию в алюминиевом корпусе с SMA-разъемом ), умеет работать на частоте от 24 МГц до 1766 МГц, имеет 8-и битный АЦП, частоту дискретизации 3.2 MS/s, полоса пропускания составляет 2.4 МГц. При этом устройство работает только как приемник. По этой причине, а также потому что многие интересные сигналы передаются за пределами поддерживаемых частот, RTL-SDR подходит для ограниченного круга задач. Устройство основано на тюнере R820T2 .

В качестве достаточно дорогого и подходящего для большинства практических задач устройства можно назвать USRP B200. USRP работает на частоте от 70 МГц до 6 ГГц, имеет 12-и битный АЦП, частоту дискретизации 61.44 MS/s и полосу пропускания 56 МГц. Может принимать и передавать сигнал в полнодуплексном режиме. Цена устройства на eBay составляет 600$. Также существует модификация USRP B210, позволяющая принимать и передавать в полнодуплексном режиме сразу два сигнала. То есть, в сущности, это как два USRP B200 в одном устройстве, и цена соответствующая.

Очень интересным в плане отношения цена/качество является LimeSDR :

Фотография LimeSDR

Устройство стоит 300$, позволяет работать с частотами от 100 КГц до 3.8 ГГц, имеет 12-и битный АЦП, частоту дискретизации 61.44 MS/s и полосу пропускания 61 МГц, может принимать и передавать сигнал в полнодуплесном режиме. То есть, LimeSDR позволяет работать с большинством интересных частот (Bluetooth, GSM, 3G, 4G, GPS, ZigBee, LoRa, …), за исключением разве что 5.8 ГГц. Но это не такая уж большая потеря, если на первых порах вы не собираетесь ковырять Wi-Fi или какие-нибудь беспроводные передатчики видеосигнала. Притом, что Wi-Fi можно поковырять и на 2.4 ГГц.

Дополнение: 14 сентября 2017 запустилась кампания по сбору средств на производство LimeSDR Mini , аналогичного устройства ценой всего 139$, или даже 99$ для первых покупателей. Основные отличия заключаются в меньшем числе каналов (по одному RX и TX, а не по два), вдвое меньших полосе пропускания и частоте дискретизации (30 МГц и 30.72 MS/s соответственно), а также чуть более узким диапазоном поддерживаемых частот (10 МГц − 3.5 ГГц вместо 100 КГц − 3.8 ГГц), и, конечно же, компактности устройства. Также вместо крохотных u.FL разъемов используются традиционные SMA. Субъективно, LimeSDR Mini является куда более привлекательным устройством начального уровня, чем оригинальный LimeSDR.

Дополнение: 19 октября 2017 была анонсирована плата расширения на базе LMS8001 , расширяющая диапазон частот LimeSDR или LimeSDR Mini до 10 ГГц. Цена устройства составляет 299$ плюс 15$ за доставку. Интересно, что LimeSDR с такой платой расширения по возможностям сравним с USRP B210, только в два раза дешевле.

Стоит отметить, что существуют и другие железки. В частности, большой популярностью пользуются HackRF One и BladeRF. Более подробный обзор существующих SDR можно найти в статье Roundup of Software Defined Radios на сайте rtl-sdr.com.

Fun fact! Если LimeSDR не укладывается в ваш бюджет, вы можете повторить все инструкции из этой заметки и для другого SDR, в частности, для RTL-SDR, с минимальными изменениями. Для RTL-SDR повторить их будет даже несколько проще, так как весь упомянутый софт работает с ним из коробки, без компиляции самых последних версий из исходников, и так далее.

Настройка окружения

Для взаимодействия с LimeSDR нам понадобится специализированный софт, такой, как Gqrx и GNU Radio (см далее). К сожалению, из коробки они так просто не будут работать с LimeSDR. Информацию о том, как это исправить, пришлось собирать буквально по крупицам. В ретроспективе могу сказать, что все свелось к установке наиболее свежих версий следующих пакетов:

  • SoapySDR — представляет открытый обобщенный API на C/C++ для взаимодействия с SDR устройствами;
  • LimeSuite — драйвер и GUI для SDR-платформ на базе LMS7002M (LimeSDR, Novena RF7, и т.д.);
  • gr-osmosdr — источник (source) и сток (sink) OsmoSDR-совместимых устройств для GNU Radio;
  • Gqrx — софтверный приемник для RTL-SDR, USRP и OsmoSDR-совместимых устройств;

В Arch Linux все эти пакеты доступны на AUR и называются soapysdr-git, limesuite-git, gr-osmosdr-git и gqrx-git соответственно. Поскольку эти пакеты в свою очередь имеют зависимости, также из AUR, для их установки не лишено смысла воспользоваться утилитой yaourt или аналогичной, как описано в заметке Управление пакетами в Arch Linux с помощью ABS и pacman . Также был установлен GNU Radio, но в виде штатного бинарного пакета, а не из исходников.

Все названные пакеты ставятся без особых сложностей, если не считать gr-osmosdr-git. Мне пришлось слегка подправить файл PKGBUILD, добавив в аргументы CMake :

cmake -DENABLE_RTL=OFF -DENABLE_RTL_TCP=OFF …

Без этого изменения пакет никак не компилировался:

rtl_source_c.cc:224:9: error: ‘rtlsdr_set_bias_tee’ was not declared
in this scope

После установки пакетов подключаем к компьютеру LimeSDR и запускаем LimeSuiteGUI. Идем в Options → Connection Settings → Connect. Затем идем в Modules → Device Info, жмем Get Info. Если информация об устройстве успешно читается, это хороший знак. При помощи LimeSuiteGUI вы можете произвести проверку LimeSDR , а также обновить прошивку устройства. Крайне рекомендую сделать это сразу, чтобы потом не ловить непонятные ошибки просто из-за старой версии прошивки.

Стоит отметить, что есть и другие интересные связанные с SDR утилиты и пакеты, например sdrangel , rx_tools , inspectrum , urh , qspectrumanalyzer и baudline . Кроме того, иногда используют и Audacity , который изначально вообще предназначен для обработки звука. Но рассмотрение этих инструментов уже выходит за рамки данной статьи.

Знакомство с Gqrx

Проверим, что Gqrx нормально работает с LimeSDR. Проще всего это сделать, попытавшись поймать обычное ФМ-радио .

Но сначала нам понадобится антенна. Антенны к LimeSDR подключается через так называемые u.FL разъемы. Для высокочастотного сигнала (выше 1.5 ГГц) антенну нужно подключить к разъему RX1_H, для низкочастотного — к RX1_L. Для приема ФМ-радио в городских условиях вполне подойдет антенна от GSM-модуля Neoway M590 , которая как раз имеет нужный разъем. Впрочем, при использовании такой антенны сигнал будет заметно ослаблен. Лучше подойдет обычный проводок длиной около 15 см.

Разобравшись с антенной, настраиваем Gqrx следующим образом:

Настройки Gqrx

Окно Configure I/O Devices, на скриншоте изображенное слева, можно найти в меню File → I/O Devices. Вкладка Input Controls, изображенная справа, находится в правой верхней части интерфейса Gqrx.

Если все было сделано правильно, вы сможете поймать на Gqrx ФМ-радио и слышать его в ваших наушниках или колонках (кликабельно, PNG, 697 Кб):

Интерфейс Gqrx

Убедитесь, что Receiver Options у вас выставлены такие же, как в правой части скриншота. В данном примере я поймал радиостанцию 95.2 FM ( Rock FM ). В вашим городе могут быть другие радиостанции, так что частоту придется подобрать. По так называемому водопаду (waterfall) или спектрограмме (она же сонограмма) в левой нижней части интерфейса легко определить, на каких частотах есть сигнал (желтый цвет), а на каких его нет (синий цвет).

Знакомство с GNU Radio

Еще одним популярным инструментом в мире SDR является GNU Radio. Интересно, что GNU Radio предназначен для каких-то манипуляций не только с радио сигналами, а с сигналами вообще. Например, при желании с помощью GNU Radio можно обрабатывать звук.

Пример ФМ-приемника на GNU Radio был нагуглен здесь . После пары небольших изменений у меня получилась такая схема (кликабельно, PNG, 188 Кб):

Интерфейс GNU Radio

Кстати, программа на скриншоте называется gnuradio-companion. Если все было сделано правильно, то после нажатия F6 (или Run → Execute) вы увидите:

Прием ФМ-радиостанций в GNU Radio

… а также услышите звук радиостанции 92.0 FM ( Москва FM ) в наушниках или колонках.

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

Заключение

В этой заметке мы настроили окружение для работы с LimeSDR, убедившись, что все хорошо как на железной, так и на софтовой стороне. Увы, статья и так уже получилась достаточно длинной. Поэтому, примеры приема, декодирования и передачи чего-то более интересного, чем ФМ-радио, будут рассмотрены в будущих статьях. К счастью, статей и видео на YouTube по данной теме и так существует уже немало, и теперь у вас есть все необходимое, чтобы разобраться в них самостоятельно.

Немного ссылок по теме.

Где купить:

Тематические блоги:

Где попросить помощи:

Видео-туториалы:

Дополнение: Тонкости приема сигналов ниже 30 МГц (короткие и средние волны) при помощи LimeSDR описаны в статье Самодельный апконвертер на 40 МГц . Еще в продолжение темы «Что такое SDR?» вас может заинтересовать статья Шпаргалка по работе DSP фильтров . См также другие мои посты с меткой «SDR» .

EnglishRussianUkrainian