В этом примере показано, как генерировать и декодировать кадры 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 Кадры состоят из двух подкатегорий: кадры данных и кадры сигнализации. В этих двух категориях кадров существуют различные типы кадров. Кадры данных снова подразделяются на 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');
Вы можете использовать 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);
Вы можете использовать bleL2CAPFrameDecode функция декодирования кадра L2CAP. Эта функция выводит следующую информацию:
status: Перечисление типа blePacketDecodeStatus, что указывает, было ли L2CAP декодирование успешным.
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'
В этом примере используется 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;
Файл PCAP, содержащий сгенерированные кадры L2CAP, можно открыть в анализаторе пакетов. Кадры L2CAP, декодированные анализатором пакетов, совпадают со стандартно совместимыми кадрами L2CAP, генерируемыми библиотекой Communications Toolbox™ Library для протокола Bluetooth. Захваченный анализ L2CAP кадров показан ниже.
Кадр сигнализации (кредит управления потоком)

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

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

В этом примере показано формирование и декодирование кадров L2CAP указанных в стандарте Bluetooth [1]. Для просмотра сгенерированных кадров L2CAP можно использовать анализатор пакетов.
В примере используются следующие функции:
bleL2CAPFrameConfigСоздание объекта конфигурации для фрейма L2CAP BLE
bleL2CAPFrameФормирование кадров BLE L2CAP
bleL2CAPFrameDecodeДекодер кадров BLE L2CAP
blePCAPWriter: Создание объекта записи файлов BLE PCAP или PCAPNG
В примере используется этот помощник:
helperBLEPrependStartAddress: добавляет PDU канального уровня с адресом доступа
Веб-сайт технологии Bluetooth ®. «Веб-сайт Bluetooth Technology | Официальный веб-сайт Bluetooth Technology». Доступ состоялся 8 июля 2020 года. https://www.bluetooth.com/.
«Development/LibpcapFileFormat - Wiki Wiki Wieshark». Доступ состоялся 8 июля 2020 года. https://wiki.wireshark.org/Development/LibpcapFileFormat.
Группа, Tcpdump. «Общий репозиторий Tcpdump/Libpcap». Доступ состоялся 8 июля 2020 года. https://www.tcpdump.org.