Представим, что ты поймал, перехватил и расшифровал сигнал управления каким-то устройством. Теперь настала пора его подделать! А для этого нужно научиться передавать любые сигналы. Готовим радиопередатчик — и вперед к победе!
В качестве примера будем рассматривать сигналы от пульта, работающего на частоте 434 МГц.
Такой пульт для наших целей хорош по двум причинам:
Для приема сигнала мы пользовались дешевым приемником RTL SDR V3, купить который можно за 30 долларов. Он хорош для приема и анализа сигналов, но вот передавать, увы, RTL SDR не умеет. Тут нам пригодится что-нибудь более функциональное, например LimeSDR или HackRF.
Подробнее об этом я писал в статье «Лови сигнал! Используем SDR, чтобы перехватить и расшифровать сигнал пульта».
Главное отличие Software Defined Radio от радио обычного в том, что вся обработка сигнала выполняется в «цифре». Задача самого устройства сводится к тому, чтобы передать цифровой поток на ЦАП, который транслирует все в эфир. Скорость оцифровки и ширина полосы пропускания связаны теоремой Шеннона — Котельникова: чем больше число отсчетов в секунду, тем более широкополосный сигнал можно передать.
Скорости современных ЦАП и АЦП таковы, что SDR может записывать одновременно весь эфир FM в диапазоне от 88 до 108 МГц целиком. Или передавать сразу несколько сигналов одновременно на разных частотах — главное, эти сигналы правильно сформировать программно.
В качестве примера возможностей SDR хочу поделиться записью, которую я сделал в Амстердаме. Она содержит все FM-радиостанции сразу в диапазоне от 91 до 105 МГц, десять секунд такой записи занимают 660 Мбайт. Можешь скачать этот файл и послушать, что играется на голландском радио.
Проиграть файл можешь в бесплатной программе SDR# — в ней можно открыть запись и слушать любую станцию, как с обычного приемника. Но в отличие от приемника все декодирование идет в «цифре», а на входе лишь цифровой поток. Думаю, теперь ты представляешь, какая вычислительная мощность у современных SDR.
Вернемся к беспроводному пульту. Наша задача — сформировать нужный нам сигнал, а SDR передаст его в эфир. Классикой для цифровой обработки сигналов считается программа GNU Radio. Это не просто программа, а целый фреймворк с огромным количеством компонентов для работы с сигналами и возможностью добавлять собственные модули. Раньше эта программа была доступна только в Linux, но последние версии работают и в 64-битных версиях Windows. Пользователи macOS могут установить GNU Radio с помощью brew
.
В общем, устанавливаем GNU Radio, подключаем SDR и приступаем к работе с сигналами.
Чтобы передать сигнал, сначала нужно его принять и сохранить как образец. Запускаем GNU Radio Companion и собираем из блоков схему.
GNU Radio ориентирована на поточную обработку данных, в ней можно создавать из блоков схему, которая будет выполнять операции. В данном случае мы имеем только два блока: Source (источник) и Sink (приемник, буквально «слив»). Я использую SDR USRP, поэтому в качестве источника — USRP Source. В твоем случае устройство может быть другим — ищи в документации к твоему SDR. В качестве приемника используется FFT Sink — блок визуализации данных, который позволит нам увидеть наличие сигнала. Он не обязателен для записи, но без него будет непонятно, принимаем мы сигнал или нет.
В свойствах приемника я также указал частоту, на которой мы хотим принимать, — 434 МГц. Частоту дискретизации (sample rate) я установил равной 128 000, этого достаточно для записи сигнала. Запускаем проект в GNU Radio, подносим пульт поближе к антенне, нажимаем на нем любую кнопку, и, если все было сделано правильно, мы увидим хорошо заметный всплеск сигнала на спектре.
Если сигнал виден нормально, мы можем его записать. Добавляем блок File Sink.
GNU Radio для Windows требует абсолютные пути файлов, иначе ничего не работает. В Linux такой проблемы нет.
Запускаем программу, нажимаем кнопку на пульте, закрываем программу. В указанной нами папке должен появиться файл 433_signal.iq
размером примерно 5 Мбайт, содержащий наш сигнал. Его можно открыть в любом аудиоредакторе, например в Cool Edit, если выбрать тип файла «стерео» (в SDR пишутся два канала, называемых I и Q) и тип данных float
. Мы же откроем его с помощью Python и библиотеки для научных расчетов NumPy.
import numpy as np import matplotlib.pyplot as plt data = np.fromfile('433_signal.iq', dtype=np.float32) data_2ch = np.reshape(data, (-1, 2)) data_left = data_2ch[:, -1] rate = 128000 plt.figure(1) time = np.linspace(0, len(data_left)/rate, num=len(data_left)) plt.plot(time, data_left) plt.tight_layout() plt.show()
Записанный файл не имеет заголовка wav
, а содержит непосредственно данные float
, так что частоту дискретизации и тип данных необходимо указать вручную. Также с помощью np.reshape
входной одномерный массив преобразуется в двумерный: запись у нас содержит два канала. Для удобства отображения я вывожу только один канал.
Запускаем программу и видим наш сигнал.
Чтобы избежать искажения, уровень записи не должен быть слишком высоким и упираться в 1.0. При этом он не должен и быть слишком низким, иначе качество передаваемого сигнала будет плохим. Уровень сигнала между 0.5 и 1.0 — оптимальный. В моем случае было достаточно держать пульт при записи в нескольких сантиметрах от антенны.
Если ты не видишь ничего, а вместо этого выдается ошибка отсутствия библиотеки NumPy или Matplotlib, то нужно их установить:
C:Python3Scriptspip.exe install numpy matplotlib
;$ sudo pip install numpy scipy matplotlib
;$ pip3 install numpy scipy matplotlib --user
.Материалы из последних выпусков можно покупать отдельно только через два месяца после публикации. Чтобы продолжить чтение, необходимо купить подписку.
Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке
1 год7590 р. Экономия 1400 рублей! |
1 месяц720 р. 25-30 статей в месяц |
Уже подписан?
Читайте также
Последние новости