В этом примере показано, как реализовать приемник Bluetooth ® Low Energy (BLE) с помощью библиотеки Communications Toolbox™ для протокола Bluetooth. Можно использовать или захваченные сигналы или принять сигналы в режиме реального времени с помощью Радио ADALM-PLUTO. Подходящий сигнал для приема может быть сгенерирован путем симуляции сопутствующего примера, Bluetooth Передатчика с Низким Энергопотреблением, с любой из следующих настроек: (i) Две платформы SDR, подключенные к одному и тому же хосту-компьютеру, который запускает два сеансов работы с MATLAB (ii) Две платформы SDR, подключенные к двум компьютерам, которые запускают отдельные сеансы работы с MATLAB.
Для получения дополнительной информации о том, как настроить хост-компьютер для работы с пакетом поддержки ADALM-PLUTO, см. документацию по настройке аппаратных средств управляемого хоста-радио (Communications Toolbox Support Package for Analog Devices ADALM-Pluto Radio).
Чтобы запустить этот пример с помощью записанных сигналов, вам нужно следующее программное обеспечение:
Библиотека Communications Toolbox для протокола Bluetooth
Для приема сигналов в режиме реального времени также требуется радио ADALM-PLUTO и соответствующий пакет поддержки дополнение:
Полный список платформ SDR, поддерживаемых Communications Toolbox, см. в разделе «Поддерживаемые аппаратные средства» страницы обнаружения Программно определяемого радио (SDR).
Bluetooth Special Interest Group (SIG) представила BLE для малой степени связи малой области значений. Стандарт Bluetooth [1] задает уровень Link, который включает слои PHY и MAC. Приложения BLE включают передачу изображений и файла видео между мобильными телефонами, домашнюю автоматизацию и Интернет вещей (IoT).
Спецификации BLE:
Область значений передачи: 2.4-2.4835 ГГц
Каналов РФ: 40
Темп символа: 1 Msym/s, 2 Msym/s
Модуляция: Гауссова минимальная манипуляция сдвигом (GMSK)
Режимы передачи PHY: (i) LE1M - незакодированный PHY со скоростью передачи данных 1 Мбит/с (ii) LE2M - Незкодированный PHY со скоростью передачи данных 2 Мбит/с (iii) LE500K - Кодированный PHY со скоростью передачи данных 125 Кбит/с (iv) LE125K
Стандарт Bluetooth [1] задает форматы пакетов радиоинтерфейса для всех четырех режимов передачи PHY BLE, используя следующие поля:
Преамбула: Преамбула зависит от режима передачи PHY. LE1M mode используется 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);
Источник сигнала
Укажите источник сигнала как 'File' или '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 и бит необработанных сообщений. Следующая схема показывает обработку приемника.
Выполните автоматическое управление усилением (AGC)
Удаление смещения постоянного тока
Оцените и исправьте для смещения частоты несущей
Выполните согласованную фильтрацию гауссовым импульсом
Временная синхронизация
Демодуляция GMSK
Декодирование FEC и демпфирование шаблона для PHY с LECoded (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 Передатчика с Низким Энергопотреблением может использоваться, чтобы передать совместимую со стандартом форму волны BLE, которая может быть декодирована этим примером. Можно также использовать этот пример для передачи PDU канала данных путем изменения индекса канала, адреса доступа и значений центральной частоты в обоих примерах.
Общие советы по устранению неполадок оборудования SDR и пакета поддержки Communications Toolbox для радио ADALM-PLUTO можно найти в разделе Общие проблемы и исправления (Пакет поддержки Communications Toolbox для аналоговых устройств ADALM-Pluto Radio).
Этот пример использует следующие вспомогательные функции:
* helperBLEReceiverConfig.m: настраивает параметры приемника BLE * helperBLEPhyBitRecover.m: восстанавливает биты полезной нагрузки
Bluetooth Special Interest Group (SIG). Bluetooth Core Спецификации. Версия 5.2, том 6. https://www.bluetooth.com.