11.3. Радіо та канальний рівень¶
Два нижніх рівні стеку BLE майже повністю автоматичні з точки зору Python – радіочіп та рівні, на яких працює MicroPython, обробляють усе: від вибору каналу до повторної передачі втраченого пакету. Три з рішень, які вони приймають, все ж проявляються в API для користувача: потужність, дальність і пропускна здатність.
11.3.1. Радіо¶
BLE використовує той самий промислово-науково-медичний (ISM) діапазон 2,4 ГГц, що й Wi-Fi, мікрохвильові печі та більшість інших бездротових пристроїв малого радіусу дії. Діапазон розділений на 40 каналів шириною 2 МГц кожен.
Три з 40 каналів зарезервовані для реклами – коротких трансляцій, що анонсують присутність пристрою для всіх слухачів. Вони розосереджені по всьому діапазону, щоб слухач міг швидко охопити всі три і щоб перешкоди на будь-якому одному з них навряд чи повністю вимкнули пристрій з ефіру.
Тридцять сім – це дата-канали. Після підключення двох пристроїв вони обмінюються пакетами на них, перестрибуючи між ними за псевдовипадковою послідовністю, про яку сторони домовляються під час підключення. Адаптивне перескакування частот дозволяє будь-якій стороні позначити канал як поганий (сильні перешкоди Wi-Fi, мікрохвильова піч, сусідня BLE-мережа), щоб послідовність його пропускала.
40 BLE-каналів у діапазоні 2,4 ГГц. Три призначені для реклами, решта несуть трафік у відкритому з’єднанні.¶
Радіо передає короткі пакети – щонайбільше кілька мілісекунд – і між ними спить. Саме цей сон робить технологію низькоенергетичною. Типовий BLE peripheral витрачає добре менше одного відсотка свого часу на фактичну передачу; решту часу радіо вимкнено між запланованими подіями.
11.3.2. Канальний рівень¶
Канальний рівень – це найменша одиниця BLE, що спілкується зі своїм аналогом на іншому пристрої. Він виконує чотири завдання.
Кадрування пакетів. Кожен пакет містить короткий заголовок (адреса доступу до каналу, довжина пакету, керуючі біти), корисне навантаження і CRC. Отримувач перевіряє CRC і відкидає все пошкоджене.
Адресація. Кожен BLE-пристрій має 48-бітну адресу пристрою, що ідентифікує його в радіомережі. Деякі є публічними – апаратний ідентифікатор, призначений виробником, відстежуваний назавжди. Деякі є випадковими – генеруються на пристрої, змінюються періодично і необов’язково зашифровані так, щоб підслуховувач не міг пов’язати дві передачі з одним фізичним пристроєм. Адреси знову з’являються у Рекламування та сканування.
Планування з’єднання. Після підключення двох пристроїв канальний рівень планує періодичні радіоподії за послідовністю перескакування – з фіксованим інтервалом з’єднання між ними – і упаковує всі дані, що чекають на рівні GATT вище, в кожну. Обидві сторони повертаються до сну між подіями. Інтервал з’єднання – це параметр, який застосунок може запросити (див. З’єднання).
Надійність. Кожен пакет у з’єднанні підтверджується іншою стороною. Канальний рівень повторно надсилає все, що не отримало відповіді, тому рівні вище бачать упорядкований, без втрат потік байтів. На відміну від UDP – відправ пакет і сподівайся на краще на стороні мережі, BLE не має окремого ненадійного режиму при нормальному використанні – кожен пакет у відкритому з’єднанні повторно надсилається, поки не дійде або поки зв’язок не буде визнано втраченим.
Канальний рівень також є місцем, де працює шифрування після того, як пара пристроїв домовилась про ключ під час сполучення (див. Сполучення і зв’язування). Кожен пакет на зашифрованому каналі розшифровується у отримувача до того, як рівні вище його побачать.
11.3.4. Що Python бачить з усього цього¶
Майже нічого. API bluetooth та aioble не надають доступу до каналів, послідовностей перескакування, CRC пакетів або таймерів повторної передачі; все це обробляється всередині BLE-порту та радіо. Частини, що все ж проявляються, – це ті, які надає узгодження під час підключення – інтервал з’єднання, MTU, тип адреси.