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 ГГц. Вибір каналу, модуляція, потужність передачі. Завдання камери – бути увімкненою; кремній робить усе інше.

Канальний рівень. Передача пакетів між двома пристроями, що погодилися спілкуватися. Додає адреси пристроїв, щоб кожен пакет міг бути направлений до конкретного сусіда, планує регулярні радіоподії, що складають з’єднання, та обробляє повторну передачу пакетів, не підтверджених отримувачем.

Generic Access Profile (GAP). Рівень виявлення та підключення. Визначає чотири ролі – broadcaster, observer, peripheral, central – та протокол реклами / сканування, що дозволяє двом пристроям знайти один одного, а також процедуру відкриття та закриття з’єднання між ними. Тут живуть адреси, рекламні пакети, параметри підключення та сполучення.

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

Застосунок. Те, що камера і партнер погоджуються означати цими байтами. Bluetooth SIG публікує стандартні профілі – частота серцебиття, рівень заряду батареї, датчики навколишнього середовища – що визначають широко використовувані характеристики для взаємодії непов’язаних пристроїв, але будь-який застосунок може визначати власні.

11.2.1. Як рівні взаємодіють під час виконання

Шаблон відповідає мережевому стеку:

  • Байти застосунку поміщаються у значення характеристики.

  • GATT додає заголовок, що ідентифікує, якій характеристиці належать байти.

  • GAP підтримує відкрите з’єднання, щоб GATT мав куди відправляти.

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

  • Фізичний рівень перетворює пакет у короткий спалах радіохвиль на частоті 2,4 ГГц.

Фізичний рівень та канальний рівень майже невидимі з Python – кремній та мікропрограма радіо обробляють їх. Починаючи від GAP і вище, Python-код камери отримує більший контроль.

11.2.2. Два рівні, які користувацький API непомітно пропускає

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

Жоден з них не видимий у API aioble, але жоден не зникає. HCI знаходиться всередині BLE-порту і невидимий, якщо не використовується нестандартна збірка MicroPython, а L2CAP – це носій, поверх якого працює GATT. Застосунок, що потребує потоків сирих байтів, може зайняти власний L2CAP-канал (Канали L2CAP).