В этом примере показано, как сгенерировать и декодировать Bluetooth® Low Energy пакеты слоя ссылки (BLE), пользующиеся Библиотекой Communications Toolbox™ для Протокола Bluetooth®.
Спецификация [1] Ядра Bluetooth включает Низкую энергетическую версию для беспроводных персональных сетей области с низкой ставкой, которая упоминается как Bluetooth низкая энергия (BLE) или Умный Bluetooth. Стек BLE состоит из: Типовой Профиль Атрибута (GATT), Протокол Атрибута (ATT), Протокол менеджера безопасности (SMP), Управление Логической ссылкой и Протокол (L2CAP) Адаптации, слой ссылки (LL) и физический уровень. BLE был добавлен к стандарту для низких энергетических устройств, генерирующих небольшие количества данных, такие как предупреждения уведомления, используемые в таких приложениях как домашняя автоматизация, здравоохранение, фитнес и Интернет вещей (IoT).
Спецификация [1] ядра Bluetooth задает два вида ФИЗИКИ для BLE. Каждый PHY имеет свой собственный формат пакета.
(i) Незакодированная ФИЗИКА (1 Мбит/с и 2 Мбит/с)
(ii) Закодированная ФИЗИКА (125 Кбит/с и 500 Кбит/с)
Закодированное кодирование Прямого исправления ошибок (FEC) использования ФИЗИКИ (с кодированием схемы S = 8 или S = 2) для пакетов. Рисунки показывают незакодированные и закодированные форматы пакета PHY.
Формат воздушного пакета интерфейса LE для незакодированного PHY
Формат воздушного пакета интерфейса LE для закодированного PHY
Библиотека Communications Toolbox™ для Протокола Bluetooth генерирует пакеты LL, которые состоят из Модуля данных о протоколе (PDU) и Контроля циклическим избыточным кодом (CRC), показанного в пакете PHY.
BLE классифицирует 40 каналов РФ в три рекламных канала (Индексы канала: 37, 38, 39) и тридцать семь каналов данных (Индексы канала: от 0 до 36). Слой ссылки BLE задает две категории PDUs, рекламируя канал PDUs и канал данных PDUs. Существуют различные типы PDU в этих двух категориях PDUs. Поле указателя в воздушном формате пакета интерфейса дифференцируется между PDU канала данных и рекламным PDU канала. Каждая категория PDU имеет свой собственный формат.
Рекламный канал PDUs (см. Раздел 2.3, Часть-B, Vol-6 в [1]) используются перед связью LL, создается. Эти PDUs передаются только на рекламных каналах и используются в установлении связи LL. Рекламный PDU канала имеет 16-битный заголовок и переменную полезную нагрузку размера.
Рекламный PDU канала имеет следующий формат пакета:
Этот пример иллюстрирует генерацию и декодирование рекламного PDU индикации. Для списка другого рекламного канала поддерживаемый PDUs смотрите свойство PDUType.
Рекламная индикация: рекламный PDU индикации используется, когда устройство хочет рекламировать себя. Этот PDU содержит рекламные данные, связанные с профилем приложений устройства.
% Check if the 'Communications Toolbox Library for the Bluetooth Protocol' % support package is installed or not. commSupportPackageCheck('BLUETOOTH');
Можно использовать bleLLAdvertisingChannelPDU
функция, чтобы сгенерировать рекламный PDU канала. Эта функция принимает объект bleLLAdvertisingChannelPDUConfig
настройки. Этот объект конфигурирует поля, требуемые для генерации рекламного PDU канала.
Реклама генерации индикации
Чтобы сгенерировать 'Рекламную индикацию' PDU, создайте bleLLAdvertisingChannelPDUConfig
объект с PDUType
установите на 'Advertising indication'
.
cfgLLAdv = bleLLAdvertisingChannelPDUConfig('PDUType', ... 'Advertising indication');
Сконфигурируйте поля:
% Advertiser address cfgLLAdv.AdvertiserAddress = '012345ABCDEF'; % Advertising data cfgLLAdv.AdvertisingData = '0201060D09426174746572792056312E30'
cfgLLAdv = bleLLAdvertisingChannelPDUConfig with properties: PDUType: 'Advertising indication' ChannelSelection: 'Algorithm1' AdvertiserAddressType: 'Random' AdvertiserAddress: '012345ABCDEF' AdvertisingData: [17x2 char]
Сгенерируйте 'Рекламную индикацию' PDU.
llAdvPDU = bleLLAdvertisingChannelPDU(cfgLLAdv);
Можно использовать bleLLAdvertisingChannelPDUDecode
функционируйте, чтобы декодировать рекламный PDU канала. Этот функциональные выходные параметры следующая информация:
status
: Перечисление типа blePacketDecodeStatus, который указывает, было ли декодирование LL успешно.
cfgLLAdv
: LL, рекламирующий объект настройки PDU канала типа bleLLAdvertisingChannelPDUConfig
, который содержит декодируемые свойства LL.
Обеспечьте рекламный PDU канала и дополнительную пару "имя-значение", задающую формат PDU входных данных к функции bleLLAdvertisingChannelPDUDecode. Формат ввода по умолчанию является 'битами'.
Декодирование рекламной индикации
[llAdvDecodeStatus, cfgLLAdv] = bleLLAdvertisingChannelPDUDecode(llAdvPDU); % Observe the outputs % Decoding is successful if strcmp(llAdvDecodeStatus, 'Success') fprintf('Link layer decoding status is: %s\n\n', llAdvDecodeStatus); fprintf('Received Advertising channel PDU configuration is:\n'); cfgLLAdv % Decoding failed else fprintf('Link layer decoding status is: %s\n', llAdvDecodeStatus); end
Link layer decoding status is: Success Received Advertising channel PDU configuration is: cfgLLAdv = bleLLAdvertisingChannelPDUConfig with properties: PDUType: 'Advertising indication' ChannelSelection: 'Algorithm1' AdvertiserAddressType: 'Random' AdvertiserAddress: '012345ABCDEF' AdvertisingData: [17x2 char]
Канал данных PDUs (см. Раздел 2.4, Часть-B, Vol-6 в [1]) используются после связи LL, создается. Канал данных PDUs состоит из двух подкатегорий: данные LL PDUs и LL управляют PDUs. PDUs управления LL используются в управлении связь LL и данные LL, PDUs используются, чтобы нести данные верхнего уровня. PDU канала данных имеет 16-битный заголовок и переменную полезную нагрузку размера.
Канал данных PDUs имеет следующий формат пакета:
Этот пример иллюстрирует генерацию и декодирование следующего PDUs. Для списка других типов PDU управления и типов PDU данных, поддержанных, смотрите свойства Opcode и LLID соответственно.
Индикация карты канала: Этот PDU управления LL используется, чтобы обновить карту канала в равноправном устройстве. Этот PDU содержит обновленную карту канала, указывающую на хорошие и плохие каналы.
Данные (запускаются, фрагментируют/завершают): Этот PDU данных LL используется, чтобы нести данные L2CAP к равноправному устройству.
Можно использовать bleLLDataChannelPDU
функция, чтобы сгенерировать PDU канала данных. Эта функция принимает объект bleLLDataChannelPDUConfig
настройки, который конфигурирует поля, требуемые для генерации PDU канала данных.
bleLLControlPDUConfig
объект поднастройки в bleLLDataChannelPDUConfig
, поля полезной нагрузки PDU управления заполняются с помощью настроек этого объекта настройки.
Канал данных PDUs использует значение инициализации CRC, полученное в 'Пакете' индикации связи. Значение инициализации CRC используется в генерации и декодировании пакетов.
% CRC initialization value crcInit = 'ED321C';
Генерация PDU данных LL
Чтобы сгенерировать PDU данных, создайте bleLLDataChannelPDUConfig
объект с LLID
установите на 'Data (start fragment/complete)'
.
cfgLLData = bleLLDataChannelPDUConfig('LLID', ... 'Data (start fragment/complete)');
Сконфигурируйте поля:
% CRC initialization value cfgLLData.CRCInitialization = crcInit; % Sequence number cfgLLData.SequenceNumber = 0; % Next expected sequence number cfgLLData.NESN = 1
cfgLLData = bleLLDataChannelPDUConfig with properties: LLID: 'Data (start fragment/complete)' NESN: 1 SequenceNumber: 0 MoreData: 0
PDU данных используется, чтобы передать полезную нагрузку от верхнего уровня. 18-байтовая полезная нагрузка используется в этом примере.
% Payload payload = '0E00050014010A001F004000170017000000';
Сгенерируйте PDU данных с помощью полезной нагрузки и настройки.
llDataPDU = bleLLDataChannelPDU(cfgLLData, payload);
Генерация PDU управления LL
Чтобы сгенерировать PDU управления, создайте bleLLDataChannelPDUConfig
объект с LLID
установите на 'Control'
.
cfgLLData = bleLLDataChannelPDUConfig('LLID', 'Control');
Сконфигурируйте поля:
% CRC initialization value
cfgLLData.CRCInitialization = crcInit
cfgLLData = bleLLDataChannelPDUConfig with properties: LLID: 'Control' NESN: 0 SequenceNumber: 0 MoreData: 0 ControlConfig: [1x1 bleLLControlPDUConfig]
Можно сконфигурировать содержимое PDU управления LL с помощью bleLLControlPDUConfig
.
Создайте объект настройки PDU управления с Opcode
установите на 'Channel map indication'
.
cfgControl = bleLLControlPDUConfig('Opcode', 'Channel map indication');
Сконфигурируйте поля:
% Used channels cfgControl.UsedChannels = [9, 10, 12, 24, 28, 32]; % Connection event instant cfgControl.Instant = 245
cfgControl = bleLLControlPDUConfig with properties: Opcode: 'Channel map indication' Instant: 245 UsedChannels: [9 10 12 24 28 32]
Присвойте обновленный объект настройки PDU управления ControlConfig
свойство в объекте настройки PDU канала данных.
% Update the data channel PDU configuration
cfgLLData.ControlConfig = cfgControl;
Сгенерируйте PDU управления с обновленной настройкой.
llControlPDU = bleLLDataChannelPDU(cfgLLData);
Можно использовать bleLLDataChannelPDUDecode
функционируйте, чтобы декодировать PDU канала данных. Этот функциональные выходные параметры следующая информация:
status
: Перечисление типа blePacketDecodeStatus, который указывает, было ли декодирование LL успешно.
cfgLLData
: Объект настройки PDU канала данных LL типа bleLLDataChannelPDUConfig
, который содержит декодируемые свойства LL.
payload
: N-2 символьный массив, представляющий полезную нагрузку верхнего уровня, которую несут данные LL PDUs.
Обеспечьте PDU канала данных, значение инициализации CRC и дополнительную пару "имя-значение", задающую формат PDU входных данных к bleLLDataChannelPDUDecode
функция. Формат ввода по умолчанию является 'битами'.
Декодирование PDU данных LL
[llDataDecodeStatus, cfgLLData, payload] = ... bleLLDataChannelPDUDecode(llDataPDU, crcInit); % Observe the outputs % Decoding is successful if strcmp(llDataDecodeStatus, 'Success') fprintf('Link layer decoding status is: %s\n\n', llDataDecodeStatus); fprintf('Received Data channel PDU configuration is:\n'); cfgLLData fprintf('Size of the received upper-layer payload is: %d\n', ... numel(payload)/2); % Decoding failed else fprintf('Link layer decoding status is: %s\n', llDataDecodeStatus); end
Link layer decoding status is: Success Received Data channel PDU configuration is: cfgLLData = bleLLDataChannelPDUConfig with properties: LLID: 'Data (start fragment/complete)' NESN: 1 SequenceNumber: 0 MoreData: 0 Size of the received upper-layer payload is: 18
Декодирование PDU управления LL
[llControlDecodeStatus, cfgLLData] = ... bleLLDataChannelPDUDecode(llControlPDU, crcInit); % Observe the outputs % Decoding is successful if strcmp(llControlDecodeStatus, 'Success') fprintf('Link layer decoding status is: %s\n\n', llControlDecodeStatus); fprintf('Received Data channel PDU configuration is:\n'); cfgLLData fprintf('Received control PDU configuration is:\n'); cfgControl = cfgLLData.ControlConfig % Decoding failed else fprintf('Link layer decoding status is: %s\n', llControlDecodeStatus); end
Link layer decoding status is: Success Received Data channel PDU configuration is: cfgLLData = bleLLDataChannelPDUConfig with properties: LLID: 'Control' NESN: 0 SequenceNumber: 0 MoreData: 0 ControlConfig: [1x1 bleLLControlPDUConfig] Received control PDU configuration is: cfgControl = bleLLControlPDUConfig with properties: Opcode: 'Channel map indication' Instant: 245 UsedChannels: [9 10 12 24 28 32]
Сгенерированные PDUs экспортируются в файл PCAP, который может анализироваться и визуализироваться со сторонним пакетом анализатор, такой как Wireshark [2]. Функция помощника helperBLEExportToPCAP генерирует файл PCAP, содержащий пакеты Слоя Ссылки BLE.
Следующие команды генерируют файл PCAP, который может быть открыт в пакете анализатор. Файл PCAP содержит все пакеты LL, сгенерированные в этом примере.
Предварительно ожидайте указатель
Формат PCAP ожидает, что указатель будет предварительно ожидаться к пакету LL. Функция помощника helperBLEPrependAccessAddress предварительно ожидает указатель к сгенерированному пакету LL.
% Advertising channel PDUs use the default access address advAccessAddress = '8E89BED6'; % Data channel PDUs use the access address obtained from 'Connection % indication' packet. A random access address is used for this example connAccessAddress = 'E213BC42'; % Prepend access address llPkts{1} = helperBLEPrependAccessAddress(llAdvPDU, advAccessAddress); llPkts{2} = helperBLEPrependAccessAddress(llDataPDU, connAccessAddress); llPkts{3} = helperBLEPrependAccessAddress(llControlPDU, connAccessAddress);
Экспортируйте в файл PCAP
% Export the generated LL packets (llPkts) to a PCAP file helperBLEExportToPCAP(llPkts, 'bleLLPackets.pcap');
Можно открыть файл PCAP, содержащий сгенерированные пакеты LL в пакете анализатор. Пакеты, декодируемые пакетом соответствие анализатора стандартные совместимые пакеты LL, сгенерированы Библиотекой Communications Toolbox™ для Протокола Bluetooth. Полученный анализ пакетов показывают ниже.
Рекламная индикация
PDU данных LL (несущий полезную нагрузку L2CAP)
LL управляют PDU (индикация карты канала)
Этот пример продемонстрировал генерацию и декодирование пакетов LL, заданных в стандарте Bluetooth [1]. Можно использовать пакет анализатор, чтобы просмотреть сгенерированные пакеты LL.
Этот пример использует следующие функции помощника:
SIG Bluetooth, спецификация v5.0 ядра Bluetooth: https://www.bluetooth.com /
Программное обеспечение Wireshark: https://www.wireshark.org /