Bluetooth Low Energy (BLE) — стандарт бездротового зв'язку, оптимізований для передачі невеликих обсягів даних з мінімальним енергоспоживанням. За даними Bluetooth SIG, 2025, технологія використовується більш ніж у 5 мільярдах пристроїв по всьому світу. GATT (Generic Attribute Profile) організовує дані в ієрархію Service → Characteristic → Descriptor, яка лежить в основі всіх BLE-додатків для iOS та Android.
Головне
Bluetooth Low Energy (BLE) працює за моделлю клієнт-сервер з двома ролями: Central (мобільний пристрій) та Peripheral (пристрій). Central сканує ефір та ініціює підключення, а Peripheral передає дані. На відміну від Classic Bluetooth, BLE не призначений для аудіопотоків — його завдання передавати маленькі пакети з мінімальним енергоспоживанням. За даними Bluetooth SIG Core Specification 5.4 (2025), BLE підтримує швидкість до 2 Мбіт/с при струмі менше 15 мА в активному режимі.
GATT (Generic Attribute Profile) визначає структуру даних Bluetooth Low Energy. Service — логічна група характеристик (наприклад, Heart Rate Service 0x180D). Characteristic — точка даних з конкретним значенням. Descriptor — метадані характеристики, включаючи CCCD для керування сповіщеннями. Кожен елемент має UUID — 16-бітний для стандартних профілів Bluetooth SIG або 128-бітний для кастомних.
Bluetooth Low Energy в мобільних додатках використовує цю ієрархію для організації обміну даними між смартфоном та периферією. Правильне розуміння GATT — основа розробки BLE-додатків на обох платформах. Розробник повинен знати UUID сервісів та характеристик пристрою, а також властивості кожної характеристики (read, write, notify, indicate).
BLE-пристрої передають рекламні пакети (advertising packets) для виявлення. Advertising Data містить ім'я пристрою, UUID сервісів, RSSI та Manufacturer Specific Data. Розмір рекламного пакета обмежений 31 байтом. Для передачі додаткових даних використовується Scan Response — другий пакет, який центральний пристрій запитує після виявлення.
На iOS за Bluetooth Low Energy відповідає фреймворк Core Bluetooth. CBCentralManager керує скануванням та підключенням, CBPeripheral представляє віддалений BLE-пристрій. Процес стандартний: ініціалізація CBCentralManager, перевірка стану poweredOn, запуск scanForPeripherals, підключення та виявлення сервісів. Core Bluetooth автоматично керує живленням радіомодуля — якщо BLE не використовується, він вимикається.
BLE в мобільній розробці на iOS вимагає врахування фонових режимів. Фоновий режим Core Bluetooth вмикається через Capabilities проекту (Uses Bluetooth LE accessories). У фоні додаток може отримувати сповіщення від характеристик, але сканування обмежене — система перезапускає його тільки при русі пристрою. Для iBeacon фонове сканування працює активніше через CLLocationManager.
import CoreBluetooth
class DeviceScanner: NSObject, CBCentralManagerDelegate {
var centralManager: CBCentralManager!
func start() {
centralManager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
guard central.state == .poweredOn else { return }
central.scanForPeripherals(withServices: nil, options: nil)
}
func centralManager(_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber) {
print("Знайдено: \(peripheral.name ?? "unknown")")
}
}
У цьому прикладі CBCentralManagerDelegate обробляє всі події BLE-з'єднання. Метод centralManagerDidUpdateState перевіряє, чи ввімкнено Bluetooth на мобільному пристрої. Після успішної ініціалізації запускається сканування. Callback didDiscover викликається для кожного знайденого пристрою.
Після виявлення пристрою потрібно викликати connect та discoverServices. CBPeripheralDelegate надає методи для обробки кожного кроку: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor. Кожен метод асинхронний — дані приходять через делегатні callback'и. RSSI (Received Signal Strength Indicator) показує рівень сигналу: чим ближче значення до 0, тим сильніший сигнал.
На Android Bluetooth Low Energy реалізується через пакет android.bluetooth. BluetoothAdapter — точка входу для всіх BLE-операцій. BluetoothLeScanner запускає сканування з callback'ами ScanCallback. Після виявлення пристрою створюється BluetoothGatt — з'єднання з периферією. BluetoothGattCallback обробляє події: підключення, виявлення сервісів, читання характеристик, зміна RSSI.
Bluetooth Low Energy в мобільних додатках на Android вимагає явного запиту дозволів BLUETOOTH_SCAN, BLUETOOTH_CONNECT та ACCESS_FINE_LOCATION. З Android 12 дозволи розділені: BLUETOOTH_SCAN для сканування, BLUETOOTH_CONNECT для підключення. ACCESS_FINE_LOCATION потрібен тільки для сканування певних типів пристроїв. Без цих дозволів додаток не зможе працювати з BLE.
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter) {
fun startScan() {
val scanner = bluetoothAdapter.bluetoothLeScanner
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build()
scanner.startScan(null, settings, scanCallback)
}
private val scanCallback = object : ScanCallback() {
override fun onScanResult(callbackType: Int, result: ScanResult) {
val device = result.device
val rssi = result.rssi
Log.d("BLE", "Пристрій: ${device.name}, RSSI: $rssi")
}
}
}
ScanSettings дозволяє налаштувати режим сканування: LOW_POWER для економії батареї, BALANCED для стандартних завдань, LOW_LATENCY для максимальної швидкості виявлення. ScanFilter звужує пошук за UUID сервісу, імені пристрою або MAC-адресі. Фільтрація знижує енергоспоживання та прискорює виявлення потрібного пристрою.
Після створення BluetoothGatt через connectGatt додаток викликає discoverServices. BluetoothGattCallback містить onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged. Для отримання сповіщень про зміни характеристики потрібно викликати setCharacteristicNotification. Процес вимагає уважності: кожна операція GATT асинхронна, і результат приходить в окремому callback'і.
iBeacon — технологія Apple для BLE-маяків, що передають UUID, Major та Minor. Пристрій-маяк транслює рекламний пакет, мобільний додаток на основі цих даних визначає місцезнаходження та відстань. На iOS iBeacon підтримується нативно через CLLocationManager. На Android потрібна стороння бібліотека (наприклад, AltBeacon або Android iBeacon Library).
Bonding — процедура створення постійного захищеного з'єднання між BLE-пристроями. Після Bonding ключі шифрування зберігаються, і пристрої підключаються автоматично при повторному зближенні. На iOS bonding керується системою автоматично. На Android — через BluetoothDevice.createBond(). Bonding важливий для носимих пристроїв та фітнес-трекерів, де потрібне швидке перепідключення.
Advertising Data — ключовий механізм виявлення в Bluetooth Low Energy. Виробники пристроїв можуть додавати Manufacturer Specific Data в рекламний пакет для передачі кастомних даних. Формат пакета включає Company Identifier (2 байти) та довільні дані. На iOS CBCentralManager приймає масив UUID сервісів для фільтрації — це економить батарею. На Android ScanFilter працює за тим же принципом.
| Параметр | iOS (Core Bluetooth) | Android (BluetoothGatt) |
|---|---|---|
| Менеджер | CBCentralManager | BluetoothLeScanner |
| З'єднання | connect(to:) | connectGatt() |
| Сервіси | discoverServices() | discoverServices() |
| Читання | readValue(for:) | readCharacteristic() |
| Сповіщення | setNotifyValue(_:for:) | setCharacteristicNotification() |
| Дозволи | Автоматично | BLUETOOTH_SCAN, BLUETOOTH_CONNECT |
| iBeacon | CLLocationManager (нативно) | AltBeacon / бібліотеки |
MTU (Maximum Transmission Unit) — максимальний розмір одного пакета даних Bluetooth Low Energy. За замовчуванням MTU дорівнює 23 байтам (3 байти заголовка + 20 байт даних). Збільшення MTU до 512 байт значно прискорює передачу при обміні конфігураціями або логами. На iOS maximumWriteValueLength показує доступний MTU. На Android для збільшення MTU використовується requestMtu().
Connection Interval — частота, з якою центральний пристрій опитує периферію. Чим частіше інтервал, тим вища швидкість передачі, але й енергоспоживання. Типові значення — від 7.5 мс до 4 секунд. Для фітнес-трекерів достатньо 100 мс, для аудіо — 7.5 мс. BLE в мобільній розробці вимагає балансу між швидкістю передачі та часом автономної роботи пристрою.
iOS підтримує BLE у фоновому режимі через Background Modes, але з обмеженнями. Додаток у фоні отримує сповіщення від характеристик, але не може активно сканувати. Система перезапускає сканування при зміні місцезнаходження. На Android фонове сканування вимагає Foreground Service з постійним сповіщенням. Без нього мобільна система вб'є процес при згортанні додатка.
Для надійної роботи BLE в мобільних додатках слідуйте цим правилам. Використовуйте notify замість polling — характеристика з сповіщеннями відправляє дані при зміні, що економить батарею. Встановлюйте оптимальний MTU на початку з'єднання. Фільтруйте пристрої за UUID сервісу при скануванні. Перевіряйте сумісність BLE-стека на різних моделях — виробники (Xiaomi, Huawei, Samsung) вносять зміни, що впливають на поведінку Bluetooth.
Часті запитання
Bluetooth Low Energy (BLE) оптимізований для періодичної передачі малих пакетів з низьким енергоспоживанням. Classic Bluetooth призначений для аудіопотоків та безперервної передачі великих обсягів даних.
GATT (Generic Attribute Profile) — протокол обміну даними в BLE, що визначає ієрархію Service → Characteristic → Descriptor. GATT використовується для читання, запису та отримання сповіщень від BLE-пристроїв.
До Android 12 сканування BLE могло використовуватися для визначення місцезнаходження, тому Google об'єднала ці дозволи. З Android 12 з'явився окремий дозвіл BLUETOOTH_SCAN без прив'язки до геолокації.
Збільште MTU через requestMtu() на Android та maximumWriteValueLength на iOS. Connection Interval також впливає на швидкість — чим він менший, тим швидша передача. Оптимальне поєднання дає приріст до 10 разів.
Bonding — процедура створення постійного захищеного з'єднання між BLE-пристроями. Після Bonding ключі шифрування зберігаються, і пристрої підключаються автоматично без повторного пошуку.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.