Содержание статьи
Итак, мы разобрались в самых азах SDR, давай перейдем к более интересным вещам. С помощью HackRF ты сможешь не только анализировать более широкий диапазон сигналов, но и взаимодействовать с радиоустройствами. В общем, абсолютно полноценный SDR-трансивер за вполне вменяемые деньги.
Откуда у нас HackRF
Так получилось, что после прошлогоднего ZeroNights я посетил московский Hackspace Neuron и ушел оттуда не с пустыми руками, а с кодом на бету HackRF под честное слово, что девайс не будет пылиться на полке. Дальше было долгое ожидание старта бета-программы. И вот спустя без малого год обычной почтой прибыл долгожданный HackRF Jawbreaker. Большое спасибо Майклу Оссману (Michael Ossmann) за разработанный девайс и Александру Чемерису из Fairwaves за предоставленную возможность поучаствовать в программе бета-тестирования. Примечательно, что, судя по надписи на борту, плата была изготовлена в декабре 2012 года.
Обрезание
Итак, посылка вскрыта, фото сделано, приступим к делу. HackRF поставляется с плохонькой встроенной антенной на ~900 МГц. При этом, несмотря на наличие уже распаянного SMA-разъема, просто подключить внешнюю антенну не получится, сигнал все равно будет браться с изогнутой дорожки с краю платы.
Хакер #177. Радиохакинг: что такое SDR?
Чтобы задействовать желанный антенный разъем, необходимо отключить встроенную антенну. Для этого придется проделать небольшую хирургическую операцию, а именно разорвать одну токопроводящую дорожку. На плате место препарирования предусмотрительно отмечено стрелочкой, и на место будущего разрыва нанесена капля припоя, которую лучше предварительно удалить паяльником. После этого, вооружившись чем-нибудь тонким и острым, нужно разрезать (разорвать) токопроводящую дорожку. Осторожно, поблизости расположено несколько элементов, которые с платы удалять нежелательно, так что будь аккуратен :).
Перед тем как брать в руки скальпель, рекомендуем просмотреть инструкцию.
Софт
После успешного обрезания HackRF готов к подключению внешней антенны. Форма, размеры и конструкция созданных впоследствии антенн чрезвычайно разнообразны и зависят от рабочей длины волны и назначения антенны. Если под рукой не оказалось подходящей антенны с SMA-разъемом (как в нашем случае), можно обойтись парой метров медного провода, извлеченного из сетевого кабеля пятой категории aka «витая пара». Достаточно воткнуть один конец в центр антенного разъема на плате (не замкнув при этом на землю), а второй подвесить, например, к люстре. Нам же для начала вполне подойдет кусок провода подлиннее, легко выдираемый из любого сетевого кабеля. Вставляем провод в SMA-разъем, подключаем HackRF по USB к компу, и можно приступать к установке/настройке софтовой части.
Для экспериментов с радио вообще и HackRF в частности пригодны Linux и более-менее OS X. Про Windows по большей части можно забыть, так как под ней ничего, кроме SDR# и HDSDR, не работает.
Самый простой путь получить весь нужный софт в работающем виде — это воспользоваться уже готовым дистрибутивом RTL-SDR/HackRF Live DVD. Также буквально во время написания этой статьи вышел Kali Linux 1.05 с поддержкой RTL-SDR.
Для установки SDR утилит в Kali требуется выполнить следующие команды:
apt-get update
apt-get dist-upgrade
apt-get install kali-linux-sdr
Пользователи OS X могут найти готовые формулы для Homebrew для большинства необходимого софта и собрать все ручками под себя. Однако без понимания и работы напильником не обойтись.
Для начала работы с HackRF потребуется следующий софт:
- hackrf-tools — комплект утилит для работы с самим девайсом от производителя;
- osmosdr — библиотека для работы с различными SDR;
- gnuradio — суперкомбайн для всего и вся, стандарт де=факто;
- gqrx — анализатор спектра + просто радиоприемник на основе Qt + GNU Radio;
- baudline — отображение принятого сигнала.
В только что распакованном девайсе, скорее всего, будет уже устаревшая прошивка, безнадежно отставшая от софта, предназначенного для работы с ним, что в итоге повлечет за собой массу проблем. Прокладываем себе путь, огибая грабли, и обновляем прошивку. Актуальную фирмварь всегда можно скачать из официального репозитория в виде сорцов и собрать самостоятельно или же в бинарном виде.
В итоге интересующий нас файл — firmware-bin/hackrf_usb_rom_to_ram.bin. Берем его и прошиваем в недра Jawbreaker’а:
sdr:~ 090h$ hackrf_spiflash -w hackrf_usb_rom_to_ram.bin
После чего для проверки работоспособности HackRF и корректности подключения опросим устройство стандартной утилитой из комплекта hackrf-tools:
sdr:~ 090h$ hackrf_info
Found HackRF board.
Board ID Number: 1 (Jawbreaker)
Firmware Version: 2013.07.1
Part ID Number: 0xbc6b4753 0xbc6b4753
Serial Number: 0x00000000 0x00000000 0x066062c8 0x39196f87
Упражнение 1. Быстрый старт
Долго думать над применением девайса не придется, эфир в наше время буквально кишит различной информацией. Простейший способ ее оттуда достать — упомянутый программный приемник gqrx. А первым приходит в голову, что можно принять с помощью радио, как ни удивительно, — радио! Обычное вещание твоей любимой радиостанции с использованием частотной модуляции (FM).
Запускаем gqrx, выбираем HackRF Jawbreaker в качестве устройства, оставив остальные пункты по умолчанию.
Остается только нажать на кнопку старта приема и лицезреть визуализацию радиоэфира. Ползущая водопадом вниз спектрограмма наглядно дает понять, на каких частотах ведется вещание, яркость полос соответствует интенсивности сигнала. Далее устанавливаем нужную частоту, демодулятор типа Wide FM, и вуаля, из аудиовыхода уже слышны осмысленные звуки.
Ура, у нас фм-тюнер за 300 баксов! Но это даже не вершина айсберга возможностей, которые открываются перед нами, ведь можно не только принимать, но и передавать! Но с чего начать?
Упражнение 2. Нюхаем и запоминаем
В качестве подопытного возьмем бытовой беспроводной звонок. Данное устройство состоит из двух частей: передатчика с кнопкой звонка и приемника с мерзким динамиком-пищалкой. При нажатии кнопки звонка происходит передача данных (уникальных для каждой пары приемник/передатчик) «в цифре» на частоте 433,92 МГц, если верить инструкции. Наша задача отснифать сигнал передатчика и научиться повторять, чтобы можно было звонить соседу в дверь удаленно.
Для начала определимся с частотой и проверим наличие сигнала при помощи gqrx.
Как видно из картинки выше, при отправке сигнала четко заметен небольшой «всплеск», оставляющий на спектрограмме ярко-красный след. Итак, данные передаются, теперь запишем их в файл командой
zlive@zlive:~$ hackrf_transfer -r bell1 -f 433000000 -b 1750000 -s 16000000 -a 1
Как ты помнишь, работает наша игрушка в Half-duplex режиме, так что флаг -r явно указывает, что же нужно делать, а bell1 — в нашем случае имя файла, куда в итоге попадет дамп эфира. Ключом -f задается частота в герцах, в этих же единицах указываются ширина записываемой полосы (-b) и частота дискретизации сигнала (-s). Ключ -a отвечает за использование встроенного усилителя.
Запустив снифер, «звоним в звонок». Количество данных, получаемых из АЦП при сэмплировании на 16 МГц, достаточно велико, и лишние минуты работы снифера могут вылиться в гигабайтные дампы, 99,9% которых — бесполезный шум, наследие бесконечного космоса. Сейчас же нас интересуют земные сигналы, а именно что же передала кнопка звонку.
Лучший способ ознакомиться с полученной информацией — использовать спектроанализатор. Тут нам на помощь придет старенькая, но до сих пор незаменимая программа baudline. Подгружаем наш файл в raw-режиме, вручную выставляя параметры интерпретации (см. рисунок), иначе чуда не произойдет.
WARNING
Также следует учесть, что baudline имеет дурное свойство падать при открытии больших файлов, так что если ты пишешь длительный по времени радиообмен, то следует воспользоваться командой dd и порезать полученный файл на кусочки. Например, так:
zlive@zlive:~$ dd if=foo.iq of=trimmed.iq bs=1M count=50
Спектроанализатор визуализирует эфир наподобие того, что мы уже видели в gqrx (точнее, все наоборот), но обладает богатым функционалом, позволяющим, в частности, нам скроллить и зуммить как захочется. Присмотревшись, среди шумов можно обнаружить явный сигнал.
Что ж, раз сигнал есть, попробуем его воспроизвести в эфир.
Упражнение 3. Собственно реплей
При помощи все той же утилиты hackrf_transfer производится и передача в эфир, по большому счету отличие лишь в флаге -t вместо -r, намекающем на TX.
zlive@zlive:~$ hackrf_transfer -t bell1 -f 433000000 -b 1750000 -s 16000000 -a 1
Просто, не правда ли? Слишком просто! Жаль, что на данный момент hackrf_transfer опять поломали в части отправки. Поэтому для проигрывания записанного дампа будем использовать исключительный Инструмент с большой буквы И — GNU Radio.
Для нашей цели источником сигнала будет файл дампа, который мы только что инспектировали при помощи baudline. Для его подгрузки просто добавляем блок File Source и в его свойствах указываем путь до файла. Следует обратить внимание на то, что каждая точка соединения имеет свой тип (на самом деле это тип данных Python) и цвет. Наш первый блок будет отдавать данные типа Byte, что, впрочем, неудивительно для ресурса-файла.
Большинство блоков GNU Radio заточены под обработку данных, представленных в векторном виде, поэтому прежде, чем что-либо делать дальше, требуется «приведение типов». Сделаем это преобразование в два шага: UChar -> Float, Float -> Complex, предварительно произведя деинтерливинг (расчленение потока на действительную и мнимую составляющие). Делается это не сложнее добавления источника — перетаскиваем нужные блоки и соединяем.
Следующий блок в цепочке (Add Const) также требуется для приведения данных из нашего радио к виду, пригодному для дальнейшей работы, а именно для выравнивания сигнала относительно нулевого уровня сложением с вектором-константой. Теперь наши данные выглядят и имеют формат по всем правилам GR, и можно отправить их прямо в блок вывода (osmocom Sink).
Osmocom Sink как раз реализует прослойку между GR и множеством различных ресиверов и трансмиттеров, и HackRF в их числе. Sink-блок для нашего случая обладает практически теми же параметрами, что и hackrf-transmit. Для более удобного изменения частоты передачи и частоты дискретизации в дальнейшем, создадим переменные (вытащим из списка пару блоков Variable), назовем их freq и samp_rate и зададим соответствующие значения: 433 МГц и 16 МГц. Ведь с какими параметрами записывали, с такими и надо отдавать. При конфигурации блока вывода в соответствующих полях укажем не значения, а имена переменных. Так, при определении свойств блоков в полях можно указывать не только константы, но и переменные и даже целые выражения, что, по сути, дает огромные возможности.
Итак, преобразование данных описано, свойства блока вывода соответствуют исходным условиям, время запустить эту шарманку! По аналогии с IDE разработки, кликаем на кнопку компиляции, в результате получаем проект, собранный в виде Python-скрипта, пригодного для запуска отдельно от gnuradio-companion.
zlive@zlive:~$ ./top_block.py
linux; GNU C++ version 4.6.3; Boost_104800; UHD_003.005.003-87-g8f4000ff
gr-osmosdr v0.0.2-1-gffd2bbf4 (0.0.3git) gnuradio 3.6.5
built-in sink types: uhd hackrf
Using Jawbreaker with firmware 2013.07.1
Using Volk machine: avx_64_mmx_orc
...Пространство разрывает звук китайской псевдополифонии. Так что теперь можно зазвонить соседей ровно до того момента, пока они не вытащат батарейки из своего звонка. Использование направленной антенны приветствуется.
Итого
HackRF отлично вписывается в нишу бюджетных приемопередатчиков, да и само комьюнити SDR бурлит и развивается, выходят дешевые гаджеты, пишется софт, жизнь удалась. Уже есть проекты для работы со спутниками, ADS-B, GSM, LTE, Bluetooth, а то, чего еще не придумали, ты можешь реализовать сам в GNU Radio.