11.2. Стек BLE¶
Подобно сетевым технологиям, Bluetooth Low Energy построен как стек слоёв, каждый из которых решает одну задачу и предоставляет чистую абстракцию вышележащему слою. Приведённые ниже названия взяты прямо из спецификации Bluetooth Core и встречаются в API aioble и bluetooth.
Стек 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).