В этом примере показано, как сгенерировать и декодировать 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 /