В этом примере показано, как сгенерировать и декодировать пакеты канального слоя 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.