Bluetooth та Bluetooth Low Energy — стандарти бездротового зв'язку для передачі даних на короткі відстані. Bluetooth Classic (BR/EDR) забезпечує стабільний потоковий канал для аудіо та файлів, а BLE оптимізований для енергоефективної роботи з датчиками та периферією. За даними Bluetooth SIG, 2025, щорічно відвантажується понад 5 мільярдів пристроїв з підтримкою BLE — стандарт став основою IoT, носимось електроніки та мобільних аксесуарів.
Головне
Bluetooth — це стандарт бездротової персональної мережі (WPAN), що працює в ISM-діапазоні 2.4 ГГц та призначений для зв'язку пристроїв на відстані до 100 метрів. Специфікація IEEE 802.15.1 визначає фізичний та MAC-рівні, а стек Bluetooth SIG — профілі верхнього рівня для конкретних сценаріїв: аудіогарнітури (HSP), передачі файлів (OPP), введення з клавіатури (HID).
Стандарт розділився на дві гілки з версії 4.0 (2010 рік): Bluetooth Classic (BR/EDR — Basic Rate / Enhanced Data Rate) та Bluetooth Low Energy (BLE, раніше Bluetooth Smart). Classic орієнтований на безперервні потоки — аудіодзвінки, музику, файли. BLE створений для застосунків, де дані передаються короткими пакетами з паузами в десятки секунд або хвилин — пульсометри, мітки, датчики температури.
За даними Bluetooth SIG (2025), 99% нових смартфонів підтримують обидві версії, а екосистема BLE налічує понад 15 типів профілів від Blood Pressure до Environmental Sensing.
Вибір між Classic та BLE визначається сценарієм: для потокової передачі аудіо підходить тільки Classic, для опитування датчика раз на годину — тільки BLE. BR/EDR використовує 79 каналів з кроком 1 МГц та адаптивну частотну модуляцію (AFH), забезпечуючи стійкість до перешкод Wi-Fi.
| Параметр | Bluetooth Classic (BR/EDR) | Bluetooth Low Energy (BLE) |
|---|---|---|
| Швидкість передачі | 1–3 Мбіт/с (EDR) | 125 кбіт/с – 2 Мбіт/с (LE 2M PHY) |
| Піковий струм | 10–30 мА | 5–15 мА |
| Час виходу в ефір | ~100 мс | ~3 мс |
| Топологія | Piconet (1 master, до 7 slaves) | Broadcaster / Observer / Peripheral / Central |
| Профілі | HFP, A2DP, HSP, SPP, OPP | GATT-основані (HRS, BLS, CTS та ін.) |
| Типові пристрої | Гарнітури, колонки, автомобільні hands-free | Фітнес-браслети, мітки, пульсометри, IoT-сенсори |
| Сумісність | Не сумісний з BLE на фізичному рівні | Дворежимні чіпи підтримують обидва стеки |
BLE 5.x додав LE Coded PHY для збільшення дальності до 1 км (на відкритій місцевості) та LE Audio з LC3-кодеком — нова версія поступово розмиває межу між Classic та BLE для аудіосценаріїв.
Стек BLE розділений на три рівні: Controller (фізичний та link-рівні), Host (L2CAP, ATT, GATT, Security Manager) та Application (реалізація профілю в додатку). Такий поділ дозволяє виробнику чіпа реалізувати Controller у firmware, а розробнику мобільного додатку — працювати тільки з GATT-абстракціями.
Link Layer (LL) керує часом ефіру: пристрій перемикається між станами Standby, Advertising, Scanning, Initiating та Connection. У Connected-стані Central та Peripheral домовляються про connection interval — частоту, з якою обмінюються пакетами даних. Типовий інтервал — 7.5–1000 мс; чим частіше обмін, тим вища пропускна здатність та більше енергоспоживання.
Security Manager (SM) реалізує шифрування AES-128 з обміном ключами через протокол pairing. Розрізняють три режими: Just Works (без введення PIN), Passkey Entry (6-значний код на екрані) та OOB (NFC або QR). Для носимих пристроїв зазвичай використовується Just Works, для медичних — OOB з додатковою верифікацією.
За даними Bluetooth Core Specification 5.4 (2023), час встановлення захищеного з'єднання в режимі LE Secure Connections не перевищує 300 мс при connection interval 30 мс.
Протокол ATT (Attribute Protocol) — базова транспортна модель, в якій сервер (периферійний пристрій) зберігає атрибути, а клієнт (смартфон) читає або записує їх. GATT (Generic Attribute Profile) надбудовує над ATT ієрархію: Service → Characteristic → Descriptor.
Кожен сервіс — це логічна група характеристик, що описує одну функцію пристрою: Heart Rate Service (UUID 0x180D) містить характеристику Heart Rate Measurement (UUID 0x2A37) з Descriptor Client Characteristic Configuration (0x2902), що керує нотифікаціями. Розробник мобільного додатку отримує список сервісів через discoverServices(), потім знаходить потрібну характеристику за UUID та підписується на сповіщення.
BLE використовує 16-бітні UUID для стандартизованих сервісів Bluetooth SIG та 128-бітні UUID для кастомних сервісів виробника. Наприклад, чохол-трекер може визначити сервіс A000-… з характеристикою для передачі рівня заряду своєї батареї.
private val gattCallback = object BluetoothGattCallback() {
override fun onServicesDiscovered(
gatt: BluetoothGatt, status: Int
) {
val service = gatt.getService(UUID.fromString("0000180d-0000-1000-8000-00805f9b34fb"))
val char = service?.getCharacteristic(
UUID.fromString("00002a37-0000-1000-8000-00805f9b34fb")
)
gatt.setCharacteristicNotification(char, true)
}
override fun onCharacteristicChanged(
gatt: BluetoothGatt, char: BluetoothGattCharacteristic
) {
val heartRate = char.getIntValue(BluetoothGattCharacteristic.FORMAT_UINT8, 1)
updateUi("Пульс: $heartRate уд/мин")
}
}
У прикладі додаток знаходить сервіс Heart Rate за стандартним UUID Bluetooth SIG, отримує характеристику вимірювання пульсу та підписується на її нотифікації — при кожній зміні пульсу периферійний пристрій надсилає дані без явного запиту від Central.
Advertising — ключовий механізм BLE, при якому Peripheral-пристрій періодично надсилає широкомовні пакети (advertising PDUs) на трьох первинних каналах (37, 38, 39). Центральний пристрій сканує ці канали, отримує advertising-дані та може ініціювати з'єднання.
Advertising-пакет містить до 31 байта корисного навантаження: flags, TX power level, local name, UUID сервісів, manufacturer-specific data. Цього достатньо для передачі показників датчика без встановлення з'єднання — режим Connectionless (Broadcaster-тип). Для постійної передачі даних (наприклад, температури раз на хвилину) використовується з'єднання з connection interval до 1000 мс.
На мобільній платформі сканування запускається через startScan() (Android) або scanForPeripherals() (iOS). Фільтрація за UUID сервісу дозволяє не витрачати енергію на обробку всіх видимих пристроїв — додаток отримує callback тільки для цікавих міток або датчиків.
import CoreBluetooth
class ScannerViewController: UIViewController {
private var centralManager: CBCentralManager!
override func viewDidLoad() {
centralManager = CBCentralManager(
delegate: self, queue: nil
)
}
func centralManagerDidUpdateState(central: CBCentralManager) {
if central.state == .poweredOn {
centralManager.scanForPeripherals(
withServices: nil, options: nil
)
}
}
func centralManager(
central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String : Any],
rssi RSSI: NSNumber
) {
if let name = advertisementData[CBAdvertisementDataLocalNameKey] {
print("Найдено устройство: \(name)")
}
}
}
Після виявлення пристрою Central викликає connect(), передаючи об'єкт CBPeripheral. Connection-параметри (interval, latency, supervision timeout) узгоджуються на рівні Link Layer — розробник не керує ними безпосередньо, але може впливати через requestConnectionPriority на Android.
Обидві мобільні платформи надають нативні API для роботи з BLE. Core Bluetooth (iOS) використовує делегатний підхід: центральний менеджер ініціює операції, а периферійний об'єкт повідомляє про результати через делегатні методи. android.bluetooth (Android) побудований на callback-інтерфейсах та підтримує паралельні GATT-операції з кількома пристроями.
Ключові відмінності між платформами:
За даними тестів Bluetooth SIG (2024), час з'єднання BLE смартфона з фітнес-браслетом становить в середньому 150–300 мс на Android та 100–250 мс на iOS — різниця обумовлена політиками управління радіочастотним модулем.
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
class BleService {
final FlutterBluePlus fbp = FlutterBluePlus();
Future<void> scanAndConnect(String deviceName) async {
await fbp.startScan(timeout: Duration(seconds: 15));
await for (final result in fbp.scanResults) {
if (result.device.advName == deviceName) {
await fbp.stopScan();
await result.device.connect();
break;
}
}
}
}
Flutter-розробник отримує єдиний API-інтерфейс, під капотом якого flutter_blue_plus транслює виклики в нативні android.bluetooth або Core Bluetooth. Такий підхід скорочує час розробки додатку для роботи з BLE-периферією на обох платформах.
Часті запитання
Bluetooth Classic (BR/EDR) призначений для безперервної потокової передачі — аудіодзвінки, музика, передача файлів. BLE оптимізований для коротких пакетів даних з мінімальним енергоспоживанням — датчики, мітки, фітнес-трекери. Classic споживає 10–30 мА, BLE — 5–15 мА в піку.
На фізичному рівні вони несумісні — різна модуляція та канальна карта. Однак більшість сучасних чіпів є дворежимними (dual-mode) та реалізують обидва стеки. Смартфон з дворежимним чипом може одночасно спілкуватися з Classic-гарнітурою та BLE-трекером.
Connection interval — проміжок часу між двома пакетами даних у встановленому з'єднанні. Значення варіюється від 7.5 мс до 4 секунд. Чим менший інтервал, тим вища пропускна здатність та більше енергоспоживання. Для датчика температури раз на хвилину використовується інтервал 1000 мс.
Pairing — процес обміну ключами шифрування між Central та Peripheral. BLE підтримує три методи: Just Works (без підтвердження), Passkey Entry (введення PIN на екрані) та OOB (обмін через NFC або QR). Після pairing пристрої зберігають ключі (bonding) та при повторному з'єднанні не запитують повторну аутентифікацію.
Найпоширеніші: Heart Rate Profile (0x180D) для пульсометрів, Blood Pressure Profile (0x1810) для тонометрів, Environmental Sensing (0x181A) для датчиків температури та вологості, Battery Service (0x180F) для рівня заряду, Device Information (0x180A) для моделі та серійного номера.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також