Central è un dispositivo nell'architettura Bluetooth Low Energy che avvia la scansione, stabilisce una connessione e gestisce lo scambio di dati con i dispositivi periferici. Nel contesto dello sviluppo mobile, Central è uno smartphone o tablet con iOS o Android che si connette a sensori BLE, fitness tracker e accessori intelligenti. Secondo Bluetooth Core Specification 5.4 (2023), Central può supportare simultaneamente fino a 7 connessioni simultanee con diversi Peripheral, sebbene il limite effettivo dipenda dal produttore del chip e dalla versione del sistema operativo. Core Bluetooth su iOS e android.bluetooth.le su Android forniscono un'API completa per gestire il ruolo Central.
Punti chiave
Central è un client GATT nell'architettura Bluetooth Low Energy che avvia tutte le comunicazioni. A differenza del Peripheral, che attende passivamente le connessioni e pubblicizza i propri servizi, Central scansiona attivamente l'etere, scopre i pacchetti pubblicitari e avvia le connessioni.
Il modello asimmetrico Central-Peripheral è una caratteristica fondamentale del BLE. Central gestisce la logica di interazione: decide a quale dispositivo connettersi, quali servizi esplorare e quali caratteristiche leggere e scrivere. Peripheral agisce come un server di dati — memorizza servizi e caratteristiche ma non avvia connessioni.
Secondo la Bluetooth Core Specification 5.4 (2023), un dispositivo può essere contemporaneamente Central e Peripheral (doppio ruolo). Ad esempio, uno smartphone può essere Central per un fitness band e Peripheral per un altro smartphone che trasferisce file. Tuttavia, il funzionamento simultaneo in entrambi i ruoli aumenta il consumo energetico e la complessità della gestione delle connessioni.
Nell'ecosistema dello sviluppo mobile, il ruolo Central è lo scenario più comune. Un'app sullo smartphone cerca dispositivi BLE (sensori, cuffie, braccialetti), si connette ad essi e riceve dati. Lo sviluppatore utilizza l'API del sistema operativo per lavorare con Central: CBCentralManager su iOS, BluetoothLeScanner e BluetoothGatt su Android.
La scansione è la prima fase del funzionamento di Central. Il dispositivo ascolta sui canali radio BLE (37, 38, 39) per rilevare i pacchetti pubblicitari che i Peripheral inviano periodicamente. Ogni pacchetto pubblicitario contiene il nome del dispositivo, un elenco di Service UUID e dati personalizzati.
Central può operare in due modalità di scansione: scansione passiva (solo ricezione di pacchetti pubblicitari) e scansione attiva (invio di una richiesta di scansione per ottenere dati aggiuntivi tramite risposta di scansione). La scansione passiva risparmia energia ma fornisce meno informazioni. La scansione attiva consente di ottenere i dati completi del pacchetto pubblicitario, inclusi il nome del dispositivo e l'elenco completo dei servizi.
Il filtraggio per UUID è un'ottimizzazione importante. Central può scansionare solo i dispositivi con un Service UUID specifico, ignorando gli altri. Questo non solo risparmia energia, ma semplifica anche la logica dell'applicazione: il delegato riceve solo i dispositivi pertinenti.
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
]
)
}
}
}
La gestione delle connessioni è la responsabilità chiave di Central. Dopo aver scoperto un Peripheral adatto, Central avvia una connessione. Una connessione BLE viene stabilita attraverso una procedura di stabilimento della connessione che include lo scambio di parametri: intervallo di connessione, latenza slave e timeout di supervisione.
L'intervallo di connessione determina la frequenza con cui Central e Peripheral scambiano dati dopo la connessione. L'intervallo può variare da 7,5 ms a 4 secondi. Più breve è l'intervallo, maggiore è la velocità effettiva, ma anche maggiore è il consumo energetico. La latenza slave consente al Peripheral di saltare diversi eventi di connessione per risparmiare energia. Il timeout di supervisione è il tempo massimo senza risposta dopo il quale la connessione viene considerata persa.
Central è responsabile della terminazione della connessione dopo il completamento dello scambio di dati. I dispositivi BLE di solito non mantengono una connessione permanente — Central si connette, ottiene i dati e si disconnette. Questo è un modello standard per i sensori IoT: Central scansiona, trova un sensore di temperatura, si connette, legge il valore e si disconnette.
| Parametro | Intervallo | Scopo | Raccomandazione |
|---|---|---|---|
| Intervallo di connessione | 7,5 ms – 4 s | Frequenza di scambio dati | 30–50 ms per streaming, 1–4 s per dati rari |
| Latenza slave | 0–499 eventi | Salto eventi Peripheral | 4–10 per risparmio energetico del sensore |
| Timeout di supervisione | 100 ms – 32 s | Timeout perdita connessione | 6–10 secondi per la maggior parte degli scenari |
| MTU | 23–517 byte | Dimensione pacchetto ATT | Richiedere il massimo alla connessione |
Core Bluetooth è il framework di Apple per lavorare con BLE su iOS e macOS. La classe CBCentralManager fornisce l'API completa per implementare il ruolo Central: scansione, connessione, gestione delle connessioni. Il lavoro con Central su iOS si basa su un modello delegato: CBCentralManagerDelegate riceve eventi di cambiamento di stato, scoperta di dispositivi e risultati di connessione.
I passaggi principali per Central su iOS: inizializzare CBCentralManager, verificare lo stato Bluetooth, avviare la scansione, gestire i dispositivi scoperti tramite delegato, connettersi al Peripheral selezionato, scoprire servizi e caratteristiche, scambiare dati.
// Connettersi al Peripheral scoperto
func centralManager(
_ central: CBCentralManager,
didDiscover peripheral: CBPeripheral,
advertisementData: [String: Any],
rssi RSSI: NSNumber
) {
// Mantenere il riferimento al periferico e connettersi
discoveredPeripheral = peripheral
central.connect(peripheral, options: nil)
}
// Connessione riuscita
func centralManager(
_ central: CBCentralManager,
didConnect peripheral: CBPeripheral
) {
peripheral.delegate = self
peripheral.discoverServices(nil)
}
iOS limita il lavoro BLE in background: in background, un'app può scansionare solo con chiavi specifiche in Info.plist, e i dispositivi connessi possono notificare Central sui cambiamenti dei dati. Per applicazioni critiche (dispositivi medici), utilizzare le Modalità di background con la chiave bluetooth-central.
Android fornisce l'API BluetoothLeScanner per scansionare i dispositivi BLE e BluetoothGatt per la gestione delle connessioni. A partire da Android 5.0 (API 21), BluetoothLeScanner ha sostituito il deprecato startLeScan. L'API richiede le autorizzazioni BLUETOOTH, BLUETOOTH_ADMIN e ACCESS_FINE_LOCATION (o ACCESS_BACKGROUND_LOCATION per Android 10+).
import android.bluetooth.le.*;
import android.bluetooth.*;
private BluetoothLeScanner scanner;
private BluetoothGatt bluetoothGatt;
// Configurare la scansione
ScanSettings settings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.build();
// Avviare la scansione
scanner.startScan(null, settings, new ScanCallback() {
@Override
public void onScanResult(
int callbackType,
ScanResult result
) {
BluetoothDevice device = result.getDevice();
// Connettersi al dispositivo
bluetoothGatt = device.connectGatt(
context, false, gattCallback
);
}
});
Su Android, è importante considerare le restrizioni di scansione: a partire da Android 7 (API 24), la scansione non può essere avviata più di 5 volte in 30 secondi nelle app che non utilizzano la posizione. Android 12+ richiede le autorizzazioni BLUETOOTH_SCAN, BLUETOOTH_CONNECT e ADVERTISE, nonché richieste runtime di queste autorizzazioni.
Il consumo energetico di Central è superiore a quello del Peripheral a causa della necessità di scansionare costantemente i canali radio. Central riceve pacchetti BLE, li elabora, gestisce le connessioni e spesso esegue calcoli sul processore dell'applicazione. Secondo Bluetooth SIG, la scansione consuma tra 30 mA e 100 mA a seconda della modalità.
Esistono diverse strategie di risparmio energetico per Central. La scansione a intervalli è il metodo più efficace: Central scansiona in finestre brevi (finestra di scansione) con lunghe pause (intervallo di scansione). Ad esempio, con una finestra di scansione di 30 ms e un intervallo di scansione di 1000 ms, il consumo energetico si riduce del 97% rispetto alla scansione continua.
Un'ottimizzazione aggiuntiva è il filtraggio per UUID. Central elabora più velocemente solo i pacchetti pubblicitari pertinenti, ignorando gli altri. Ciò riduce il carico della CPU e aumenta la durata della batteria del dispositivo. Si consiglia inoltre di interrompere la scansione immediatamente dopo aver trovato il dispositivo desiderato e di non mantenere la connessione più del necessario.
Domande frequenti
Sì, BLE supporta il doppio ruolo: un dispositivo può essere contemporaneamente Central per alcuni dispositivi e Peripheral per altri. Ad esempio, uno smartphone legge i dati da un sensore (come Central) e contemporaneamente pubblicizza il proprio servizio (come Peripheral) per trasmettere dati a un altro dispositivo.
La specifica BLE definisce un limite di 7 connessioni per un singolo Central. In pratica, la limitazione dipende dal produttore del chip: i chip Nordic nRF52840 supportano fino a 20 connessioni, mentre alcuni adattatori Bluetooth economici non supportano più di 3–4.
Le ragioni possono essere diverse: il sensore non sta pubblicizzando (non è in modalità advertising), il filtro UUID è troppo restrittivo, il Bluetooth è spento sullo smartphone, mancano le autorizzazioni necessarie (posizione su Android) o il sensore è fuori portata (consigliato fino a 10 metri in ambienti chiusi).
Non necessariamente. Per molti scenari, viene utilizzato il modello connetti-e-leggi: Central scansiona, si connette, legge i dati necessari e si disconnette. Una connessione costante è necessaria solo per dati in streaming (polso, ECG) o controllo del dispositivo in tempo reale.
Utilizzare la scansione a intervalli con una finestra di scansione di 30–50 ms e un intervallo di scansione di 500–1000 ms. Filtrare i dispositivi per UUID per elaborare solo i pacchetti pubblicitari pertinenti. Interrompere la scansione immediatamente dopo aver trovato il Peripheral desiderato.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche