В этом примере показано, как сгенерировать и декодировать 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 bleLLAdvertisingChannelPDU> функционируют, чтобы сгенерировать рекламный PDU канала. Эта функция принимает объект bleLLAdvertisingChannelPDUConfig настройки 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 /