11.2. Стек BLE

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

Вертикальный стек из пяти подписанных блоков. Снизу вверх: Physical (радио), Link Layer, GAP, GATT, Application. Стрелка справа указывает вверх по стеку с подписью "что мы строим". Стрелка слева указывает вниз по стеку с подписью "что предоставляется".

Стек 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).