Проект HackRF появился на Kickstarter, и я решил написать небольшую статью об области применения этой программно-определяемой радиосистемы (Software Defined Radio, SDR).
Проект HackRF появился на Kickstarter, и я решил написать небольшую статью об области применения этой программно-определяемой радиосистемы (Software Defined Radio, SDR).
Я давно хотел поиграться с моими брелоками от автомобилей (в основном из праздного любопытства). Подобные устройства, генерирующие довольно чистый сигнал, имеются практически у каждого. В своих экспериментах я использовал брелок от Субару и Киа (машина моего друга). Оба этих брелока используют различный механизм кодирования сигнала, так что мои эксперименты ожидались весьма интересными.
Помимо чисто теоретического интереса, результаты эксперимента не будут столь полезны, поскольку все подобные устройства используют непрерывно изменяющийся код, и полученная последовательность, которая разблокирует автомобиль, может быть использована лишь однажды. Хотя, конечно, я не могу утверждать на сто процентов, что все такие радиопередатчики реализованы именно подобный образом. Короче говоря, это такая тема, которую необходимо исследовать более глубоко.
В начале эксперимента я начал выяснять, на каких частотах работают брелоки. Оказалось, что брелок для Киа работает на частоте 315 МГц, а брелок для Тойоты и Субару на частоте 433.847 МГц (по крайней мере, на многих моделях).
Теперь, когда мы узнали рабочие частоты, что же дальше? Для начала я запустил GQRX (софт для работы с системами SDR) для того, чтобы получить общее представление о физических процессах, происходящих во время передачи данных. Приношу свои извинения за то, что не могу опубликовать актуальный скриншот, и ниже привожу образец амплитудно-модулированного сигнала.
Теперь, когда мы примерно понимаем, что происходит, произведем запись передаваемой информации. Наиболее быстрый способ сделать это - hackrf_transfer:
$ hackrf_transfer -r Kia-312MHz-8M-8bit.iq -f 312000000 -s 8000000
Обратите внимание, что мы записываем данные не на центральной частоте (315МГц), а чуть смещенной от нее. Так как мы перехватываем полосу в 8 МГц, то, по сути, получаем сам сигнал, однако делая небольшой сдвиг, мы избегаем смешения постоянной составляющей, которая является причиной пика в центре диапазона настройки HackRF. Последние версии прошивок позволяют практически полностью сгладить этот пик, однако мы может избавиться от него полностью.
Дадим утилите hackrf_transfer поработать какое то время, параллельно несколько раз нажимая на кнопку блокировки (или разблокировки) на брелоке. Через несколько секунд нажмите ctlr-c для того, чтобы остановить захват сигнала.
Я рекомендую именовать файлы внимательно: полученные данные представляют собой сырые синфазно-квадратурные выборки и не содержат какую-либо информацию о ширине выборки (в нашем случае 8 МГц), центральной частоте (312 МГц) и схеме кодирования (для HackRF все выборки 8-битные). Так что лучше именовать файлы правильно с самого начала.
Теперь у нас есть большой файл данных. Что мы можем с ним сделать? Есть одна хорошая утилита под названием baudline (http://www.baudline.com/download.html). К сожалению, условия лицензии не позволяют включать эту утилиту в дистрибутив, поэтому вам необходимо скачать ее самостоятельно.
У baudline существуют парочка не совсем приятных фитч. Во-первых, baudline плохо обрабатывает большие файлы (более 50 Мб). Во-вторых, для каждого входного файла baudline запускает команду «file» (которая определяет тип файла), что заметно замедляет работу. Для устранения этого недочета нужно изменить переменную окружения $PATH перед запуском baudline. Мой скрипт запуска baudline выглядит так:
#!/bin/sh
export PATH=~/bin/disable:$PATH
baudline
Внутри каталога ~/bin/disable/ находится простейший скрипт с именем «file», который выглядит так:
#!/bin/sh
exit 0
Теперь нам необходимо раздробить полученный файл на куски по 50 Мб. Для этого будем использовать утилиту «dd». Следующая команда откусывает первые 50 Мб от нашего файла:
$ dd if=foo.iq of=trimmed.iq bs=1M count=50
Разбиваем файл на блоки по 50 Мб:
$ dd if=foo.iq of=trimmed.iq bs=1M count=50 skip=50
Для объединения полученных блоков обратно в исходный файл можно использовать утилиту «split».
Теперь открываем первый кусок файла в baudline. Щелкните правой кнопкой мыши «input->open file...», затем выберите файл и установите формат «raw» вместо «auto detect». Перед вами появится следующее окно:
Настройки, на которые следует обратить внимание:
Sample rate: выбираем custom и выставляем значение 8000000 (поскольку мы получали выборку шириной в 8 МГц). Если ширина выборки другая, например, 20 МГц, выставляйте значение 20000000.
Channels: выставляем значение 2, поскольку hackrf записывает синфазные и квадратурные данные. Далее отметьте флажки "quadrature" и "flip complex" (последний флажок необходим потому, что HackRF пишет в формат отличный от формата baudline).
Decode Format: поскольку HackRF пишет беззнаковые 8-ми битные выборки, выбирайте "8 bit linear (unsigned)".
После установки необходимых параметров получаем следующую картину:
Мы получили изображение нашего сигнала. На этом скриншоте показан сигнал, снятый с брелока Субару (амплитудная модуляция), по сути, это азбука Морзе (передавать или не передавать).
При передаче сигнала, снятого с брелока Киа, используется частотная модуляция. Увеличенное изображение показано ниже:
Что мы видим на это скриншоте? После включения передатчика посылается комбинация сигналов с нулевой и ненулевой амплитудой, по сути, последовательность битов '101010101010'. Теперь вернемся к скриншоту сигнала от брелока Субару. Здесь также вначале посылается последовательность '1010101010'. Первоначальная последовательность говорит приемнику о том, что далее будут переданы основные данные, а также помогает нам выяснить длину цикла для сигналов с нулевой и ненулевой амплитудой.
Листая далее картинку частотно модулированного сигнала с брелока Киа, мы видим начало передачи основных данных:
На скриншоте выше показана последовательность, которая посылается для разблокировки автомобиля.
В baudline можно выделить нужный диапазон и сохранить его в отдельный файл:
Щелкните правой кнопкой мыши на выделенном диапазоне и далее выберите "output->export selection as..."
Будьте внимательны, во время экспорта файла baudline изменяет его формат. Это повлияет на загрузку файла в будущем и любой код gnuradio, который вы мастерите для последующей обработки файла. Более надежный вариант – использовать «dd» для обрезания файла (немного поэкспериментируйте, чтобы подобрать нужный размер) и его загрузка в baudline.
Для повторного открытия файла, сохраненного в baudline, используйте следующие настройки:
При повторном открытии изменился формат декодирования (вместо 8-битного стал 16-битный), а также снят флажок «flip complex».
В следующей статье я попробую загрузить файл с выборкой в Gnuradio-Companion и сразу же извлечь битовый поток амплитудной модуляции.
Живой, мертвый или в суперпозиции? Узнайте в нашем канале