Bluetooth Low Energy (BLE) в мобильной разработке: что это, какие протоколы и как работает

Автор: IT Sectr Опубликовано: 2026-07-25 Время чтения: 11 мин

Bluetooth Low Energy (BLE) — стандарт беспроводной связи, оптимизированный для передачи небольших объёмов данных при минимальном энергопотреблении. По данным Bluetooth SIG, 2025, технология используется более чем в 5 миллиардах устройств по всему миру. GATT (Generic Attribute Profile) организует данные в иерархию Service → Characteristic → Descriptor, которая лежит в основе всех BLE-приложений для iOS и Android.

Главное

  • GATT — протокол обмена данными в Bluetooth Low Energy с иерархией Service → Characteristic → Descriptor
  • Core Bluetooth — фреймворк Apple для работы с BLE на iOS, основанный на CBCentralManager и CBPeripheral
  • BluetoothGatt — основной API для BLE-соединений на Android через BluetoothLeScanner
  • iBeacon — протокол BLE-маяков Apple с нативной поддержкой через CLLocationManager на iOS
  • Bonding — постоянное шифрованное соединение, исключающее повторное сканирование и спаривание

Что такое Bluetooth Low Energy (BLE) и как он работает?

Bluetooth Low Energy (BLE) работает по модели клиент-сервер с двумя ролями: Central (мобильное устройство) и Peripheral (устройство). Central сканирует эфир и инициирует подключение, а Peripheral передаёт данные. В отличие от Classic Bluetooth, BLE не предназначен для аудиопотоков — его задача передавать маленькие пакеты с минимальным энергопотреблением. По данным Bluetooth SIG Core Specification 5.4 (2025), BLE поддерживает скорость до 2 Мбит/с при токе менее 15 мА в активном режиме.

Иерархия GATT: Service, Characteristic, Descriptor

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).

Advertising Data и Scan Response

BLE-устройства передают рекламные пакеты (advertising packets) для обнаружения. Advertising Data содержит имя устройства, UUID сервисов, RSSI и Manufacturer Specific Data. Размер рекламного пакета ограничен 31 байтом. Для передачи дополнительных данных используется Scan Response — второй пакет, который центральное устройство запрашивает после обнаружения.

BLE на iOS: Core Bluetooth, CBCentralManager, CBPeripheral

На 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.

Пример сканирования BLE на Swift

swift
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 вызывается при каждом найденном устройстве.

Подключение и чтение характеристик в Core Bluetooth

После обнаружения устройства нужно вызвать connect и discoverServices. CBPeripheralDelegate предоставляет методы для обработки каждого шага: didDiscoverServices, didDiscoverCharacteristics, didUpdateValueFor. Каждый метод асинхронный — данные приходят через делегатные callback'и. RSSI (Received Signal Strength Indicator) показывает уровень сигнала: чем ближе значение к 0, тем сильнее сигнал.

BLE на Android: BluetoothAdapter, BluetoothGatt, BluetoothLeScanner

На 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.

Пример сканирования BLE на Kotlin

kotlin
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: чтение и уведомления на Android

После создания BluetoothGatt через connectGatt приложение вызывает discoverServices. BluetoothGattCallback содержит onServicesDiscovered, onCharacteristicRead, onCharacteristicChanged. Для получения уведомлений об изменениях характеристики нужно вызвать setCharacteristicNotification. Процесс требует внимательности: каждая операция GATT асинхронна, и результат приходит в отдельном callback'е.

iBeacon, Bonding и Advertising Data в экосистеме BLE

iBeacon — технология Apple для BLE-маяков, передающих UUID, Major и Minor. Устройство-маяк транслирует рекламный пакет, мобильное приложение на основе этих данных определяет местоположение и расстояние. На iOS iBeacon поддерживается нативно через CLLocationManager. На Android требуется сторонняя библиотека (например, AltBeacon или Android iBeacon Library).

Bonding — процедура создания постоянного защищённого соединения между BLE-устройствами. После Bonding ключи шифрования сохраняются, и устройства подключаются автоматически при повторном сближении. На iOS bonding управляется системой автоматически. На Android — через BluetoothDevice.createBond(). Bonding важен для носимых устройств и фитнес-трекеров, где требуется быстрое переподключение.

Рекламные пакеты и Manufacturer Specific Data

Advertising Data — ключевой механизм обнаружения в Bluetooth Low Energy. Производители устройств могут добавлять Manufacturer Specific Data в рекламный пакет для передачи кастомных данных. Формат пакета включает Company Identifier (2 байта) и произвольные данные. На iOS CBCentralManager принимает массив UUID сервисов для фильтрации — это экономит батарею. На Android ScanFilter работает по тому же принципу.

Сравнение iOS и Android для BLE-разработки

ПараметрiOS (Core Bluetooth)Android (BluetoothGatt)
МенеджерCBCentralManagerBluetoothLeScanner
Соединениеconnect(to:)connectGatt()
СервисыdiscoverServices()discoverServices()
ЧтениеreadValue(for:)readCharacteristic()
УведомленияsetNotifyValue(_:for:)setCharacteristicNotification()
РазрешенияАвтоматическиBLUETOOTH_SCAN, BLUETOOTH_CONNECT
iBeaconCLLocationManager (нативно)AltBeacon / библиотеки

Оптимизация BLE: MTU, Connection Interval и фоновый режим

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 и Android

iOS поддерживает BLE в фоновом режиме через Background Modes, но с ограничениями. Приложение в фоне получает уведомления от характеристик, но не может активно сканировать. Система перезапускает сканирование при изменении地理位置. На Android фоновое сканирование требует Foreground Service с постоянным уведомлением. Без него мобильная система убьёт процесс при свёртывании приложения.

Практические рекомендации по оптимизации

Для надёжной работы BLE в мобильных приложениях следуйте этим правилам. Используйте notify вместо polling — характеристика с уведомлениями отправляет данные при изменении, что экономит батарею. Устанавливайте оптимальный MTU в начале соединения. Фильтруйте устройства по UUID сервиса при сканировании. Проверяйте совместимость BLE-стека на разных моделях — производители (Xiaomi, Huawei, Samsung) вносят изменения, влияющие на поведение Bluetooth.

Часто задаваемые вопросы

Чем BLE отличается от классического Bluetooth?

Bluetooth Low Energy (BLE) оптимизирован для периодической передачи малых пакетов с низким энергопотреблением. Classic Bluetooth предназначен для аудиопотоков и непрерывной передачи больших объёмов данных.

Что такое GATT в Bluetooth Low Energy?

GATT (Generic Attribute Profile) — протокол обмена данными в BLE, определяющий иерархию Service → Characteristic → Descriptor. GATT используется для чтения, записи и получения уведомлений от BLE-устройств.

Почему на Android нужно разрешение ACCESS_FINE_LOCATION для BLE?

До Android 12 сканирование BLE могло использоваться для определения местоположения, поэтому Google объединила эти разрешения. С Android 12 появилось отдельное разрешение BLUETOOTH_SCAN без привязки к геолокации.

Как увеличить скорость передачи данных по BLE?

Увеличьте MTU через requestMtu() на Android и maximumWriteValueLength на iOS. Connection Interval также влияет на скорость — чем он меньше, тем быстрее передача. Оптимальное сочетание даёт прирост до 10 раз.

Что такое Bonding в BLE?

Bonding — процедура создания постоянного защищённого соединения между BLE-устройствами. После Bonding ключи шифрования сохраняются, и устройства подключаются автоматически без повторного поиска.

Итоги

  • Bluetooth Low Energy — стандарт беспроводной связи для IoT с минимальным энергопотреблением и скоростью до 2 Мбит/с
  • GATT организует данные в иерархию Service → Characteristic → Descriptor с UUID для каждого элемента
  • Core Bluetooth — фреймворк Apple для BLE на iOS с CBCentralManager, CBPeripheral и background modes
  • BluetoothGatt — основной API Android с BluetoothAdapter, BluetoothLeScanner и явными разрешениями BLUETOOTH_SCAN
  • iBeacon — технология BLE-маяков с нативной поддержкой на iOS через CLLocationManager
  • Bonding обеспечивает автоматическое переподключение после сохранения ключей шифрования
  • Bluetooth Low Energy в мобильных приложениях требует учёта MTU, Connection Interval и фоновых ограничений платформ

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект