Gnu radio windows 10 не сохраняет проект

Обновлено: 02.07.2024

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

Недавно я окунулся в мир SDR (программно-определяемого радио) и в процессе многому научился. Я выяснил, что могу не только эмулировать радиосигналы посредством применения различных программных средств и приложений (например, SDR Sharp, GQRX, SIGINTOS, CubicSDR, ПО, поддерживающее RTL-SDR, и т.д.), но и использовать схемы GNU Radio, такие как ‘grgsm_livemon.grc’, для захвата пакетов мобильной сети GSM в реальном времени.

Каким бы информативным и образовательным ни был этот проект, мне бы хотелось подробнее разобраться в схемах GNU Radio. Также хочется изучить основы создания таких схем, а не просто полагаться на чьи-то чужие примеры, до конца не понимая, как они работают.

Несмотря на то, что в сети можно найти довольно много документации, GNU Radio (и в частности - GNURADIO-COMPANION) может представлять трудность и пугать юзеров при первом обращении. Немного поискав в Google, я в конце концов наткнулся на

Вам необходимо зрегистрироваться для просмотра ссылок и, стоит сказать, что они мне здорово помогли. Кроме того, Вам необходимо зрегистрироваться для просмотра ссылок

помогли закрепить свежие знания.

Чтобы познакомиться с основами GNU Radio, я выбрал проект, который мог быть использован для рассмотрения атак методом повторения радиосигнала (обнаружение, захват и воспроизведение необработанного радиочастотного сигнала и разблокировки моего Ford Mountaineer 1999 г. путем обхода частотно-регулируемой кнопки (FOB).

Вам необходимо зрегистрироваться для просмотра изображений Вам необходимо зрегистрироваться для просмотра изображений

Нужно заранее сказать, что, хотя я и смог захватить сигнал разблокировки с FOB и воспроизвести его (с помощью HackRF), автомобиль я не открыл. Дело в том, что много лет назад были внесены изменения с целью предотвращения упомянутых атак методом повторения радиосигнала. Использовалась техника непрерывно изменяющегося кода (иногда называется «псевдослучайный код»).

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

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

    Вам необходимо зрегистрироваться для просмотра ссылок

    Чтобы определить рабочую частоту моего FOB, я нашел номер FCC, который ассоциирован с моим брелоком. После поиска в Google, а затем поиска FCC, я получил следующую информацию:

    Вам необходимо зрегистрироваться для просмотра изображений

    Результатом поиска по FCC была рабочая частота:

    Вам необходимо зрегистрироваться для просмотра изображений

    Вооружившись данными о рабочей частоте моего устройства (315 МГц), я посчитал, что пора сделать попытку захвата сигнала «разблокировки автомобиля». В стандартной ситуации я мог бы использовать одно из многих доступных приложений (SDR Sharp и т.д.) для его отслеживания и захвата необработанных данных. Однако в данном случае я хотел самостоятельно создать схему GNU Radio.

    Я перешел в директорию моих проектов и вызвал следующую команду:

    После загрузки gnuradio-companion, я создал новую схему:

    Вам необходимо зрегистрироваться для просмотра изображений

    Обратите внимание, что новая схема открывается уже с двумя блоками - «Опции» и «Переменная». «Опции» (ID: top_block) определяют библиотеку цепочки инструментов, которую мы будем использовать: QT-GUI, WX-GUI, none, блок иерархии (hier block) и т.д. А блок «Переменной» (ID: samp_rate) создан для выбора частоты дискретизации нашего сигнала, по умолчанию – 32 ksps (32 тысяч выборок в секунду).

    Примечание: Щелкните правой кнопкой мыши по любому блоку, чтобы отобразить его свойства и сменить параметры.

    Вам необходимо зрегистрироваться для просмотра изображений

    Я буду использовать HackRF (с блоком osmocom). Рекомендуемая минимальная частота дискретизации при использовании HackRF составляет 2M выборок в секунду. Выберем источник osmocom, найдя и дважды кликнув по нему в списке.

    Вам необходимо зрегистрироваться для просмотра изображений

    На данном этапе, если бы мне захотелось изменить переменную частоты дискретизации с 32k (32e3) (по умолчанию) на 2M (2e6), я бы мог это сделать. Любой блок схемы, содержащий переменную ‘samp_rate’ теперь будет использовать новое (скорректированное) значение.

    Также было бы очень полезно иметь переменную для центральной частоты 315 МГц (315e6). Этого легко добиться, скопировав и вставив блок переменных samp_rate и присвоив новому блоку переменных имя center_freq.

    Вам необходимо зрегистрироваться для просмотра изображений

    Теперь можно щелкнуть правой кнопкой мыши по блоку источника osmocom и сменить частоту канала CH0, заданную по умолчанию (100e6), чтобы она стала переменной «center_freq». Моя схема теперь выглядит так:

    Вам необходимо зрегистрироваться для просмотра изображений

    Обратите внимание, что за значениями двух переменных «samp_rate» и «center_freq» теперь следует блок источника osmocom. Определенные переменные очень удобны, поскольку размер схем увеличивается и становится сложнее для понимания.

    Наконец, обратите внимание, что источник (ID) osmocom подсвечен красными буквами. GNU Radio использует этот цвет для обозначения ошибки в схеме. В этом случае ошибка относится к блоку Source, у которого отсутствует выходное соединение. Это можно обойти, если добавить выходной (приемный) блок и соединить два блока вместе.
    Создание приемника сигнала (Sink):

    Для завершения создания «предварительной» схемы, мне нужно добавить блок FFT Sink, чтобы можно было отслеживать активность сигнала и гарантировать, что все работает, как ожидалось. Этого можно добиться, выбрав блок QT-GUI Frequency Sink в разделе Инструменты (Instrumentation). Нужно открыть окно свойств и указать переменную center_freq в качестве параметра центральной частоты. Кроме того, необходимо подключить вывод источника osmocom к вводу QT-GUI Frequency Sink.

    Вам необходимо зрегистрироваться для просмотра изображений

    Чтобы запустить схему, надо нажать на кнопку «Execute».

    Примечание: Чтобы остановить процесс, нажмите на красный “X” справа от зеленой кнопки Execute.

    Вам необходимо зрегистрироваться для просмотра изображений

    Должно открыться окно FFT с изображением сигнала 315 МГц, полученного с HackRF.

    Вам необходимо зрегистрироваться для просмотра изображений

    В данной точке я вижу, что схема дискретизирует полосу пропускания 2 МГц с центральной частотой 315 МГц. Пока что она работает, как ожидалось.

    Далее предположим, что я бы хотел иметь возможность нажать на кнопку разблокировки брелока FOB и отобразить результирующий сигнал. Это можно сделать с помощью той же схемы, но сначала нужно открыть уже запущенное окно FFT и нажать на среднюю кнопку мыши. Откроется выпадающее меню, где можно выбрать опцию ‘Max Hold’. Данная функция позволяет вывести любой сигнал выше, чем текущий отображаемый.

    Выполнение моей схемы с опцией Max Hold приводит к следующим результатам при нажатии на кнопку брелока:

    Вам необходимо зрегистрироваться для просмотра изображений

    Захват сигнала разблокировки FOB для последующего воспроизведения:

    Чтобы захватить результирующий сигнал, сгенерированный FOB, и сохранить его в файл, мне нужно включить в мою потоковую схему еще один блок Sink (вывод). Данный новый блок можно найти в разделе операторов (File Operators) под названием File Sink. Нажатием правой кнопки мыши нужно вызвать окно со свойствами и ввести имя файла для захваченных необработанных данных. Название файла - ‘fob_capture’.

    Вам необходимо зрегистрироваться для просмотра изображений

    Примечание: Записанные файлы могут занимать много памяти, поскольку мы будем заниматься дискретизацией 2-х миллионов выборок в секунду с использованием представления с плавающей запятой. По этой причине я запущу схему, нажму кнопку FOB, а затем как можно быстрее остановлю ее.

    Измененная схема теперь выглядит следующим образом:

    Вам необходимо зрегистрироваться для просмотра изображений

    В результате работы схемы и захвата сигнала получаем необработанный файл размером 49,3 МБ.

    Перечень файлов каталога:

    -rw-r--r-- 1 root root 49311744 Nov 10 21:06 fob_capture
    Воспроизведение захваченного сигнала из файла:

    Примечание: В приложении GNU Radio можно отключать блоки нажатием правой кнопки мыши на блок и выбрав опцию «отключить» (‘Disable’) в выпадающем меню. Блок будет по-прежнему отображаться, но станет серым - неактивным.

    Для воспроизведения захваченного сигнала обычно создается абсолютно новая схема. Однако, чтобы продемонстрировать опцию «отключения» блока (‘Disable block’), я решил просто отключить блоки osmocom Source, QT GUI Frequency Sink и File Sink. После отключения эти блоки подсвечиваются серым.

    Далее я создаю новый блок источника, выбрав блок File Source из набора операторов File Operators. Я открыл свойства блока и ввел имя ранее захваченного файла - ‘fob_capture’.

    Вам необходимо зрегистрироваться для просмотра изображений

    Затем я создал копию предыдущего блока QT-GUI Frequency Sink (FFT), чтобы иметь возможность отслеживать воспроизведение сигнала.

    Последнее, что я сделал - добавил блок osmocom Sink для воспроизведения сигнала с помощью HackRF.

    Моя измененная схема теперь выглядит так:

    Вам необходимо зрегистрироваться для просмотра изображений Вам необходимо зрегистрироваться для просмотра ссылок

    с телефона виден результат работы схемы.

    Примечание: Параметр «Repeat» в блоке File Source указывает на то, что файл будет повторяться (в бесконечном цикле). В идеале мы могли бы разрешить воспроизведение сигнала только один раз, но в демонстрационных целях я решил повторить воспроизведение.
    Другая полезная информация о GNU Radio:

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

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

    Обратите внимание, что вместо библиотеки QT-GUI я использую библиотеку WX-GUI для демонстрации использования блока scope.

    Вам необходимо зрегистрироваться для просмотра изображений

    Блок throttle (когда использовать и зачем):

    Также стоит упомянуть блок Throttle, который можно найти в категории «Разное» (‘Misc’). Он обычно присоединяется непосредственно к выводу «неаппаратного» исходного блока (блока источника сигнала - Signal Source и т.д.), чтобы ограничить скорость, с которой этот исходный блок создает выборки. Можно использовать Throttle для того, чтобы ограничить поток выборок с тем, чтобы средняя скорость не превышала заданную (samp_rate).

    Блок Throttle необходимо исключительно в том случае, если ваша схема не содержит блока ограничения скорости, который часто представлен аппаратными средствами (SDR, динамик, микрофон и т.д.). К примеру, блок Throttle может применяться в схеме, симулирующей реальное оборудование, но при отсутствии действующего синхрогенератора.

    На примере потоковой схемы ниже, если удалить блок Throttle, результат будет выглядеть так же, но ЦП будет загружен на 100% и утилита GNU Radio может вылететь. Это хороший пример того, когда следует использовать блок Throttle.

    Вам необходимо зрегистрироваться для просмотра изображений

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

    Практическое правило: если к схеме подключено радиоустройство (USRP, SDR-RTL и т.д.) ИЛИ аудиоустройство (звуковая карта и т.д.), НЕ ИСПОЛЬЗУЙТЕ блок Throttle.
    Выводы

    Как сказано ранее, несмотря на то, что мне удалось захватить сигнал разблокировки моего FOB и воспроизвести его, но не удалось открыть автомобиль, я тем не менее считаю данную попытку удачной.

    В будущем, несомненно, я буду не раз возвращаться к проектам, работающим с радиочастотой. Следовательно, будут всплывать новые уязвимости. Поскольку GNU Radio дает возможность эмулировать дорогостоящее радиооборудование, эта утилита всегда будет ценным инструментом в моем арсенале.

    Это похоже на игру в кошки-мышки, но благодаря постоянным исследованиям и вкладу сообщества мы можем делиться знаниями и обеспечивать безопасность наших систем.

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


    Для примера рассмотрим задачу параллельного приема нескольких FM-станций на один приемник. В качестве приемника будем использовать все тот же RTL SDR V3.

    Продолжение под катом.

    Установка

    Для начала работы GNU Radio необходимо установить, дистрибутив для Windows можно скачать здесь. Система эта кроссплатформенная, версии есть также под Linux и под OSX (вроде бы GNU Radio успешно запускали и на Raspberry Pi, но 100% гарантии дать не могу).

    По сути, GNU Radio это целый фреймворк для цифровой обработки сигналов, в котором программа «собирается» из отдельных модулей. Есть большое количество уже готовых блоков, при желании также можно создавать свои собственные. Сами модули написаны на С++, а для взаимодействия блоков друг с другом используется Python. Желающие могут посмотреть на API более подробно, но на практике это, скорее всего, не пригодится — все действия можно делать визуально в программе GNU Radio Companion.

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

    Начало работы

    Запускаем GNU Radio Companion, создаем новый проект, тип проекта выбираем WX GUI, добавляем на экран и соединяем два блока, как показано на скриншоте.


    Мы видим два типа блоков — Source (источник) и Sink (выход, «слив»). RTL-SDR — это наш приемник, FFT GUI — это виртуальный спектроанализатор.

    Переменную Sample Rate устанавливаем в 2048000, это частота дискретизации нашего приемника. Частоту RTL-SDR оставляем по умолчанию равной 100МГц.

    Запускаем проект — все работает, мы видим спектр FM-станций. Первая программа для GNU Radio готова!


    Если мы посмотрим лог, то увидим такие строки.

    Generating: 'D:\\MyProjects\\GNURadio\\top_block.py'
    Executing: C:\Python27\python.exe -u D:\MyProjects\GNURadio\top_block.py

    Да, мы можем посмотреть файл top_block.py, который сгенерил нам GNU Radio Companion. Истинные джедаи могут писать непосредственно в Python, но требуемый код, как мы видим, довольно большой. Мы же создали его за 1 минуту.

    Впрочем, если убрать громоздкую инициализацию, то мы увидим, что ключевых строк кода не так уж много.

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

    Принимаем FM-радио

    Теперь попробуем принять одну из станций. Как было видно из скриншотов, центральная частота приемника 100МГц и ширина полосы пропускания около 2МГц. На спектре мы видим две станции, на 100.1МГц и 100.7МГц соответственно.

    Первым шагом необходимо перенести спектр станции в центр, сейчас он отстоит вправо на 100КГц. Для этого вспоминаем школьную формулу умножения косинусов — в результате будет две частоты, сумма и разность — нужная станция сдвинется в центр, что нам и нужно (а лишнее мы потом отфильтруем).

    Создаем две переменные для хранения частоты freq_center=100000000 и freq_1=100100000, также добавляем генератор сигналов с частотой freq_center — freq_1.


    Т.к. система построена на базе Python, то в полях ввода параметров мы можем использовать выражения, что достаточно удобно.

    Схема в итоге должна выглядеть так:


    Теперь необходимо добавить сразу несколько блоков — уменьшить тактовую частоту входного сигнала (она равна 2048КГц), отфильтровать сигнал, подать его на FM-декодер, затем еще раз уменьшить тактовую частоту до 48КГц.

    Результат показан на картинке:


    Считаем внимательно. Мы делим тактовую частоту 2048КГц в 4 раза блоком Rational Resampler (получаем 512КГц), затем после Low Pass фильтра стоит WBFM-декодер с децимацией 10 (получаем 51.2КГц). В принципе, этот сигнал уже можно подать на звуковую карту, но высота тона будет чуть отличаться. Еще раз меняем тактовую частоту в 48/51, в результате будет тактовая частота 48.2КГц, разницей уже можно пренебречь.

    Второй важный момент — тип входов. С приемника поступает комплексный IQ-сигнал (входы-выходы синего цвета), с FM-декодера выходит вещественный сигнал — входы и выходы желтого цвета. Если перепутать, ничего не заработает. Подробнее уже было на Хабре, нам достаточно понять общий принцип.

    В общем, запускаем, убеждаемся что все работает. Можно запустить программу и слушать радио. Мы пойдем дальше — у нас же все-таки Software Defined радио — добавим одновременный прием второй станции.

    Многоканальный прием

    Второй приемник добавляется любимым программистским методом — Ctrl+C/Ctrl+V. Добавляем переменную freq_2, копируем блоки и соединяем их точно также.

    Результат вполне сюрреалистичный — две FM-станции можно слушать одновременно. Тем же самым методом (Ctrl+V) можно добавить и третью станцию.

    Запись

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

    Добавим к каждому выходу компонент File Sink, как показано на скриншоте.


    Windows-версия почему-то требует абсолютные пути файлов, иначе запись не работает. Запускаем, убеждаемся что все нормально. Размер сохраняемых файлов довольно большой, т.к. по умолчанию записывается формат float. Запись в формате int оставлю читателям в качестве домашнего задания.

    Получившиеся файлы можно открыть в Cool Edit и убедиться, что звук записался нормально.



    Разумеется, число записываемых каналов можно увеличить, оно ограничено только полосой пропускания приемника и мощностью компьютера. Кроме File Sink можно использовать и UDP Sink, так что программу можно использовать для трансляции по сети.

    Запуск из командной строки

    И последнее. Если использовать программу автономно, например для многоканальной записи, то UI в принципе и не нужен. В верхнем левом блоке Options меняем параметр Run Options на No UI. Запускаем программу еще раз, убеждаемся что все работает. Теперь сохраняем сгенерированный файл top_block.py — мы можем просто запускать его из командной строки, например из bat-файла или из консоли.


    Если кому интересно, сгенерированный файл сохранен под спойлером.

    Удобно и то, что система является кросс-платформенной, и получившаяся программа может работать на Linux, Windows и OSX.

    Заключение

    Можно сказать, что GNU Radio достаточно сложная система, не в плане рисования блоков конечно, а в плане понимания того, как все это работает. Но какие-то несложные вещи сделать вполне посильно и интересно. GNU Radio также удобно использовать как «виртуальную лабораторию» для обучения — к любой части схемы можно подключить виртуальный осциллограф или спектроанализатор и посмотреть, как выглядит сигнал.

    Sergey Khoteev

    @turbojedi Клаву хардварную была попытка сделать?

    Sergey Khoteev

    Sergey Khoteev

    @001iz @Graveraider Всегда был вопрос а как у Evil персонажей могут быть романтики. Там скорее как в KoToR прогибание под свою сторону силы.

    Sergey Khoteev

    @Graveraider @001iz Q: Есть ли в игре романы? A: Да. Вы можете завести роман с 4 компаньонами, 2 из которых бисексуальны.

    Sergey Khoteev

    @001iz Заметки натуралиста, наплыв народу в комиксшопы вот произошел, после теории большого взрыва, где ненавязчиво подавалась идея что у задрота есть деньги, главное втереться к нему в доверие) Но только с хардкором тяжело.

    Советуем посмотреть также Сайт Некроманта

    Метки

    Материалы распространяются на условиях лицензии GNU FDL

    Попался мне тут в руки стик e4000, я решил его подключить. Но писать об этом слишком скучно, да и получается какая-то Windows TM магия с рассказыванием про то как запустить GUI и нажать там парочку кнопок

    Поэтому в статье по мимо подключения SDR Dongle E4000 ,приводится перевод терминов используемых в SDR , а также основные принципы работы GNU Radio.

    Я не начинающий радиолюбитель, у меня нет в запасе какого-то опыта, поэтому если Вам что-то не понятно или не нравится пишите, подправим/дополним

    gnu_radio_and_chocolate.jpg

    Table of Contents

    Быстрый старт для E4000

    Характеристики

    Установка

    Затем вставляем донгл запускаем Gqrx

    Собственно, запустится GUI который изображен на скриншоте ,это GQRX отдельная разработка , GNU-Radio же позволяет собирать свои интерфейсы, но увы пока ничего качественного сразу не удается, да и это больше запутает. Ниже будут даны определения ,некоторым сокращениям. Также GQRX поддерживает HackRF BladeRF , но это софтина раскрывает лишь малую толику их потенциала.

    Также, дальше стоит воспользоваться подробными инструкциями о том как работать с GNU Radio и донглом.

      информация о чипе и его применении с кучей ссылок использование драйвера

    А именно проверка и удаление мешающего на 3.x ядрах модуля ядра dvb_usb\_rtl28xxu ,если он есть конечно

    Прослушивание указанной частоты из консоли

    Ham it up v1.2 upconverter

    Немного о конверторе

    Краткая справка по терминам

    Чем меньше длинна волны тем больше частота.

    Что ловить

    Очевидно- радио)))) Иногда можно определить что Вы поймали, что-то не то.

    распределения полос частот между радиослужбами Российской Федерации

    Базовые концепции GNU Radio

    Это очень простой вводный учебник к GNU Radio. Вам точно понадобится прочесть его , перед чтением чего нибудь ещё. Даже если вы об этом всем, по крайне мере бегло просмотрите, может вы что-то пропустили.

    Прежде чем,мы к чему нибудь приступим, с начало на необходимо понять самые базовые концепции GNU Radio: Потоковые графы и блоки.

    Потоковые графы это графы (из теории графов), по которым идут потоки данных. Множество приложений GNU Radio содержат, только потоковый граф и ничего более. Узлы этого графа называются блоками, а потоки данных текут по ребрам его.

    Любая фактическая обработка сигнала производится блоками. В идеале каждый блок должен делать только одну работу, этот путь позволяет оставаться GNU Radio модульным и гибким. Блоки обычно пишутся на C++ (также можно писать их на Python); писать новые блоки не очень сложно.

    Здесь, представлено три блока(прямоугольники). Данные перемещаются с лева на право в данном примере, это означает что они берут начало в аудио источнике проходят через фильтр низких частот и заканчивают свой путь записываясь в файл на жестком диске.

    fg1-audiolpf.jpg

    Блоки соединяются через порты. У первого блока нет входного порта, он создает образцы(sample). Такой блок, только с входным портом, называется Исток(source). В аналоговом стиле, последний блок , без выходного порта, называется Сток (sink).

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

    Так что же происходит здесь. Блок audio source подсоединен к драйверу звуковой карты и выводит аудио образцы. Это образцы дольше обрабатываются в фильтре низких частот. Наконец образцы(сэмплы), передаются в блок который записывает их в WAV файл.

    Элементы

    Чтобы понять эту концепцию рассмотрим анализ БПФ (Быстрое Преобразование Фурье или FFT). Скажем так, мы хотим выполнить БПФ над сигналом, перед тем как сохранять его в файл. Конечно же нам необходимо некоторое количество сэмплов в одно время, чтобы вычислить БПФ; в отличие от фильтров , оно не работает с одним единственным образцом.

    Вот как это работает:

    fg2-fftvec.jpg

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

    Вот что вы должны знать:

    • Вся обработка сигнала в GNU Radio осуществляется через потоковые графы.
    • Потоковый граф состоит из блоков. Блок совершает одну операцию по обработке сигнала,такую как фильтрация, добавление сигнала, превращение,декодирования, доступ к железу и множество других.
    • Данные перемещаются между блоками в различных форматах, комплексные или вещественные , целые, числа с плавающей точкой или любой другой заданный вами тип.
    • Каждый потоковый граф должен обладать по крайне мере одним Истоком и одним Стоком.

    So what does GNU Radio do?

    С начала, вот что вы делаете: вы проектируете потоковый граф, выбираете блоки и задаете соединения и сообщаете об этом всем GNU Radio. С GNU Radio вы сталкиваетесь дважды: сперва, оно поставляет вам множество блоков. После того как потоковый граф задан, оно выполняет граф вызывая блоки один за другим и проверяет что элементы передаются от одного блока к другому.

    Частота дискретизации

    Конечно, если вы читаете эту статью, вы знаете что такое частота дискретизации (если это не так, отправляйтесь к картинке чтобы понять это).

    Давайте посмотрим на потоковые графы. В первом примере, аудио источник обладает фиксированной частотой дискретизации 32кб/с. Так как фильтр никак не меняет частоту дискретизации, эта частота используется на протяжении всего потокового графа.

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

    Вот другой пример:

    fg3-dialtone.jpg

    Прежде всего, что нового мы здесь видим здесь представлены один Сток и два Истока. Каждый порт представляет из себя один из каналов(левый и правый) звуковой карты, которые работают на фиксированной и разной частоте.

    Давайте вернемся к блокам. Наибольшая часть GNU Radio это большое количество блоков.Когда вы начнете использовать GNU Radio, вы будете соединять блок за блоком. Рано или поздно Вам понадобится блок, который будет недоступен в GNU Radio, тогда вы лего можете написать его самостоятельно. Это не трудно.

    Метаданные

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

    В GNU Radio, добавление метаданных к потоку осуществляется через механизм называемый метками stream tags. Метка это специфический объект которая соединена со определенным элементом (т.е. сэмплом). Это может быть скаляр любого типа, вектор, список ,словарь или то что укажет пользователь.

    Сохраняя поток на диск, метаданные также будут сохранены (смотри также Metadata Documentation Page).

    image

    Автор: Sven Tantau

    Home easy или easy home?

    У нашего местного дискаунтера «ALDI» я купил несколько розеток модели «Easy Home» с дистанционным управлением. В комплект входит 4 розетки плюс (всего лишь) один пульт. Кроме того, в интернете я поискал подходящий передатчик с USB-разъемом, который бы смог управлять розетками, и нашел очень дешевую модель «Home Easy». Вы, вероятно, заметили, что словосочетания «Easy Home» и «Home Easy» несколько отличаются. Я тоже обратил внимание на это различие, но все же надеялся, что передатчик будет работать без дополнительных танцев с бубном.

    Оборудование для экспериментов



    Рисунок: Перечень оборудования

    Easy Home (Розетки + Пульт)

    10-ти кнопочный пульт позволяет включать/выключать розетки. Еще существует так называемый мастер-режим для выключения/выключения одновременно всех 4-х розеток. Во время подачи питания розетки находятся в «режиме обучения». В течение 30 секунд розетка ожидает сигнал на включение, который затем считается корректным, и запоминает некоторый идентификатор. Если в течение 30 секунд никаких сигналов не поступало, розетка использует сохраненный ранее идентификатор. Розетку можно «научить» принимать сигналы включения/отключения от нескольких кнопок пульта. Если во время режима обучения поступил сигнал выключения, эта кнопка больше не сможет управлять данной розеткой. Если во время режима обучения используется мастер-режим на выключение, удаляются все сохраненные ранее идентификаторы.

    Производитель: Globaltronics GmbH & Co KG
    Модель розетки: GT-FSI-07
    Модель пульта: GT-9000

    RTL-SDR (USB DVB-T приемник)

    DVB-T приемник с USB-разъемом и тюнером Elonics E4000 (TV-приемник), функционирующий как программно-определяемая радиосистема, предназначен для анализа сигнала. Программное обеспечение с открытым исходным кодом позволяет устанавливать частоту, полосу пропускания, периодичность выборки и на выходе получать I/Q сигнал.

    Home Easy (USB-RF-передатчик)

    USB-передатчик, работающий на частоте 433.92 МГц.

    Поставщик: ROOS Electronics bv.
    Модель: ELRO AB600USB
    idVendor=04d9, idProduct=1357
    Производитель: ABLOCK

    Размышления, догадки и немного удачи

    Я не знал, на какой частоте работают электрические розетки, но предположил, что значение может быть 433.92 МГц, поскольку большинство дешевых устройств (например, оборудование для метеостанций) используют именно эту частоту.

    В своих исследованиях я использовал утилиту baudline в связке с rtl_sdr:



    Рисунок 1: Выходной сигнал при нажатии кнопки на пульте

    Мои предположения подтвердились. Как только я нажал на кнопку пульта, то увидел «содержимое» на диаграмме частот в baudline.

    Подсказка: вы можете остановить обработку новых данных, если кликнете на правую кнопку мыши и выберете «Pause».

    В baudline я обнаружил следующую опцию:

    -quadrature Анализ комплексного I/Q сигнала.

    Поскольку на выходе утилиты I/Q сигнал, я решил попробовать опцию –quadrature. Также я решил установить входной формат как беззнаковый целый, а затем увеличил периодичность выборки до 1e6.



    Рисунок 2: В анализаторе изменен формат входного сигнала и периодичность выборки

    Чтобы лучше рассмотреть сигнал, я переключился в режим waveform (кликните правой кнопкой мыши, выберите displays и далее waveform). Комбинация клавиш ALT+(Левая/Правая стрелка) позволяет масштабировать время и найти искомую информацию.



    Рисунок 3: Сигнал без масштабирования







    Рисунок 4: Масштабированный сигнал

    Глядя на сигнал в масштабированном виде, я предположил, что передаются бинарные последовательности. Предполагая, что при помощи длинного импульса передается единица, а при помощи короткого – ноль, я смог выписать бинарные последовательности, передаваемые при нажатии кнопок на моем пульте.

    Помимо сигналов, отвечающих за передачу нулей и единиц, существуют еще более длинные импульсы (на картинках выше эти сигналы не видны), завершающие передачу каждой бинарной последовательности.

    Одна из последовательностей, которую я обнаружил: 110100000111010000110000.

    На данном этапе я не стал вдаваться в подробности и выяснять, что означает каждый конкретный бит. Я лишь выяснил, что везде присутствует префикс 1101, возможно кодирующий модель розетки, и что последние 4 бита кодируют один из 5 наборов кнопок пульта (каждый набор состоит из пары кнопок включения/выключения розетки). Также я заметил, что существуют многократно повторяемые коды для одной и той же кнопки.

    Я не знал, какое количество кодов используется для каждой из 10 кнопок, и не стал далее анализировать сигнал вручную. Намного интереснее было поиграться с передатчиком (модель Home Easy).

    Я сделал некоторые пометки относительно длительности сигналов, поскольку эта информация могла пригодиться в дальнейшем.



    Рисунок 5: Еще один участок масштабированного сигнала

    Еще одна подсказка: не используйте функцию копирования+вставки в baudline. Я не вдавался в подробности, но, по-видимому, существует различие между реальными данными и тем, что хранит baudline. Если хотите поработать с выборками, сохраните всю информацию в файл и используйте утилиту dd для того, чтобы отрезать нужные вам части.

    Изучение, тестирование и первые успехи

    Не удивительно, что программное обеспечение, идущее в комплекте с передатчиком, не работало с моими розетками. На мою удачу, я нашел утилиту he853-remote, написанную на C++, которая позволила мне отослать некоторые первоначальные сигналы при помощи передатчика.

    Код утилиты не особо сложен для понимания.

    Используется библиотека 'HIDAPI' (libusb). Вначале происходит инициализация обработчика устройства на основе имени поставщика и идентификатора продукта, а затем отсылаются байты передатчику.

    Первоначальный код заполняет массив uint8_t rfCmdBuf[32] информацией, а потом происходит передача порциями по 8 байт контроллеру HE853Controller::sendOutputReport(uint8_t* buf). Контроллер добавляет еще один пустой байт, и далее 9 байт отсылаются передатчику. После пересылки 4 блоков, код отсылает еще один специальный контрольный блок (также состоящий из 9 байт), и устройство начинает передачу данных.

    Изучив документацию и внеся небольшие изменения на основе того, что я наблюдал в baudline, мне удалось сделать новую версию rfCmdBuf, успешно управляющую моими розетками.

    В итоге получилась последовательность из 5*9 байтов:

    00 01 00 2A 00 DC 02 6C 00
    00 02 00 21 77 77 21 18 01
    00 03 D0 74 34 00 00 00 00
    00 04 00 00 00 00 00 00 00
    00 05 00 00 00 00 00 00 00

    Первоначальная задача решена. Теперь я могу управлять розетками при помощи устройства от стороннего поставщика. Однако решение не очень красивое, поскольку каждый раз приходится искать коды управления вручную. Я стал изучать, как в GNU Radio создаются новые модули.

    Создание декодера сигнала от пульта

    GNU Radio представляет собой набор библиотек для создания радиосистем под конкретные нужды. Для построения блок-схемы будущей системы предусмотрен очень удобный графический интерфейс GNU Radio Companion (GRC). После создания схемы происходит преобразование в код на python, который потом при необходимости можно доработать.

    Существует множество руководств по установке и настройке gnuradion, большинство из которых рекомендуют использовать самую последнюю версию. Я бы порекомендовал вам то же самое. Компилируйте исходники. Поскольку вам нужна рабочая среда для написания собственных модулей, крайне важно иметь «нормальную» версию.

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

    Однако моя страсть к экспериментам не ослабла.

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

    После некоторых экспериментов мне удалось собрать простейшую работоспособную версию.



    Рисунок 6: Первая работоспособная версия простейшей радиосистемы

    Значение N равное 30 я поставил случайно. Во всех последующих версиях модуля число N также было в районе 30 (плюс минус).

    Как было сказано ранее, измерительные приборы очень помогали мне при изучении компонентов.

    Ниже показан осциллограф, подключенный к радиосистеме:



    Рисунок 7: Показания осциллографа, подключенного ко всей радиосистеме

    Осциллограф, подключенный к компоненту Complex to Mag^2:



    Рисунок 8: Показания осциллографа, подключенного к компоненту Complex to Mag^2

    Осциллограф, подключенный к компоненту Low Pass Filter (низкочастотный фильтр):



    Рисунок 9: Показания осциллографа, подключенного к компоненту Low Pass Filter

    Осциллограф, подключенный к компоненту Keep 1 of N:



    Рисунок 10: Показания осциллографа, подключенного к компоненту Keep 1 of N

    Код моего модуля socket_dump_f, написанного на Python, считает «потоки» нулей и единиц. Огромное множество единиц означает импульс, разделяющий битовые последовательности (обозначается символом «X»).

    Множество единиц представляют собой бинарную единицу в исходящем сигнале.

    Несколько единиц представляют собой бинарный ноль в исходящем сигнале.

    В итоге получается строка следующего формата: бинарный код X бинарный код X бинарный код …

    Если детектируется длинная последовательность поступающих нулей, предполагается, что пакет завершен (если это был пакет).

    Если в итоговой строке есть какие-либо данные, я выбираю коды между символами «X». Не слишком красивое, но рабочее решение.

    class socket_dump_f(gr.sync_block):
    """
    docstring for block socket_dump_f
    """
    def __init__(self):
    self.zero_counter = 0
    self.one_counter = 0
    self.last = 0
    self.output_buffer = ""
    gr.sync_block.__init__(self,
    name="socket_dump_f",
    in_sig=[numpy.float32],
    out_sig=None)

    def work(self, input_items, output_items):
    in0 = input_items[0]
    for item in in0 :
    if item < 1 :
    if self.last >= 1 :
    if self.one_counter > 50 :
    self.output_buffer += "X"
    elif self.one_counter > 20 :
    self.output_buffer += "1"
    else :
    self.output_buffer += "0"
    self.one_counter = 0
    self.zero_counter += 1
    if self.zero_counter > 1000 and len(self.output_buffer) > 10:
    a = self.output_buffer.split('X')
    if len(a) >= 2 :
    print "Received Code: " + a[1]
    self.output_buffer = ""
    self.zero_counter = 500
    else :
    self.zero_counter = 0
    self.one_counter += 1
    self.last = item
    return len(input_items[0])

    Если захотите импортировать код в GNU Radio Companion, вам понадобится описание проекта в формате XML.

    Последние штрихи и оставшиеся вопросы

    Теперь я могу легко выгружать все коды, передаваемые моим пультом.

    Каждая порция передаваемой битовой последовательности состоит из 24 байт:

    В байтах 1 закодирован идентификатор продукта (эти байты всегда неизменны).

    В байтах 16 передается непонятное содержимое.

    В байтах 20 закодирован идентификатор набора кнопок (эти байты одинаковые для каждого набора кнопок включения/выключения розетки).

    • Общее количество неизвестных кодов – 8.
    • Все 8 неизвестных кодов можно разделить на 2 группы (A/B) по 4 кода в каждой.
    • Либо кнопка включения использует коды из группы A и кнопка выключения из группы B, либо наоборот.

    Как только найдется немного свободного времени, я продолжу свои эксперименты, чтобы приоткрыть тайну загадочных битовых последовательностей.

    Читайте также: