Следующая новость
Предыдущая новость

Лови сигнал! Учимся передавать сигнал и управлять чужой техникой

14.06.2019 13:42
Лови сигнал! Учимся передавать сигнал и управлять чужой техникой

Содержание статьи

  • Железо
  • Софт
  • Привет из Голландии
  • Прием
  • Передача
  • Перехват слабого сигнала
  • Что делать, если ничего не работает?
  • Заключение

Представим, что ты поймал, перехватил и расшифровал сигнал управления каким-то устройством. Теперь настала пора его подделать! А для этого нужно научиться передавать любые сигналы. Готовим радиопередатчик — и вперед к победе!

Железо

В качестве примера будем рассматривать сигналы от пульта, работающего на частоте 434 МГц.

Беспроводной пульт

Такой пульт для наших целей хорош по двум причинам:

  1. Его сигнал очень прост для изучения и представляет собой модулированный нужной частотой бинарный код (так называемая модуляция OOK — On-Off Keying).
  2. По такому принципу работают многие устройства, так что, разобравшись с одним, нетрудно управлять и другими.

Для приема сигнала мы пользовались дешевым приемником 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

GNU Radio ориентирована на поточную обработку данных, в ней можно создавать из блоков схему, которая будет выполнять операции. В данном случае мы имеем только два блока: Source (источник) и Sink (приемник, буквально «слив»). Я использую SDR USRP, поэтому в качестве источника — USRP Source. В твоем случае устройство может быть другим — ищи в документации к твоему SDR. В качестве приемника используется FFT Sink — блок визуализации данных, который позволит нам увидеть наличие сигнала. Он не обязателен для записи, но без него будет непонятно, принимаем мы сигнал или нет.

В свойствах приемника я также указал частоту, на которой мы хотим принимать, — 434 МГц. Частоту дискретизации (sample rate) я установил равной 128 000, этого достаточно для записи сигнала. Запускаем проект в GNU Radio, подносим пульт поближе к антенне, нажимаем на нем любую кнопку, и, если все было сделано правильно, мы увидим хорошо заметный всплеск сигнала на спектре.

Лови сигнал! Учимся передавать сигнал и управлять чужой техникой
Спектр сигнала в GNU Radio

Если сигнал виден нормально, мы можем его записать. Добавляем блок File Sink.

Лови сигнал! Учимся передавать сигнал и управлять чужой техникой
Схема в GNU Radio с блоком записи

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 входной одномерный массив преобразуется в двумерный: запись у нас содержит два канала. Для удобства отображения я вывожу только один канал.

Запускаем программу и видим наш сигнал.

Лови сигнал! Учимся передавать сигнал и управлять чужой техникой
Сигнал в Matplotlib

Чтобы избежать искажения, уровень записи не должен быть слишком высоким и упираться в 1.0. При этом он не должен и быть слишком низким, иначе качество передаваемого сигнала будет плохим. Уровень сигнала между 0.5 и 1.0 — оптимальный. В моем случае было достаточно держать пульт при записи в нескольких сантиметрах от антенны.

Если ты не видишь ничего, а вместо этого выдается ошибка отсутствия библиотеки NumPy или Matplotlib, то нужно их установить:

  • в Windows: C:Python3Scriptspip.exe install numpy matplotlib;
  • в Linux: $ sudo pip install numpy scipy matplotlib;
  • в последних версиях macOS: $ pip3 install numpy scipy matplotlib --user.

Продолжение доступно только подписчикам

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

Подпишись на «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

1 год

7590 р.

Экономия 1400 рублей!

1 месяц

720 р.

25-30 статей в месяц

Уже подписан?

Источник

Последние новости