Peripheral — устройство в архитектурата Bluetooth Low Energy, което рекламира услугите си чрез advertising пакети и очаква свързване от Central. В IoT екосистемата Peripheral обикновено е устройство с ограничена консумация на енергия: температурен сензор, умна лампа, фитнес гривна, beacon. Bluetooth Core Specification 5.4 (2023) дефинира рекламния протокол: Peripheral периодично изпраща advertising пакети, съдържащи името на устройството, списък на услугите и потребителски данни, а Central сканира тези пакети и решава дали да се свърже. След установяване на връзката, Peripheral действа като GATT сървър, предоставяйки услуги и характеристики за четене и запис.
Основни точки
Peripheral — BLE устройство, което имплементира GATT сървър и рекламира възможностите си чрез advertising канали. За разлика от Central, което активно търси устройства, Peripheral пасивно очаква свързване. Това е асиметричен модел, оптимизиран за енергийна ефективност на устройства с батерийно захранване.
Peripheral може да бъде в няколко режима: advertising (реклама), connected (свързан към Central), sleeping (сън с изключена реклама). В режим advertising, Peripheral периодично изпраща кратки пакети данни, консумирайки минимална енергия. След свързване, Peripheral преминава в режим connected, където обменя данни с Central според договорения connection interval.
Според Bluetooth Core Specification 5.4 (2023), устройството може динамично да превключва между ролите Peripheral и Central, но във всеки момент, за една връзка, ролята е фиксирана. Типичен сценарий: IoT сензор постоянно работи в ролята на Peripheral, а смартфонът управлява връзката като Central.
За разработчика е важно да разбере: Peripheral определя кои услуги и характеристики са налични и управлява достъпа до тях. Структурата на GATT сървъра на Peripheral определя какви данни Central може да чете и какви команди може да записва.
Advertising (реклама) — механизъм, чрез който Peripheral съобщава за присъствието си. Peripheral изпраща advertising пакети на три отделни канала (37, 38, 39) с интервал от 20 ms до 10.24 секунди. Всеки рекламен пакет съдържа фиксирана информация и може да включва опционални данни.
Съществуват два типа рекламни пакети: advertising PDU (основен пакет) и scan response PDU (отговор на заявка от Central). Основният пакет съдържа задължителни полета: тип на пакета, адрес на изпращача, данни. Ако Central изпрати scan request, Peripheral отговаря с допълнителен пакет, съдържащ по-пълна информация — например пълното име на устройството.
Параметрите на advertising влияят на скоростта на откриване и консумацията на енергия. Advertising interval — времето между изпращането на пакети. Колкото по-кратък е интервалът, толкова по-бързо Central открива устройството, но толкова повече енергия консумира Peripheral. Препоръчителен интервал: 100–1000 ms за повечето устройства.
| Параметър | Диапазон | Влияние | Препоръка |
|---|---|---|---|
| Advertising Interval | 20 ms – 10.24 s | Скорост на откриване, енергия | 100–1000 ms за баланс |
| Advertising Channels | 37, 38, 39 | Надеждност на откриване | И 3-те канала задължително |
| Tx Power | −20 – +10 dBm | Обхват, смущения | 0 dBm за вътрешни помещения, +4 dBm за открито |
| Advertising Timeout | 0 – 180 секунди | Продължителност на реклама | 0 (безкрайно) за beacon |
BLE рекламният пакет има ограничение от 31 байта за advertising PDU и още 31 байта за scan response. Вътре в пакета данните са организирани във формат AD Structure (Advertising Data Structure): всяко поле има тип (1 байт), дължина (1 байт) и стойност.
Най-често използваните AD Type: Flags (0x01) — режими на свързване и откриване, Local Name (0x08 или 0x09) — име на устройството, Service UUID List (0x02–0x07) — списък на UUID на услугите, Manufacturer Specific Data (0xFF) — данни на производителя. Правилното опаковане на данни в 31-байтов пакет е важна задача за разработчика на вградени устройства.
За устройства, които трябва да предадат повече данни, съществува extended advertising (BLE 5.0+), което увеличава размера на рекламния пакет до 251 байта и добавя нови типове пакети. Extended advertising също поддържа кодирани канали (coded PHY) за увеличаване на обхвата до 1 km на открито.
При проектиране на рекламния пакет вземете предвид: колкото повече данни има в advertising пакета, толкова по-висока е вероятността от сблъсък с други устройства. За бързо откриване се препоръчва поставяне само на критични данни (Service UUID) в advertising PDU, а допълнителни данни — в scan response.
GATT сървърът на Peripheral съдържа всички услуги и характеристики, които Central може да открие и с които може да взаимодейства. След свързване, Central открива услугите (discover services), след това характеристиките (discover characteristics) и взаимодейства с тях чрез GATT протокола.
Peripheral като GATT сървър трябва правилно да обработва заявки от Central: четене (read request), запис (write request), уведомления (notification) и потвърдени уведомления (indication). Всяка заявка преминава през GATT таблица, където всеки атрибут (услуга, характеристика, дескриптор) има Handle — 16-битов адрес.
Разработчикът на Peripheral определя правата за достъп до всеки атрибут: само четене, само запис, четене и запис, с криптиране или без. За поверителни данни (лична информация, медицински параметри) се препоръчва изискване на криптиране чрез MITM Protection.
CBPeripheralManager — класът Core Bluetooth за имплементиране на ролята Peripheral в iOS. Той управлява GATT сървъра, публикува услуги и характеристики, обработва заявки от Central. За разлика от CBCentralManager, CBPeripheralManager не сканира — само рекламира и обслужва връзки.
Основни стъпки за имплементиране на Peripheral в iOS: инициализиране на CBPeripheralManager, добавяне на услуги чрез add, стартиране на реклама чрез startAdvertising, обработка на заявки от Central чрез делегата CBPeripheralManagerDelegate.
import CoreBluetooth
class BLEPeripheralManager: NSObject, CBPeripheralManagerDelegate {
private var peripheralManager: CBPeripheralManager!
func startAdvertising() {
let advertisementData: [String: Any] = [
CBAdvertisementDataLocalNameKey: "BLE Sensor",
CBAdvertisementDataServiceUUIDsKey: [
CBUUID("180F")
]
]
peripheralManager.startAdvertising(advertisementData)
}
func peripheralManagerDidUpdateState(
_ peripheral: CBPeripheralManager
) {
if peripheral.state == .poweredOn {
startAdvertising()
}
}
}
iOS позволява на Peripheral да работи във фонов режим, когато ключът bluetooth-peripheral присъства в Background Modes. На заден план, iOS може да рекламира с ограничен набор от данни и да обслужва връзки. За дълготрайна реклама (над 180 секунди), използвайте опцията CBAdvertisementDataWaitForResponseFromCentral за пестене на енергия.
Android предоставя BluetoothLeAdvertiser за работа в ролята на Peripheral (от API 21). API-то позволява стартиране на реклама с конфигурируеми параметри: мощност на предавателя, интервал на реклама, данни на пакета. Android също поддържа extended advertising (BLE 5.0) на съвместими устройства.
import android.bluetooth.le.*;
private BluetoothLeAdvertiser advertiser;
public void startPeripheral() {
BluetoothAdapter adapter =
BluetoothAdapter.getDefaultAdapter();
advertiser = adapter.getBluetoothLeAdvertiser();
AdvertiseData data = new AdvertiseData.Builder()
.setIncludeDeviceName(true)
.addServiceUuid(
new ParcelUuid(
UUID.fromString("0000180F-0000-1000-8000-00805F9B34FB")
)
)
.build();
AdvertiseSettings settings = new AdvertiseSettings.Builder()
.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER)
.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM)
.build();
advertiser.startAdvertising(
settings, data, advertiseCallback
);
}
На Android, поддръжката на Peripheral зависи от производителя и версията на ОС. Не всички устройства поддържат BluetoothLeAdvertiser — проверявайте чрез adapter.isMultipleAdvertisementSupported(). От Android 10, за работа в ролята на Peripheral се изисква разрешение BLUETOOTH_ADVERTISE, както и runtime заявка за приложения с target SDK 31+.
Енергийната ефективност — ключовото предимство на BLE, като Peripheral играе основна роля в това. Устройството може да работи на батерия CR2032 (220 mAh) повече от една година благодарение на оптимизирана консумация на енергия. Peripheral прекарва по-голямата част от времето си в режим на сън с изключена реклама, събуждайки се само за изпращане на рекламен пакет или обработка на заявка от Central.
Консумацията на енергия на Peripheral в различни режими: режим на сън (deep sleep) — 1–5 µA, idle с включен таймер — 10–50 µA, advertising — 5–15 mA (за времето на изпращане на пакет), connected — 5–10 mA (за времето на connection event). При advertising interval от 1000 ms и продължителност на пакета 4 ms, средният ток е около 50–100 µA.
Според Texas Instruments Application Report (SWRA478, 2024), оптимизирането на advertising interval от 100 ms на 1000 ms намалява средната консумация на енергия с 90%. Допълнително пестене се постига чрез използване на slave latency (пропускане на connection events), намаляване на Tx Power на къси разстояния и изключване на рекламата след свързване (connectable advertising).
Често задавани въпроси
Да, чрез механизма за уведомления (Notify/Indicate). Въпреки че инициаторът на връзката винаги е Central, след свързване Peripheral може да изпраща данни чрез GATT уведомления без изрична заявка от Central. За това, Central трябва предварително да се абонира чрез CCCD.
Продължителността на рекламата не е ограничена от спецификацията, но на практика е ограничена от енергията на батерията. В iOS, Peripheral може да рекламира на заден план не повече от 180 секунди на сесия без допълнителни настройки. На Android, рекламата може да работи неограничено, но значително намалява времето за автономна работа.
Увеличете advertising interval (препоръчва се 500–1000 ms), използвайте slave latency за пропускане на connection events, изключете рекламата след свързване и изберете минимална Tx Power, достатъчна за стабилна комуникация на необходимото разстояние.
Non-connectable advertising — режим, при който Peripheral рекламира, но не приема заявки за свързване. Използва се за beacon, които само предават данни (например идентификатор на магазин) без установяване на двупосочна връзка. Пести енергия в сравнение с connectable advertising.
В 31 байта могат да се включат: флагове (3 байта), име на устройството (до 28 байта в съкратен вид), списък на UUID на услугите (2–16 байта на UUID), данни на производителя (до 26 байта). Оптимална стратегия — поставете UUID на услугите в advertising PDU за филтриране, а пълното име — в scan response.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също