Содержание статьи
Железо
В качестве примера будем рассматривать сигналы от пульта, работающего на частоте 434 МГц.
Такой пульт для наших целей хорош по двум причинам:
- Его сигнал очень прост для изучения и представляет собой модулированный нужной частотой бинарный код (так называемая модуляция OOK — On-Off Keying).
- По такому принципу работают многие устройства, так что, разобравшись с одним, нетрудно управлять и другими.
Для приема сигнала мы пользовались дешевым приемником RTL SDR V3, купить который можно за 30 долларов. Он хорош для приема и анализа сигналов, но вот передавать, увы, RTL SDR не умеет. Тут нам пригодится что-нибудь более функциональное, например LimeSDR или HackRF.
INFO
Подробнее об этом я писал в статье «Лови сигнал! Используем 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, то нужно их установить:
- в Windows:
C:\Python3\Scripts\pip.exe install numpy matplotlib
; - в Linux:
$ sudo pip install numpy scipy matplotlib
; - в последних версиях macOS:
$ pip3 install numpy scipy matplotlib --user
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»