В этом примере показано, как реализовать приемник Bluetooth ® Low Energy (BLE) с использованием библиотеки Communications Toolbox™ Library для протокола Bluetooth. С помощью ADALM-PLUTO Radio можно либо использовать захваченные сигналы, либо принимать сигналы в реальном времени. Подходящий сигнал для приема может быть сгенерирован путем моделирования сопутствующего примера, Bluetooth Low Energy Transmenter, с любой из следующих настроек: (i) две платформы SDR, соединенные с одним и тем же главным компьютером, который выполняет две сессии MATLAB (ii) две платформы SDR, соединенные с двумя компьютерами, которые выполняют отдельные сессии MATLAB.
Дополнительные сведения о том, как настроить хост-компьютер для работы с пакетом поддержки ADALM-PLUTO, см. в документации по настройке аппаратного обеспечения управляемого хоста (пакет поддержки Communications Toolbox для аналоговых устройств ADALM-Pluto Radio).
Для выполнения этого примера с использованием захваченных сигналов необходимо следующее программное обеспечение:
Библиотека коммуникационных инструментов для протокола Bluetooth
Для приема сигналов в режиме реального времени также требуется радиомодуль ADALM-PLUTO и соответствующий пакет поддержки Add-On:
Полный список платформ SDR, поддерживаемых Communications Toolbox, см. в разделе Поддерживаемые аппаратные средства на странице обнаружения программно-определяемого радио (SDR).
Группа Bluetooth Special Interest Group (SIG) представила BLE для маломощной связи малой дальности. Стандарт Bluetooth [1] определяет канальный уровень, который включает в себя уровни PHY и MAC. Приложения BLE включают передачу изображений и видеофайлов между мобильными телефонами, автоматизацию дома и Интернет вещей (IoT).
Технические характеристики BLE:
Диапазон частот передачи: 2,4-2,4835 ГГц
Радиочастотные каналы: 40
Скорость передачи символов: 1 Мсым/с, 2 Мсым/с
Модуляция: гауссова минимальная манипуляция сдвигом (GMSK)
Режимы передачи PHY: (i) LE1M - некодированный PHY со скоростью передачи данных 1 Мбит/с (ii) LE2M - некодированный PHY со скоростью передачи данных 2 Мбит/с (iii) LE500K - кодированный PHY со скоростью передачи данных 500 кбит/с (iv) LE125K - кодированный PHY со скоростью передачи данных 125 кбит/с
Стандарт Bluetooth [1] определяет форматы пакетов радиоинтерфейса для всех четырех режимов передачи PHY BLE, используя следующие поля:
Преамбула: преамбула зависит от режима передачи PHY. LE1M режиме используется 8-битовая последовательность альтернативных нулей и единиц, '01010101'. LE2M использует 16-битную последовательность альтернативных нулей и единиц, '0101...'. LE500K и способы LE125K используют 80 последовательностей битов нолей и, полученных, повторяясь '00111100' десять раз.
Адрес доступа: Указывает адрес соединения, совместно используемый двумя устройствами BLE с использованием 32-разрядной последовательности.
Индикатор кодирования: 2-разрядная последовательность, используемая для дифференциации кодированных режимов (LE125K и LE500K).
Полезная нагрузка: входные биты сообщения, включающие как блок протокольных данных (PDU), так и циклический контроль избыточности (CRC). Максимальный размер сообщения - 2080 бит.
Поля окончания: два 3-разрядных вектора нулей, используемых в кодировании с прямым исправлением ошибок. Поля окончания присутствуют только для кодированных режимов (LE500K и LE125K).
Формат пакетов для некодированных режимов PHY (LE1M и LE2M) показан на рисунке ниже:

Формат пакетов для кодированных режимов PHY (LE500K и LE125K) показан на рисунке ниже:

% Check if the 'Communications Toolbox Library for the Bluetooth Protocol' % support package is installed or not. commSupportPackageCheck('BLUETOOTH');
Общая структура примера приемника BLE описана следующим образом:
Инициализация параметров приемника
Источник сигнала
Захват пакетов BLE
Обработка в приемнике
Инициализация параметров приемника
Сценарий helperBLEReceiverConfig.m инициализирует параметры приемника. Вы можете изменить phyMode параметр для декодирования принятого сигнала BLE на основе режима передачи PHY. phyMode может быть из набора {'LE1M', 'LE2M', 'LE500K', 'LE125K'}.
phyMode = 'LE1M';
bleParam = helperBLEReceiverConfig(phyMode);
Источник сигнала
Укажите источник сигнала как файл или ADALM-PLUTO.
Файл: Использует comm.BasebandFileReader для чтения файла, который содержит ранее захваченный эфирный сигнал.
ADALM-PLUTO: использует sdrrx (Communications Toolbox Support Package for Analog Devices ADALM-Pluto Radio) Системный объект для приема живого сигнала от аппаратных средств SDR.
Если в качестве источника сигнала назначен ADALM-PLUTO, в примере выполняется поиск радиоблока ADALM-PLUTO по адресу радиосвязи «usb: 0» и используется в качестве источника сигнала.
signalSource = 'File'; % The default signal source is 'File'
if strcmp(signalSource,'File') switch bleParam.Mode case 'LE1M' bbFileName = 'bleCapturesLE1M.bb'; case 'LE2M' bbFileName = 'bleCapturesLE2M.bb'; case 'LE500K' bbFileName = 'bleCapturesLE500K.bb'; case 'LE125K' bbFileName = 'bleCapturesLE125K.bb'; otherwise error('Invalid PHY transmission mode. Valid entries are LE1M, LE2M, LE500K and LE125K.'); end sigSrc = comm.BasebandFileReader(bbFileName); sigSrcInfo = info(sigSrc); sigSrc.SamplesPerFrame = sigSrcInfo.NumSamplesInData; bbSampleRate = sigSrc.SampleRate; bleParam.SamplesPerSymbol = bbSampleRate/bleParam.SymbolRate; elseif strcmp(signalSource,'ADALM-PLUTO') % First check if the HSP exists if isempty(which('plutoradio.internal.getRootDir')) error(message('comm_demos:common:NoSupportPackage', ... 'Communications Toolbox Support Package for ADALM-PLUTO Radio',... ['<a href="https://www.mathworks.com/hardware-support/' ... 'adalm-pluto-radio.html">ADALM-PLUTO Radio Support From Communications Toolbox</a>'])); end bbSampleRate = bleParam.SymbolRate * bleParam.SamplesPerSymbol; sigSrc = sdrrx('Pluto',... 'RadioID', 'usb:0',... 'CenterFrequency', 2.402e9,... 'BasebandSampleRate', bbSampleRate,... 'SamplesPerFrame', 1e7,... 'GainSource', 'Manual',... 'Gain', 25,... 'OutputDataType', 'double'); else error('Invalid signal source. Valid entries are File and ADALM-PLUTO.'); end % Setup spectrum viewer spectrumScope = dsp.SpectrumAnalyzer( ... 'SampleRate', bbSampleRate,... 'SpectrumType', 'Power density', ... 'SpectralAverages', 10, ... 'YLimits', [-130 -30], ... 'Title', 'Received Baseband BLE Signal Spectrum', ... 'YLabel', 'Power spectral density');
Захват пакетов BLE
% The transmitted waveform is captured as a burst dataCaptures = sigSrc(); % Show power spectral density of the received waveform spectrumScope(dataCaptures);

Обработка получателя
Выборки основной полосы частот, принятые от источника сигнала, обрабатываются для декодирования информации заголовка PDU и битов необработанного сообщения. На следующей схеме показана обработка приемника.

Выполнить автоматическую регулировку усиления (АРУ)
Удаление смещения постоянного тока
Оценка и исправление смещения несущей частоты
Выполнить согласованную фильтрацию гауссовым импульсом
Синхронизация по времени
Демодуляция GMSK
Декодирование FEC и восстановление шаблона для LECoded PHY (LE500K и LE125K)
Дедупликация данных
Выполнение проверки CRC на декодированном PDU
Частота ошибок обработки пакетов (PER)
% Initialize System objects for receiver processing agc = comm.AGC('MaxPowerGain',20,'DesiredOutputPower',2); freqCompensator = comm.CoarseFrequencyCompensator('Modulation','OQPSK', ... 'SampleRate',bbSampleRate,... 'SamplesPerSymbol',2*bleParam.SamplesPerSymbol,... 'FrequencyResolution',100); prbDet = comm.PreambleDetector(bleParam.RefSeq,'Detections','First'); % Initialize counter variables pktCnt = 0; crcCnt = 0; displayFlag = false; % true if the received data is to be printed % Loop to decode the captured BLE samples while length(dataCaptures) > bleParam.MinimumPacketLen % Consider two frames from the captured signal for each iteration startIndex = 1; endIndex = min(length(dataCaptures),2*bleParam.FrameLength); rcvSig = dataCaptures(startIndex:endIndex); rcvAGC = agc(rcvSig); % Perform AGC rcvDCFree = rcvAGC - mean(rcvAGC); % Remove the DC offset rcvFreqComp = freqCompensator(rcvDCFree); % Estimate and compensate for the carrier frequency offset rcvFilt = conv(rcvFreqComp,bleParam.h,'same'); % Perform gaussian matched filtering % Perform frame timing synchronization [~, dtMt] = prbDet(rcvFilt); release(prbDet) prbDet.Threshold = max(dtMt); prbIdx = prbDet(rcvFilt); % Extract message information [cfgLLAdv,pktCnt,crcCnt,remStartIdx] = helperBLEPhyBitRecover(rcvFilt,... prbIdx,pktCnt,crcCnt,bleParam); % Remaining signal in the burst captures dataCaptures = dataCaptures(1+remStartIdx:end); % Display the decoded information if displayFlag && ~isempty(cfgLLAdv) fprintf('Advertising PDU Type: %s\n',cfgLLAdv.PDUType); fprintf('Advertising Address: %s\n',cfgLLAdv.AdvertiserAddress); end % Release System objects release(freqCompensator) release(prbDet) end % Release the signal source release(sigSrc) % Determine the PER if pktCnt per = 1-(crcCnt/pktCnt); fprintf('Packet error rate for %s mode is %f.\n',bleParam.Mode,per); else fprintf('\n No BLE packets were detected.\n') end
Packet error rate for LE1M mode is 0.000000.
Дополнительный пример Bluetooth Low Energy Transmenter может использоваться для передачи совместимой со стандартом формы сигнала BLE, которая может быть декодирована с помощью этого примера. Этот пример можно также использовать для передачи PDU канала данных путем изменения индекса канала, адреса доступа и значений центральной частоты в обоих примерах.
Общие советы по устранению неполадок оборудования SDR и пакет поддержки Communications Toolbox для ADALM-PLUTO Radio можно найти в документе Общие проблемы и исправления (пакет поддержки Communications Toolbox для аналоговых устройств ADALM-Pluto Radio).
В этом примере используются следующие вспомогательные функции:
* helperBLEReceiverConfig.m: Настройка параметров приемника BLE * helperBLEPhyBitRecover.m: Восстановление битов полезной нагрузки
Группа специальных интересов Bluetooth (SIG). «Спецификация ядра Bluetooth». Версия 5.2, том 6. https://www.bluetooth.com.