exponenta event banner

Формирование и декодирование кадров BLE L2CAP

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

Фон

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

Уровень L2CAP в BLE соответствует более высокому подуровню, т.е. управлению логическим каналом (LLC) уровня канала передачи данных в ссылочной модели OSI. Этот L2CAP находится над PHY и канальным уровнем BLE. Спецификация BLE оптимизировала и упростила L2CAP по сравнению с классическим Bluetooth.

L2CAP в BLE отвечает за: (i) установление логического соединения (ii) мультиплексирование протокола (iii) сегментацию и повторную сборку (iv) управление потоком по «динамическому» L2CAP каналу.

Уровень L2CAP добавляет базовый заголовок L2CAP к полезной нагрузке более высокого уровня и передает блок протокольных данных (PDU) на канальный уровень ниже него.

L2CAP Кадры

L2CAP Кадры состоят из двух подкатегорий: кадры данных и кадры сигнализации. В этих двух категориях кадров существуют различные типы кадров. Кадры данных снова подразделяются на B-кадр (базовый информационный кадр) и LE-кадр (информационный кадр низкой энергии). Каждый тип кадра имеет свой собственный формат.

Идентификатор канала (CID) - это локальное имя, представляющее конечную точку логического канала в устройстве. Для протоколов, таких как ATT и SMP, эти каналы фиксируются Bluetooth Special Interest Group (SIG). Для профилей приложений, таких как профиль поддержки протокола Интернета (IPSP) и профиль передачи объектов (OTP), эти каналы назначаются динамически.

Кадры сигнализации используются с фиксированным логическим каналом, называемым каналом сигнализации ('0005'), и используются для установления логического соединения между равноправными устройствами с использованием механизма управления потоком на основе кредита LE. Эти кадры сигнализации также используются для обновления параметров соединения (Slave latency, Connection timeout, Minimum connection interval и Maximum connection interval), когда процедура запроса параметров соединения не поддерживается на канальном уровне.

Кадры данных (B-кадры и LE-кадры) несут полезную нагрузку верхнего уровня как «информационную полезную нагрузку» в формате кадра. B-кадры используются для переноса фиксированной полезной нагрузки (ATT и SMP с фиксированными логическими каналами «0004» и «0006» соответственно). Кадры LE используются для переноса полезной нагрузки через динамически создаваемые логические каналы для конкретных профилей приложений, таких как IPSP и OTP.

Этот пример иллюстрирует генерацию и декодирование следующих кадров. Для получения списка других поддерживаемых кадров сигнализации см. CommandType имущество bleL2CAPFrameConfig объект.

1. Кредит управления потоком: этот кадр сигнализации отправляется для создания и конфигурирования L2CAP логического канала между двумя устройствами.

2. B-кадры по фиксированным каналам (ATT, SMP и т.д.): Этот кадр предназначен для переноса полезной нагрузки фиксированных каналов в режиме базового L2CAP.

3. LE-кадры по динамическим каналам (профили, такие как IPSP, OTP и т.д.): Этот кадр используется для переноса полезной нагрузки динамических каналов в режиме управления потоком на основе кредита LE.

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

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

L2CAP Формирование кадров

Вы можете использовать bleL2CAPFrame для создания кадра L2CAP. Эта функция принимает объект конфигурации bleL2CAPFrameConfig. Этот объект настраивает поля, необходимые для создания кадра L2CAP.

Формирование кадра сигнализации

Для создания кадра сигнализации создайте bleL2CAPFrameConfig объект с ChannelIdentifier установить в значение '0005'.

cfgL2CAP = bleL2CAPFrameConfig('ChannelIdentifier', '0005');

Сконфигурируйте поля:

% Command type
cfgL2CAP.CommandType = 'Flow control credit';
% Source channel identifier
cfgL2CAP.SourceChannelIdentifier = '0041';
% LE credits
cfgL2CAP.Credits = 25
cfgL2CAP = 

  bleL2CAPFrameConfig with properties:

          ChannelIdentifier: '0005'
                CommandType: 'Flow control credit'
           SignalIdentifier: '01'
    SourceChannelIdentifier: '0041'
                    Credits: 25

Создайте команду 'Кредит управления потоком'.

sigFrame = bleL2CAPFrame(cfgL2CAP);

Формирование B-кадра

Для генерации B-кадра (с ATT PDU) создайте bleL2CAPFrameConfig объект с ChannelIdentifier установить в значение '0004'(Идентификатор канала ATT).

cfgL2CAP = bleL2CAPFrameConfig('ChannelIdentifier', '0004')
cfgL2CAP = 

  bleL2CAPFrameConfig with properties:

    ChannelIdentifier: '0004'

B-кадр используется для передачи полезной нагрузки от верхнего уровня ATT. В этом примере в качестве полезной нагрузки используется 5-байтовый блок ATT PDU.

payload = ['04';'01';'00';'FF';'FF'];

Произведите B-структуру L2CAP, используя полезный груз и конфигурацию.

bFrame = bleL2CAPFrame(cfgL2CAP, payload);

Формирование LE-кадра

Для создания LE-кадра создайте bleL2CAPFrameConfig объект с ChannelIdentifier установить в значение '0035'.

cfgL2CAP = bleL2CAPFrameConfig('ChannelIdentifier', '0035')
cfgL2CAP = 

  bleL2CAPFrameConfig with properties:

    ChannelIdentifier: '0035'

LE-кадр используется для передачи полезной нагрузки динамических каналов. В этом примере используется двухбайтовая полезная нагрузка.

payload = ['01';'02'];

Произведите LE-структуру L2CAP, используя полезный груз и конфигурацию.

leFrame = bleL2CAPFrame(cfgL2CAP, payload);

Декодирование L2CAP кадров

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

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

  2. cfgL2CAP: Объект конфигурации фрейма L2CAP типа bleL2CAPFrameConfig, который содержит декодированные свойства L2CAP.

Эта функция принимает кадр L2CAP BLE в качестве входного сигнала.

Декодирование кадра сигнализации

[sigFrameDecodeStatus, cfgL2CAP] = bleL2CAPFrameDecode(sigFrame);

% Observe the outputs

% Decoding is successful
if strcmp(sigFrameDecodeStatus, 'Success')
    fprintf('L2CAP decoding status is: %s\n\n', sigFrameDecodeStatus);
    fprintf('Received L2CAP signaling frame configuration is:\n');
    cfgL2CAP
% Decoding failed
else
    fprintf('L2CAP decoding status is: %s\n', sigFrameDecodeStatus);
end
L2CAP decoding status is: Success

Received L2CAP signaling frame configuration is:

cfgL2CAP = 

  bleL2CAPFrameConfig with properties:

          ChannelIdentifier: '0005'
                CommandType: 'Flow control credit'
           SignalIdentifier: '01'
    SourceChannelIdentifier: '0041'
                    Credits: 25

Декодирование B-кадра

[bFrameDecodeStatus, cfgL2CAP, payload] = bleL2CAPFrameDecode(bFrame);

% Observe the outputs

% Decoding is successful
if strcmp(bFrameDecodeStatus, 'Success')
    fprintf('L2CAP decoding status is: %s\n\n', bFrameDecodeStatus);
    fprintf('Received L2CAP B-frame configuration is:\n');
    cfgL2CAP
    fprintf('Payload carried by L2CAP B-frame is:\n');
    payload
% Decoding failed
else
    fprintf('L2CAP decoding status is: %s\n', bFrameDecodeStatus);
end
L2CAP decoding status is: Success

Received L2CAP B-frame configuration is:

cfgL2CAP = 

  bleL2CAPFrameConfig with properties:

    ChannelIdentifier: '0004'

Payload carried by L2CAP B-frame is:

payload =

  5x2 char array

    '04'
    '01'
    '00'
    'FF'
    'FF'

Декодирование LE-кадра

[leFrameDecodeStatus, cfgL2CAP, payload] = bleL2CAPFrameDecode(leFrame);

% Observe the outputs

% Decoding is successful
if strcmp(leFrameDecodeStatus, 'Success')
    fprintf('L2CAP decoding status is: %s\n\n', leFrameDecodeStatus);
    fprintf('Received L2CAP LE-frame configuration is:\n');
    cfgL2CAP
    fprintf('Payload carried by L2CAP LE-frame is:\n');
    payload
% Decoding failed
else
    fprintf('L2CAP decoding status is: %s\n', leFrameDecodeStatus);
end
L2CAP decoding status is: Success

Received L2CAP LE-frame configuration is:

cfgL2CAP = 

  bleL2CAPFrameConfig with properties:

    ChannelIdentifier: '0035'

Payload carried by L2CAP LE-frame is:

payload =

  2x2 char array

    '01'
    '02'

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

В этом примере используется blePCAPWriter объект для экспорта созданных PDU в файл с расширением .pcap или .pcapng. Для анализа и визуализации этого файла используйте анализатор пакетов третьей части, такой как Wireshark.

Формат PCAP ожидает L2CAP что кадр будет заключен в пакет канального уровня, а также ожидает, что сгенерированный пакет будет дополнен адресом доступа. Вспомогательная функция helperBLEPrependStartAddress добавляет адрес доступа к сгенерированному пакету. Следующие команды генерируют файл PCAP для L2CAP кадров, созданных в этом примере.

% Create a cell array of L2CAP frames
l2capFrames = {sigFrame, bFrame, leFrame};
llPackets = cell(1, numel(l2capFrames));
for i = 1:numel(llPackets)
    % Add Link Layer header to the generated L2CAP frame
    cfgLLData = bleLLDataChannelPDUConfig('LLID', 'Data (start fragment/complete)');
    llDataPDU = bleLLDataChannelPDU(cfgLLData, l2capFrames{i});
    % Prepend access address. A 4-byte access address is used in this example
    llPackets{i} = helperBLEPrependAccessAddress(llDataPDU, '01234567');
end

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

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

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

Используйте 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(llPackets)
    write(pcapObj, llPackets{idx}, timestamp, "PacketFormat", "bits");
end

% Clear the object
clear pcapObj;

Визуализация созданных кадров L2CAP

Файл PCAP, содержащий сгенерированные кадры L2CAP, можно открыть в анализаторе пакетов. Кадры L2CAP, декодированные анализатором пакетов, совпадают со стандартно совместимыми кадрами L2CAP, генерируемыми библиотекой Communications Toolbox™ Library для протокола Bluetooth. Захваченный анализ L2CAP кадров показан ниже.

  • Кадр сигнализации (кредит управления потоком)

  • B-рама (несущая ATT PDU)

  • LE-кадр (несущий полезную нагрузку динамического канала)

Заключение

В этом примере показано формирование и декодирование кадров L2CAP указанных в стандарте Bluetooth [1]. Для просмотра сгенерированных кадров L2CAP можно использовать анализатор пакетов.

Приложение

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

В примере используется этот помощник:

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

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

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

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

Связанные темы