Пакетная генерация слоя ссылки 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 каналов РФ в три рекламных канала (Индексы канала: 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.

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

Реклама канала генерация 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. состояние: перечисление типа 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 соответственно.

  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

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);

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

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

  1. состояние: перечисление типа 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

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]

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

Сгенерированные 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.

Приложение

Этот пример использует следующие функции помощника:

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

  1. SIG Bluetooth, спецификация v5.0 ядра Bluetooth: https://www.bluetooth.com/

  2. Программное обеспечение Wireshark: https://www.wireshark.org/

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