undefined
Главно
Bluetooth — е стандарт за безжична персонална мрежа (WPAN), работещ в ISM лента 2,4 GHz и предназначен за комуникация между устройства на разстояние до 100 метра. Спецификацията IEEE 802.15.1 определя физичното и MAC ниво, а стекът на Bluetooth SIG определя профилите на по-високо ниво за конкретни сценарии: аудио слушалки (HSP), пренос на файлове (OPP), клавиатурен вход (HID).
Стандартът се раздели на два клона от версия 4.0 (2010 г.): Bluetooth Classic (BR/EDR) и 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 MHz и адаптивна честотна модулация (AFH), осигуряваща устойчивост на смътките от Wi-Fi.
| Параметър | Bluetooth Classic (BR/EDR) | Bluetooth Low Energy (BLE) |
|---|---|---|
| Скорост на пренос | 1–3 Mbit/s (EDR) | 125 kbit/s – 2 Mbit/s (LE 2M PHY) |
| Пиков ток | 10–30 mA | 5–15 mA |
| Време на излъчване | ~100 ms | ~3 ms |
| Топология | Piconet (1 master, до 7 slave) | Broadcaster / Observer / Peripheral / Central |
| Профили | HFP, A2DP, HSP, SPP, OPP | Базирани на GATT (HRS, BLS, CTS и др.) |
| Типични устройства | Слушалки, висящи, автомобилни hands-free комплекти | Фитнес гривни, етикети, пулсометри, IoT сензори |
| Съвместимост | Не е съвместим с BLE на физично ниво | Двумодовите чипове подкрепят и двата стека |
BLE 5.x добави LE Coded PHY за увеличаване на обхвата до 1 km (на открито) и LE Audio с кодек LC3 — новата версия постепенно залича границата между Classic и BLE в аудио сценариите.
Стекът на BLE е разделен на три нива: Controller (физично и линково ниво), 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 ms; колкото по-често е обмяната, толкова по-голяма е пропускната способност и консумацията на енергия.
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 ms при connection interval 30 ms.
Протокол на 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 байта полезно товар: флагове, TX power level, локално име, UUID на услугите, данни, специфични за производителя. Това е достатъчно за предаване на показанията на сензорите без установяване на връзка — режим Connectionless (тип Broadcaster). За непрекъснато предаване на данни (напр. температура ведъж минута) се използва връзка с connection interval до 1000 ms.
На мобилната платформа сканирането се запуска чрез 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 обект. Параметрите на връзката (interval, latency, supervision timeout) се договарят на ниво Link Layer — разработчикът не ги управлява директно, но може да повлиява чрез requestConnectionPriority на Android.
И двете мобилни платформи предоставят нативни API за работа с BLE. Core Bluetooth (iOS) използва делегатски подход: централният мениджър инициира операции, а периферийният обект отчита резултатите чрез делегатски методи. android.bluetooth (Android) е изграден върху callback интерфейси и подкрепя паралелни GATT операции с множество устройства.
Ключови разлики между платформите:
Според тестовете на Bluetooth SIG (2024), времето за BLE свързване на смартфон с фитнес гривна е средно 150–300 ms на Android и 100–250 ms на 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 mA, BLE 5–15 mA при пик.
На физично ниво те не са съвместими — различна модулация и канална карта. Повечето от съвременните чипове обаче са двумодови (dual-mode) и изпълняват и двата стека. Смартфон с двумодов чип може едновременно да комуникира с Classic слушалки и BLE трекер.
Connection interval е времевият интервал между два пакета данни в установена връзка. Стойността варира от 7,5 ms до 4 секунди. Колкото по-малък е интервалът, толкова по-голяма е пропускната способност и консумацията на енергия. За температурен сензор ведъж минута се използва интервал от 1000 ms.
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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също