Central — е устройство в архитектурата Bluetooth Low Energy, което инициира сканиране, установява връзка и управлява обмена на данни с периферни устройства. В контекста на мобилната разработка Central е смартфон или таблет с iOS или Android, който се свързва с BLE сензори, фитнес тракери и умни аксесоари. Според Bluetooth Core Specification 5.4 (2023) Central може едновременно да поддържа до 7 връзки с различни Peripheral, въпреки че реалното ограничение зависи от производителя на чипа и версията на операционната система. Core Bluetooth на iOS и android.bluetooth.le на Android предоставят пълно API за управление на ролята Central.
Основни точки
Central — е GATT клиент в архитектурата Bluetooth Low Energy, който инициира всички комуникации. За разлика от Peripheral, което пасивно очаква връзка и рекламира своите услуги, Central активно сканира ефира, открива рекламни пакети и инициира връзка.
Асиметричният модел Central-Peripheral е основна характеристика на BLE. Central управлява логиката на взаимодействие: решава към кое устройство да се свърже, кои услуги да изследва, кои характеристики да чете и записва. Peripheral изпълнява ролята на сървър за данни — съхранява услуги и характеристики, но не инициира връзки.
Според Bluetooth Core Specification 5.4 (2023) устройство може едновременно да бъде Central и Peripheral (dual role). Например смартфон може да бъде Central за фитнес гривна и Peripheral за друг смартфон, прехвърлящ файлове. Едновременната работа и в двете роли обаче увеличава консумацията на енергия и сложността на управление на връзките.
В екосистемата на мобилната разработка ролята Central е най-честият сценарий. Приложението на смартфона търси BLE устройства (сензори, слушалки, гривни), свързва се с тях и получава данни. Разработчикът използва API на операционната система за работа с Central: CBCentralManager в iOS, BluetoothLeScanner и BluetoothGatt в Android.
Сканиране — е първият етап от работата на Central. Устройството слуша BLE радиоканалите (37, 38, 39) за откриване на рекламни пакети, които периодично изпраща Peripheral. Всеки рекламен пакет съдържа име на устройството, списък с UUID на услуги и потребителски данни.
Central може да работи в два режима на сканиране: passive scanning (само приемане на рекламни пакети) и active scanning (изпращане на заявка за сканиране за получаване на допълнителни данни чрез scan response). Passive scanning пести енергия, но дава по-малко информация. Active scanning позволява получаване на пълни данни от рекламния пакет, включително име на устройството и пълен списък с услуги.
Филтриране по UUID — важна оптимизация. Central може да сканира само устройства с определен Service UUID, игнорирайки останалите. Това не само пести енергия, но и опростява логиката на приложението: делегатът получава само подходящи устройства.
import CoreBluetooth
class BLECentralManager: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager!
override init() {
super.init()
centralManager = CBCentralManager(
delegate: self,
queue: nil
)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
if central.state == .poweredOn {
central.scanForPeripherals(
withServices: nil,
options: [
CBCentralManagerScanOptionAllowDuplicatesKey: false
]
)
}
}
}
Управление на връзките — основната отговорност на Central. След откриване на подходящ Peripheral, Central инициира връзка. BLE връзката се установява чрез процедура за установяване на връзка, която включва обмен на параметри: connection interval, slave latency и supervision timeout.
Connection interval определя колко често Central и Peripheral обменят данни след свързване. Интервалът може да бъде от 7.5 ms до 4 секунди. Колкото по-кратък е интервалът, толкова по-голяма е пропускателната способност, но и консумацията на енергия. Slave latency позволява на Peripheral да пропусне няколко събития на връзка за пестене на енергия. Supervision timeout — максималното време без отговор, след което връзката се счита за загубена.
Central отговаря за прекъсване на връзката след приключване на обмена на данни. BLE устройствата обикновено не поддържат връзката постоянно — Central се свързва, получава данни и прекъсва връзката. Това е стандартен модел за IoT сензори: Central сканира, намира температурен сензор, свързва се, чете стойността и прекъсва връзката.
| Параметър | Диапазон | Предназначение | Препоръка |
|---|---|---|---|
| Connection Interval | 7.5 ms – 4 s | Честота на обмен на данни | 30–50 ms за потоци, 1–4 s за редки данни |
| Slave Latency | 0–499 събития | Пропускане на събития от Peripheral | 4–10 за пестене на енергия на сензора |
| Supervision Timeout | 100 ms – 32 s | Таймаут за загуба на връзка | 6–10 секунди за повечето сценарии |
| MTU | 23–517 байта | Размер на ATT пакет | Поискайте максималния при свързване |
Core Bluetooth — рамката на Apple за работа с BLE на iOS и macOS. Класът CBCentralManager предоставя пълно API за имплементиране на ролята Central: сканиране, свързване, управление на връзките. Работата с Central в iOS се основава на делегатски модел: CBCentralManagerDelegate получава събития за промяна на състоянието, откриване на устройства и резултати от свързване.
Основните стъпки на работа на Central в iOS: инициализация на CBCentralManager, проверка на състоянието на Bluetooth, стартиране на сканиране, обработка на открити устройства чрез делегат, свързване с избрано Peripheral, откриване на услуги и характеристики, обмен на данни.
// Свързване с открито Peripheral
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// Запазване на референция към peripheral и свързване
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// Успешно свързване
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOS ограничава фоновата работа на BLE: във фонов режим приложението може да сканира само с определени ключове в Info.plist, а свързаните устройства могат да уведомяват Central за промени в данните. За критични приложения (медицински устройства) използвайте Background Modes с ключ bluetooth-central.
Android предоставя API BluetoothLeScanner за сканиране на BLE устройства и BluetoothGatt за управление на връзките. От Android 5.0 (API 21) BluetoothLeScanner замени остарелия startLeScan. API изисква разрешения BLUETOOTH, BLUETOOTH_ADMIN и ACCESS_FINE_LOCATION (или ACCESS_BACKGROUND_LOCATION за Android 10+).
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// Конфигуриране на сканиране
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// Стартиране на сканиране
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// Свързване с устройство
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
На Android е важно да се вземат предвид ограниченията за сканиране: от Android 7 (API 24) сканирането не може да се стартира повече от 5 пъти за 30 секунди в приложения, които не използват Location. Android 12+ изисква разрешения BLUETOOTH_SCAN, BLUETOOTH_CONNECT и ADVERTISE, както и runtime искане на тези разрешения.
Консумацията на енергия на Central е по-висока от тази на Peripheral поради необходимостта от постоянно сканиране на радиоканалите. Central получава данни чрез BLE пакети, обработва ги, управлява връзки и често извършва изчисления на процесора на приложението. Според Bluetooth SIG сканирането консумира от 30 mA до 100 mA в зависимост от режима.
Съществуват няколко стратегии за пестене на енергия за Central. Интервално сканиране — най-ефективният метод: Central сканира в кратки прозорци (scan window) с дълги паузи (scan interval). Например при scan window 30 ms и scan interval 1000 ms консумацията на енергия се намалява с 97% в сравнение с непрекъснатото сканиране.
Допълнителна оптимизация — филтриране по UUID. Central обработва по-бързо само подходящи рекламни пакети, игнорирайки останалите. Това намалява натоварването на процесора и увеличава времето за работа на устройството с батерия. Също така се препоръчва спиране на сканирането веднага след откриване на желаното устройство и не задържане на връзката по-дълго от необходимото.
Често задавани въпроси
Да, BLE поддържа dual role: устройство може едновременно да бъде Central за едни устройства и Peripheral за други. Например смартфон чете данни от сензор (като Central) и едновременно рекламира собствена услуга (като Peripheral) за прехвърляне на данни към друго устройство.
BLE спецификацията определя лимит от 7 връзки за един Central. На практика ограничението зависи от производителя на чипа: чиповете Nordic nRF52840 поддържат до 20 връзки, а някои бюджетни Bluetooth адаптери — не повече от 3–4.
Причините могат да бъдат различни: сензорът не рекламира (не е в режим advertising), филтърът по UUID е твърде строг, Bluetooth на смартфона е изключен, липсват необходимите разрешения (Location на Android) или сензорът е извън обхват (препоръчва се до 10 метра на закрито).
Не е задължително. За много сценарии се използва моделът connect-and-read: Central сканира, свързва се, чете необходимите данни и прекъсва връзката. Постоянна връзка е нужна само за поточни данни (пулс, ЕКГ) или управление на устройство в реално време.
Използвайте интервално сканиране със съотношение scan window 30–50 ms и scan interval 500–1000 ms. Филтрирайте устройства по UUID, за да обработвате само подходящи рекламни пакети. Спрете сканирането веднага след откриване на желаното Peripheral.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също