Peripheral — este un dispozitiv în arhitectura Bluetooth Low Energy care își publicită serviciile prin pachete advertising și așteaptă conectarea de la Central. În ecosistemul IoT, Peripheral este de obicei un dispozitiv cu consum redus de energie: senzor de temperatură, lampă inteligentă, brățară fitness, baliză (Beacon). Bluetooth Core Specification 5.4 (2023) definește protocolul de publicitate: Peripheral trimite periodic pachete advertising care conțin numele dispozitivului, lista serviciilor și date utilizator, iar Central scanează aceste pachete și decide dacă să se conecteze. După stabilirea conexiunii, Peripheral acționează ca server GATT, oferind servicii și caracteristici pentru citire și scriere.
Principalele puncte
Peripheral — este un dispozitiv BLE care implementează un server GATT și își publicită capacitățile prin canalele de advertising. Spre deosebire de Central, care caută activ dispozitive, Peripheral așteaptă pasiv conectarea. Acesta este un model asimetric, optimizat pentru eficiența energetică a dispozitivelor alimentate cu baterii.
Peripheral poate fi în mai multe moduri: advertising (publicitate), connected (conectat la Central), sleeping (repaus cu publicitate dezactivată). În modul advertising, Peripheral trimite periodic pachete scurte de date, consumând energie minimă. După conectare, Peripheral trece în modul connected, unde face schimb de date cu Central conform intervalului de conexiune convenit.
Conform Bluetooth Core Specification 5.4 (2023), un dispozitiv poate comuta dinamic între rolurile Peripheral și Central, dar în fiecare moment, pentru o conexiune, rolul este fix. Un scenariu tipic: senzorul IoT lucrează constant în rolul Peripheral, iar smartphone-ul gestionează conexiunea ca Central.
Este important ca dezvoltatorul să înțeleagă: Peripheral determină ce servicii și caracteristici sunt disponibile și gestionează accesul la ele. Structura serverului GATT pe Peripheral determină ce date poate citi Central și ce comenzi poate scrie.
Advertising (publicitate) — este mecanismul prin care Peripheral își anunță prezența. Peripheral trimite pachete advertising pe trei canale dedicate (37, 38, 39) cu un interval între 20 ms și 10.24 secunde. Fiecare pachet de publicitate conține informații fixe și poate include date opționale.
Există două tipuri de pachete de publicitate: advertising PDU (pachetul principal) și scan response PDU (răspuns la cererea Central). Pachetul principal conține câmpuri obligatorii: tipul pachetului, adresa expeditorului, datele. Dacă Central trimite o cerere de scanare (scan request), Peripheral răspunde cu un pachet suplimentar care conține informații mai complete — de exemplu, numele complet al dispozitivului.
Parametrii de advertising afectează viteza de detectare și consumul de energie. Advertising interval — timpul dintre trimiterea pachetelor. Cu cât intervalul este mai scurt, cu atât Central detectează mai repede dispozitivul, dar Peripheral consumă mai multă energie. Interval recomandat: 100–1000 ms pentru majoritatea dispozitivelor.
| Parametru | Interval | Impact | Recomandare |
|---|---|---|---|
| Advertising Interval | 20 ms – 10.24 s | Viteză de detectare, energie | 100–1000 ms pentru echilibru |
| Advertising Channels | 37, 38, 39 | Fiabilitatea detectării | Toate 3 canale obligatoriu |
| Tx Power | −20 – +10 dBm | Distanță, interferențe | 0 dBm pentru interior, +4 dBm pentru exterior |
| Advertising Timeout | 0 – 180 secunde | Durata publicității | 0 (infinit) pentru balize |
Pachetul de publicitate BLE are o limită de 31 de octeți pentru advertising PDU și încă 31 de octeți pentru scan response. În interiorul pachetului, datele sunt organizate în formatul AD Structure (Advertising Data Structure): fiecare câmp are un tip (1 octet), o lungime (1 octet) și o valoare.
Cele mai frecvent utilizate AD Type: Flags (0x01) — moduri de conectare și detectare, Local Name (0x08 sau 0x09) — numele dispozitivului, Service UUID List (0x02–0x07) — lista UUID-urilor serviciilor, Manufacturer Specific Data (0xFF) — datele producătorului. Ambalarea corectă a datelor într-un pachet de 31 de octeți este o sarcină importantă pentru dezvoltatorul de dispozitive încorporate.
Pentru dispozitivele care trebuie să transmită mai multe date, există extended advertising (BLE 5.0+), care mărește dimensiunea pachetului de publicitate la 251 de octeți și adaugă noi tipuri de pachete. Extended advertising acceptă și canale cu codare (coded PHY) pentru a crește raza de acțiune până la 1 km în teren deschis.
La proiectarea pachetului de publicitate, luați în considerare: cu cât sunt mai multe date în pachetul advertising, cu atât este mai mare probabilitatea de coliziune cu alte dispozitive. Pentru detectare rapidă, se recomandă plasarea doar a datelor critice (Service UUID) în advertising PDU, iar datele suplimentare — în scan response.
Serverul GATT pe Peripheral conține toate serviciile și caracteristicile pe care Central le poate detecta și cu care poate interacționa. După conectare, Central detectează serviciile (discover services), apoi caracteristicile (discover characteristics) și interacționează cu ele prin protocolul GATT.
Peripheral ca server GATT trebuie să proceseze corect cererile de la Central: citire (read request), scriere (write request), notificări (notification) și notificări confirmate (indication). Fiecare cerere trece prin tabela GATT, unde fiecărui atribut (serviciu, caracteristică, descriptor) îi corespunde un Handle — o adresă pe 16 biți.
Dezvoltatorul Peripheral stabilește drepturile de acces pentru fiecare atribut: doar citire, doar scriere, citire și scriere, cu sau fără criptare. Pentru date confidențiale (informații personale, parametri medicali) se recomandă impunerea criptării prin MITM Protection.
CBPeripheralManager — clasa Core Bluetooth pentru implementarea rolului Peripheral pe iOS. Gestionează serverul GATT, publică servicii și caracteristici, procesează cererile de la Central. Spre deosebire de CBCentralManager, CBPeripheralManager nu scanează — doar publicită și deservește conexiunile.
Pașii principali pentru implementarea Peripheral pe iOS: inițializarea CBPeripheralManager, adăugarea serviciilor prin add, pornirea publicității prin startAdvertising, procesarea cererilor de la Central prin delegatul 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 permite Peripheral să funcționeze în modul de fundal atunci când cheia bluetooth-peripheral este prezentă în Background Modes. În fundal, iOS poate publicita cu un set limitat de date și poate deservi conexiunile. Pentru publicitate de lungă durată (peste 180 de secunde), utilizați opțiunea CBAdvertisementDataWaitForResponseFromCentral pentru economisirea energiei.
Android oferă BluetoothLeAdvertiser pentru lucrul în rolul Peripheral (începând cu API 21). API-ul permite pornirea publicității cu parametri configurabili: puterea emițătorului, intervalul de publicitate, datele pachetului. Android acceptă și extended advertising (BLE 5.0) pe dispozitivele compatibile.
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
);
}
Pe Android, suportul pentru Peripheral depinde de producător și versiunea sistemului de operare. Nu toate dispozitivele acceptă BluetoothLeAdvertiser — verificați prin adapter.isMultipleAdvertisementSupported(). Începând cu Android 10, pentru lucrul în rolul Peripheral este necesară permisiunea BLUETOOTH_ADVERTISE, precum și o solicitare runtime pentru aplicațiile cu target SDK 31+.
Eficiența energetică — avantajul cheie al BLE, iar Peripheral joacă un rol principal în acest sens. Dispozitivul poate funcționa de la o baterie CR2032 (220 mAh) mai mult de un an datorită consumului optimizat de energie. Peripheral petrece cea mai mare parte a timpului în modul de repaus cu publicitatea dezactivată, trezindu-se doar pentru a trimite un pachet de publicitate sau a procesa o cerere de la Central.
Consumul de energie al Peripheral în diferite moduri: modul de repaus (deep sleep) — 1–5 µA, idle cu timer activat — 10–50 µA, advertising — 5–15 mA (pe durata trimiterii pachetului), connected — 5–10 mA (pe durata evenimentului de conexiune). La un advertising interval de 1000 ms și o durată a pachetului de 4 ms, curentul mediu este de aproximativ 50–100 µA.
Conform Texas Instruments Application Report (SWRA478, 2024), optimizarea advertising interval de la 100 ms la 1000 ms reduce consumul mediu de energie cu 90%. Economii suplimentare se obțin prin utilizarea slave latency (omiterea evenimentelor de conexiune), reducerea Tx Power la distanțe scurte și dezactivarea publicității după conectare (connectable advertising).
Întrebări frecvente
Da, prin mecanismul de notificări (Notify/Indicate). Deși inițiatorul conexiunii este întotdeauna Central, după conectare Peripheral poate trimite date prin notificări GATT fără o cerere explicită din partea Central. Pentru aceasta, Central trebuie să se aboneze în prealabil prin CCCD.
Durata publicității nu este limitată de specificație, dar în practică este limitată de energia bateriei. Pe iOS, Peripheral poate publicita în fundal cel mult 180 de secunde per sesiune fără setări suplimentare. Pe Android, publicitatea poate funcționa nelimitat, dar reduce semnificativ durata de funcționare autonomă.
Măriți advertising interval (recomandat 500–1000 ms), utilizați slave latency pentru omiterea evenimentelor de conexiune, dezactivați publicitatea după conectare și alegeți puterea minimă Tx Power suficientă pentru o comunicare stabilă la distanța necesară.
Non-connectable advertising — un mod în care Peripheral publicită, dar nu acceptă cereri de conectare. Se utilizează pentru balize (beacon) care doar transmit date (de exemplu, identificatorul unui magazin) fără a stabili o conexiune bidirecțională. Economisește energie comparativ cu connectable advertising.
În 31 de octeți pot fi incluse: steaguri (3 octeți), numele dispozitivului (până la 28 de octeți în formă scurtă), lista UUID-urilor serviciilor (2–16 octeți per UUID), datele producătorului (până la 26 de octeți). Strategia optimă — plasați UUID-urile serviciilor în advertising PDU pentru filtrare, iar numele complet — în scan response.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și