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 требует учёта background modes. Фоновый режим 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("Found: \(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: ${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 года. Мы проконсультируем вас и предложим наилучшее решение.