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

В этом примере показано, как сгенерировать и декодировать пакеты канального слоя Bluetooth ® Low Energy (BLE) с помощью библиотеки Communications Toolbox™ для протокола Bluetooth ®.

Фон

Спецификация ядра Bluetooth [1] включает версию Low Energy для низкоскоростных беспроводных персональных сетей, которая упоминается как Bluetooth Low Energy (BLE) или Bluetooth Smart. Стек BLE состоит из: Generic Attribute Profile (GATT), ATT, SMP, L2CAP, канального уровня и физического уровня. BLE был добавлен к стандарту для устройств с низким энергопотреблением, генерирующих небольшие объемы данных, таких как оповещения об уведомлениях, используемые в таких приложениях, как автоматизация дома, здравоохранение, фитнес и Интернет вещей (IoT).

Форматы пакетов

Спецификация ядра Bluetooth [1] задает два вида PHY для BLE. Каждый PHY имеет свой собственный формат пакета.

(i) Незакодированные PHY (1 Мбит/с и 2 Мбит/с)

(ii) Кодированные PHY (125 Кбит/с и 500 Кбит/с)

Закодированные PHY используют кодирование с прямой коррекцией ошибок (FEC) (со схемой кодирования S = 8 или S = 2) для пакетов. Рисунки показывают незакодированные и закодированные форматы пакетов PHY.

Формат пакета LE-интерфейса для незакодированного PHY

Формат пакета LE Air Interface для кодированного PHY

Библиотека Communications Toolbox™ для протокола Bluetooth генерирует пакеты LL, которые состоят из Модуля протокольных данных (PDU) и циклической проверки избыточности (CRC), показанных в пакете PHY.

BLE классифицирует 40 каналов РФ по трем рекламным каналам (индексы канала: 37, 38, 39) и тридцати семи каналам данных (индексы канала: от 0 до 36). Канальный слой BLE определяет две категории PDU, PDU канала рекламы и PDU канала данных. В этих двух категориях PDU существуют различные типы PDU. Поле адреса доступа в формате пакета радиоинтерфейса различает PDU канала данных и PDU канала рекламы. Каждая категория PDU имеет свой формат.

Рекламные каналы PDU

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

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

Этот пример иллюстрирует генерацию и декодирование PDU индикации рекламы. Список других поддерживаемых PDU канала рекламы см. в 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 'Advertising indication', создайте 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 'Advertising indication'.

llAdvPDU = bleLLAdvertisingChannelPDU(cfgLLAdv);

Декодирование PDU канала рекламы

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

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

  2. cfgLLAdv: Объект строения PDU канала рекламы LL типа bleLLAdvertisingChannelPDUConfig, который содержит декодированные свойства LL.

Предоставьте PDU рекламного канала и опциональную пару "имя-значение", задающую формат PDU входных данных для функции bleLLAdvertisingChannelPDUDecode. Входной формат по умолчанию является 'bits'.

Декодирование индикации рекламы

[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]

PDU канала данных

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

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

Этот пример иллюстрирует генерацию и декодирование следующих PDU. Список других поддерживаемых типов управляемых PDU и PDU данных см. в Opcode и LLID свойства bleLLControlPDUConfig и bleLLDataChannelPDUConfig объекты, соответственно.

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

  1. Данные (start fragment/complete): Этот PDU данных LL используется для переноса L2CAP данных на одноранговое устройство.

Генерация PDU канала данных

Можно использовать bleLLDataChannelPDU функция для генерации PDU канала данных. Эта функция принимает объект строения bleLLDataChannelPDUConfig, который конфигурирует поля, необходимые для генерации PDU канала данных. The bleLLControlPDUConfig является объектом подстроения в bleLLDataChannelPDUConfigПоля полезной нагрузки управляющего PDU заполняются с помощью настроек этого объекта строения.

PDU канала данных используют значение инициализации CRC, полученное в пакете 'Connection'. Значение инициализации 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]

Присвойте обновленный объект строения control PDU ControlConfig свойство в объекте строения PDU канала данных.

% Update the data channel PDU configuration
cfgLLData.ControlConfig = cfgControl;

Сгенерируйте блок управления PDU с обновлённым строением.

llControlPDU = bleLLDataChannelPDU(cfgLLData);

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

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

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

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

  3. payload: Символьный массив n на 2, представляющий полезную нагрузку верхнего уровня, переносимую PDU данных LL.

Предоставьте PDU канала данных, значение инициализации CRC и опциональную пару "имя-значение", задающую формат PDU входных данных к bleLLDataChannelPDUDecode функция. Входной формат по умолчанию является 'bits'.

Декодирование 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 объект для экспорта сгенерированных PDU в файл с расширением.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 функция для записи всех блоков PDU BLE LL в файл PCAP. Постоянная timestamp задает время захвата PDU. В этом примере время захвата одинаково для всех PDU.

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 полезная нагрузка)

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

Заключение

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

Приложение

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

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

Избранная библиография

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

  2. «Разработка/LibpcapFileFormat - Wireshark Wiki». Доступ к 8 июля 2020 года. https://wiki.wireshark.org/Development/LibpcapFileFormat.

  3. Группа, The Tcpdump. «Общий репозиторий Tcpdump/Libpcap». Доступ к 8 июля 2020 года. https://www.tcpdump.org.

Похожие темы