Пакетная генерация слоя ссылки BLE и декодирование

В этом примере показано, как сгенерировать и декодировать 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 каналов RF в три рекламных канала (Индексы канала: 37, 38, 39) и тридцать семь каналов данных (Индексы канала: от 0 до 36). Слой ссылки BLE задает две категории PDUs, рекламируя канал PDUs и канал данных PDUs. Существуют различные типы PDU в этих двух категориях PDUs. Поле указателя в воздушном формате пакета интерфейса дифференцируется между PDU канала данных и рекламным PDU канала. Каждая категория PDU имеет свой собственный формат.

Реклама канала PDUs

Рекламный канал PDUs (см. Раздел 2.3, Часть-B, Vol-6 в [1]) используются перед связью LL, создается. Эти PDUs передаются только на рекламных каналах и используются в установлении связи LL. Рекламный PDU канала имеет 16-битный заголовок и переменную полезную нагрузку размера.

Рекламный PDU канала имеет следующий формат пакета:

Этот пример иллюстрирует генерацию и декодирование рекламного PDU индикации. Для списка другого рекламного канала поддерживаемый PDUs смотрите PDUType свойство bleLLAdvertisingChannelPDUConfig объект.

Рекламная индикация: рекламный PDU индикации используется, когда устройство хочет рекламировать себя. Этот PDU содержит рекламные данные, связанные с профилем приложений устройства.

Проверяйте на установку пакета поддержки

% Check if the 'Communications Toolbox Library for the Bluetooth Protocol'
% support package is installed or not.
commSupportPackageCheck('BLUETOOTH');

Реклама канала генерация PDUs

Можно использовать 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);

Декодирование рекламирующий канал PDUs

Можно использовать bleLLAdvertisingChannelPDUDecode функционируйте, чтобы декодировать рекламный PDU канала. Этот функциональные выходные параметры следующая информация:

  1. status: Перечисление типа blePacketDecodeStatus, определение, было ли декодирование LL успешно.

  2. 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

Канал данных 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 свойства bleLLControlPDUConfig и bleLLDataChannelPDUConfig объекты, соответственно.

  1. Индикация карты канала: Этот PDU управления LL используется, чтобы обновить карту канала в равноправном устройстве. Этот PDU содержит обновленную карту канала, указывающую на хорошие и плохие каналы.

  1. Данные (запускаются, фрагментируют/завершают): Этот PDU данных LL используется, чтобы нести данные L2CAP к равноправному устройству.

Канал данных генерация PDUs

Можно использовать 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
    CRCInitialization: 'ED321C'

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
    CRCInitialization: 'ED321C'
        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);

Декодирование канала данных PDUs

Можно использовать bleLLDataChannelPDUDecode функционируйте, чтобы декодировать PDU канала данных. Этот функциональные выходные параметры следующая информация:

  1. status: Перечисление типа blePacketDecodeStatus, определение, было ли декодирование LL успешно.

  2. cfgLLData: Объект настройки PDU канала данных LL типа bleLLDataChannelPDUConfig, который содержит декодируемые свойства LL.

  3. 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
    CRCInitialization: '012345'

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
    CRCInitialization: '012345'
        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]

Экспорт в файл PCAP

Этот пример использует blePCAPWriter возразите, чтобы экспортировать сгенерированный PDUs в файл с .pcap расширением или .pcapng расширением. Чтобы анализировать и визуализировать этот файл, используйте третий пакет части анализатор, такой как Wireshark.

Предварительно ожидайте указатель

Формат 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

Создайте объект типа blePCAPWriter и задайте пакетное имя файла получения.

% Create the BLE PCAP Writer file object
pcapObj = blePCAPWriter("FileName", "bleLLPackets");

Используйте write функционируйте, чтобы записать весь BLE LL PDUs в файл PCAP. Постоянный timestamp задает время получения PDU. В этом примере время получения - то же самое для всего PDUs.

timestamp = 124800; % timestamp (in microseconds)

% Write all the LL PDUs to the PCAP file
for idx = 1:numel(llPkts)
    write(pcapObj, llPkts{idx}, timestamp, 'PacketFormat', 'bits');
end

% Clear the object
clear pcapObj;

Визуализация сгенерированных пакетов слоя ссылки

Можно открыть файл PCAP, содержащий сгенерированные пакеты LL в пакете анализатор. Пакеты, декодируемые пакетом соответствие анализатора стандартные совместимые пакеты LL, сгенерированы Библиотекой Communications Toolbox™ для Протокола Bluetooth. Полученный анализ пакетов показывают ниже.

  • Рекламная индикация

  • PDU данных LL (несущий полезную нагрузку L2CAP)

  • LL управляют PDU (индикация карты канала)

Заключение

Этот пример продемонстрировал генерацию и декодирование пакетов LL, заданных в стандарте Bluetooth [1]. Можно использовать пакет анализатор, чтобы просмотреть сгенерированные пакеты LL.

Приложение

Пример использует, они показывают:

  • bleLLAdvertisingChannelPDU: Сгенерируйте LL, рекламирующий PDU канала

  • bleLLAdvertisingChannelPDUDecode: Декодируйте LL, рекламирующий PDU канала

  • bleLLAdvertisingChannelPDUConfig: Создайте объект настройки для генерации и декодирования LL, рекламирующего PDU канала

  • bleLLDataChannelPDU: Сгенерируйте PDU канала данных LL

  • bleLLDataChannelPDUDecode: Декодируйте PDU канала данных LL

  • bleLLDataChannelPDUConfig: Создайте объект настройки для генерации и декодирования PDU канала данных LL

  • bleLLControlPDUConfig: Создайте объект поднастройки, используемый в генерации и декодировании PDU канала данных

  • blePCAPWriter: Создайте BLE PCAP или объект средства записи файла PCAPNG

Этот пример использует этого помощника:

Выбранная библиография

  1. Bluetooth® Technology Website. "Технологический Веб-сайт Bluetooth | официальный сайт Технологии Bluetooth". Полученный доступ 8 июля 2020. https://www.bluetooth.com/.

  2. "Development/LibpcapFileFormat - Wiki Wireshark". Полученный доступ 8 июля 2020. https://wiki.wireshark.org/Development/LibpcapFileFormat.

  3. Группа, Tcpdump. "Репозиторий Общественности Tcpdump/Libpcap". Полученный доступ 8 июля 2020. https://www.tcpdump.org.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте