11.2. Стек BLE

Подобно сетевым технологиям, Bluetooth Low Energy построен как стек слоёв, каждый из которых решает одну задачу и предоставляет чистую абстракцию вышележащему слою. Приведённые ниже названия взяты прямо из спецификации Bluetooth Core и встречаются в API aioble и bluetooth.

A vertical stack of five labelled boxes. From bottom to top: Physical (radio), Link Layer, GAP, GATT, Application. An arrow on the right points up the stack labelled "what we build". An arrow on the left points down the stack labelled "what is provided".

Стек Bluetooth Low Energy. Каждый слой передаёт более чистую абстракцию следующему – тот же шаблон, что использует сетевой стек.

Физический уровень. Перемещает биты между двумя устройствами по радиоканалу 2.4 ГГц. Выбор канала, модуляция, мощность передачи. Задача камеры – быть включённой; всё остальное делает кристалл.

Канальный уровень (Link layer). Перемещает пакеты между двумя устройствами, согласившимися общаться друг с другом. Добавляет адреса устройств, чтобы каждый пакет можно было направить одному соседу, планирует периодические радиособытия, составляющие подключение, и обрабатывает повторную передачу любого пакета, который получатель не подтвердил.

Generic Access Profile (GAP). Уровень обнаружения и подключения. Определяет четыре роли – broadcaster, observer, peripheral, central – и протокол объявления о себе / сканирования, который в первую очередь позволяет двум устройствам найти друг друга, а также процедуру открытия и закрытия подключения между ними. Здесь живут адреса, рекламные нагрузки, параметры подключения и сопряжение.

Generic Attribute Profile (GATT). Уровень данных. Располагается поверх открытого подключения GAP и предоставляет небольшую базу данных ключ/значение: одна сторона размещает дерево именованных значений, называемых характеристиками, другая сторона читает, записывает или подписывается на них. Здесь текут собственно прикладные байты.

Прикладной уровень (Application). То, о чём камера и партнёр договорились, что означают эти байты. Bluetooth SIG публикует стандартные профили – частота сердечных сокращений, уровень заряда батареи, измерение параметров окружающей среды – которые определяют часто используемые характеристики, чтобы несвязанные устройства могли взаимодействовать, но любое приложение вольно определять свои собственные.

11.2.1. Как слои выстраиваются во время выполнения

Этот шаблон совпадает с сетевым стеком:

  • Байты приложения помещаются в значение характеристики.

  • GATT оборачивает их заголовком, определяющим, какой характеристике принадлежат эти байты.

  • GAP поддерживает работающее открытое подключение, чтобы у GATT было куда отправлять.

  • Канальный уровень оборачивает всё это в пакет, адресованный по адресу устройства партнёра, и планирует радиособытие для его передачи.

  • Физический уровень превращает пакет в короткий всплеск радиосигнала 2.4 ГГц.

Физический и канальный уровни почти невидимы из Python – их обрабатывают кристалл и прошивка радиомодуля. Начиная с GAP и выше, у Python-кода камеры появляется больше возможностей участвовать.

11.2.2. Два слоя, которые обращённый к пользователю API незаметно пропускает

Спецификация Bluetooth называет ещё два слоя, расположенных между канальным уровнем и GAP/GATT: Host Controller Interface (HCI) – протокол, который хост-процессор использует для управления отдельным радиочипом, – и L2CAP – мультиплексор, разбивающий одно подключение канального уровня на несколько логических каналов.

Ни один из них не виден в API aioble, но ни один и не исчезает. HCI находится внутри BLE-порта и невидим, если не задействована специальная сборка MicroPython, а L2CAP – это носитель, поверх которого работает GATT. Приложение, которому нужны потоки необработанных байтов, может занять собственный канал L2CAP (Каналы L2CAP).