В этом примере показано, как сгенерировать и декодировать пакеты канального слоя 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 рекламного канала (см. Раздел 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');
Можно использовать 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);
Можно использовать bleLLAdvertisingChannelPDUDecode функция для декодирования канала рекламы PDU. Эта функция выводит следующую информацию:
status: Перечисление типов blePacketDecodeStatus, с указанием успешности декодирования LL.
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 канала данных (см. Раздел 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 объекты, соответственно.
Индикация карты канала: Этот PDU управления LL используется для обновления карты канала на одноранговом устройстве. Этот PDU содержит обновленную карту канала, указывающую на хорошие и плохие каналы.
Данные (start fragment/complete): Этот PDU данных LL используется для переноса L2CAP данных на одноранговое устройство.
Можно использовать 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);
Можно использовать bleLLDataChannelPDUDecode функция для декодирования PDU канала данных. Эта функция выводит следующую информацию:
status: Перечисление типов blePacketDecodeStatus, с указанием успешности декодирования LL.
cfgLLData: Объект строения PDU канала данных LL типа bleLLDataChannelPDUConfig, который содержит декодированные свойства LL.
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]
Этот пример использует 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.
В примере используются следующие функции:
bleLLAdvertisingChannelPDU: Сгенерируйте канал LL рекламы PDU
bleLLAdvertisingChannelPDUDecode: Декодируйте канал рекламы LL PDU
bleLLAdvertisingChannelPDUConfig: Создайте объект строения для генерации и декодирования LL рекламного канала PDU
bleLLDataChannelPDU: Сгенерируйте канал данных LL PDU
bleLLDataChannelPDUDecode: Декодируйте канал данных LL PDU
bleLLDataChannelPDUConfig: Создайте объект строения для генерации и декодирования PDU канала данных LL
bleLLControlPDUConfig: Создайте объект подстроения, используемый в генерации и декодировании PDU канала данных
blePCAPWriter: Создайте BLE PCAP или PCAPNG файл средства записи объект
Этот пример использует эту вспомогательную систему:
helperBLEPrependAccessAddress: заполняет PDU канального слоя адресом доступа
Веб-сайт Bluetooth ® Technology. Bluetooth Technology Website | Официальный сайт Bluetooth Technology. Доступ к 8 июля 2020 года. https://www.bluetooth.com/.
«Разработка/LibpcapFileFormat - Wireshark Wiki». Доступ к 8 июля 2020 года. https://wiki.wireshark.org/Development/LibpcapFileFormat.
Группа, The Tcpdump. «Общий репозиторий Tcpdump/Libpcap». Доступ к 8 июля 2020 года. https://www.tcpdump.org.