Bluetooth 4.0 LE & Apple: la lunga strada verso l’open source

Bluetooth 4.0 Apple

Nel corso degli anni il Bluetooth ha subito diverse evoluzioni che si esplicano attraverso la nascita di un gran numero di profili e si completano, nello standard attuale 4.0 – 4.1 Low Energy.
Gli Smartphone hanno, nel corso degli anni, recepito queste evoluzioni adeguandosi agli standard e in particolare i dispositivi Apple sono stati al centro di varie controversie a causa proprio del protocollo Bluetooth.
Questo post approfondisce l’evoluzione del Bluetooth attraverso i dispositivi Apple, soffermandosi sulla linea di demarcazione imposta dai profili Low Energy e sul come implementare una App per iOS 7.0+ per padroneggiare il Bluetooth 4.0.

L’immagine presa dal sito di supporto Apple, evidenzia come gli Smartphone Apple abbiano interpretato negli anni alcuni profili Bluetooth, mentre, la tabella mostrata di seguito, mostra l’evoluzione dell’Hardware e delle versioni del protocollo Bluetooth. Soffermandosi sull’Hardware è bene considerare il fatto che i moduli BlueCore (prodotti da CSR) e BCM (prodotti da BroadCom) siano in grado di gestire contemporaneamente sia il Bluetooth che il WiFi. Il prezzo al dettaglio di questi moduli di ultima generazione si aggira intorno ai 18$.

Modello Modulo Bluetooth Versione Protocollo Velocità di Trasmissione Anno
iPhone

BlueCore 4

2.0+EDR

3Mbit/s

2007
iPhone 3G

BlueCore 6

2.0+EDR

3Mbit/s

2008
iPhone 3GS

BCM4325

2.1+EDR

3Mbit/s

2009
iPhone 4

BCM4329

2.1+EDR

3Mbit/s 2010
iPhone 4s

BCM4330

4.0

24Mbit/s

2011
iPhone 5

BCM4334

4.0

24Mbit/s

2012
iPhone 5c

BCM4334

4.0

24Mbit/s

2013
iPhone 5s

BCM43342

4.0

24Mbit/s

2013

La tabella riportata sopra mette in luce il salto dell’iPhone 4s, primo Smartphone a montare un modulo con Bluetooth 4.0.

 

Bluetooth 2.0 e 2.1 :il mio iPhone non parla!

A partire dai primi cellulari Nokia fino all’era pre-cloud computing, l’utilizzo principale del Bluetooth effettuato dall’utente di telefonia medio è sempre stato il trasferire dati, foto e musica da un cellulare ad un altro.
Questo splendido paradigma di rapida condivisione dei dati ha subito un forte trauma, o meglio, una discontinuità con l’avvento nel mercato mondiale degli iPhone. Infatti, per i possessori di iPhone risultava non possibile condividere i propri file via Bluetooth, se non con altri device Apple.

 

La catastrofe dell’MFi

L’MFi Program, ovvero il “Made For Apple Program” è un programma di sviluppo Apple che consente, attraverso il pagamento di alcune royalties ed il superamento di un esame di certificazione, di apporre sui propri prodotti il bollino Made For iPhone-iPad-iPod etc.
L’adesione a questo programma risultava, fino allo standard Low Energy, la “condicio sine qua non” per poter comunicare via Bluetooth con un iPhone.
Infatti, i chip che implementano il Bluetooth sugli iPhone di precedente generazione adottano un firmware particolare imposto dall’MFi Program.
L’adesione all’MFi, pur donando un valore aggiunto al un prodotto hardware Made For Apple, risultava in queste condizioni un ingiustificato sbarramento allo sviluppo tecnologico.
Poi venne il 4.0.

 

Il bluetooth 4.0

Il 30 Giugno 2010 il Bluetooth SIG (Special Interest Group) ultimò le specifiche dello standard Bluetooth 4.0, anche detto Bluetooth Smart.
Uno dei primi profili Bluetooth a rispettare le specifiche del 4.0 fu il cosiddetto Bluetooth Low Enegry (BLE), sviluppato dalla Nokia nel 2006 con il nome di Wibree e unito allo standard 4.0 nel 2010 sotto il nome di Bluetooth Low Energy.
Questo profilo, pur mantenendo la velocità dello standard 3.0 HS (High Speed) a 24Mbit/s, contiene notevolmente i consumi energetici ed è stato progettato appositamente per soddisfare i bisogni nei campi della domotica, del fitness, della sicurezza e della salute.
Inoltre, a partire da questa versione del protocollo, non risulta più obbligatorio essere parte dell’MFi Program per poter sviluppare hardware basato sul Bluetooth in grado di comunicare con i device Apple di nuova generazione.
Tuttavia lo standard Low Energy non è compatibile con le versioni del bluetooth precedenti la 4.0. Per gestire questa eccezione è necessario utilizzare i cosiddetti moduli dual-mode, ovvero in grado di alternare profilo Low Energy e non.
Pertanto, attualmente sono in commercio un gran numero di dispositivi in grado di parlare tra loro, ma non di capirsi. Tuttavia, secondo il Bluetooth SIG entro il 2018 oltre il 90% dei dispositivi Bluetooth presenti sul mercato avranno adottato lo standard Low Energy e pertanto questa discontinuità risulterà finalmente risolta.

 

CoreBluetooth

Il framework utilizzato dagli sviluppatori iOS per interagire con il Bluetooth 4.0 è noto come CoreBluetooth ed è nativo a partire da iOS 5.0.
Tuttavia nel corso degli anni, con gli aggiornamenti dei sistemi operativi ha subito anch’esso numerose modifiche, ma la struttura di base ne è rimasta pressochè intatta.

Come la figura mette in evidenza, il framework si pone a un livello superiore rispetto allo stack del Low Energy consentendo allo sviluppatore di programmare soltanto il livello Applicazione, ponendo così dei limiti alle applicazioni, ma semplificando di molto il codice.

 

Central Master & Peripheral

Supponendo di voler mettere in comunicazione uno Smartphone con un Hardware realizzato adhoc, come ad esempio un Arduino UNO connesso al modulo Bluetooth Low Energy HM-10, allora l’Arduino dovrà essere configurato come una periferica (CBPeripheral) e il telefono come il Central Manager (CBCentralManager), ovvero l’entità che ricerca delle periferiche e da cui ottiene i dati.
Nello standard Low Energy le periferiche correttamente alimentate si pongono in Advertising Mode, ovvero offrono informazioni al Central Manager sul proprio Nome, id univoco, potenza del segnale e alcuni servizi che sono in grado di svolgere.
Una periferica, infatti, possiede uno o più servizi (CBServices) che identificano le sue funzionalità. Ogni servizio a sua volta può includere dei sub-servizi, o servizi secondari, e possiede una o più caratteristiche (CBCharachteristic).
Le caratteristiche forniscono ulteriori dettagli riguardo un particolare servizio.

Per esempio, un sensore di battito cardiaco può essere considerato una periferica, allora, astraendoci dall’oggetto fisico, si potrebbe considerare il monitorare il battito cardiaco uno dei servizi offerti dalla periferica, mentre il valore in BPM può essere considerata una caratteristica del servizio.

 

CBPeripheral

– discoverServices:
– discoverIncludedServices:forService:
– discoverCharacteristics:forService:
– discoverDescriptorsForCharacteristic:
– readValueForCharacteristic:
– readValueForDescriptor:
– writeValue:forCharacteristic:type:
– writeValue:forDescriptor:
– setNotifyValue:forCharacteristic:
– readRSSI

  identifier  property
  name  property
  delegate  property
  UUID  property Deprecated in iOS 7.0
  services  property
  state  property
  isConnected  property Deprecated in iOS 7.0
  RSSI  property
  
CBCentralManager

– initWithDelegate:queue:
– initWithDelegate:queue:options:
– connectPeripheral:options:
– cancelPeripheralConnection:
– retrieveConnectedPeripheralsWithServices:
– retrievePeripheralsWithIdentifiers:
– retrieveConnectedPeripherals Deprecated in iOS 7.0
– retrievePeripherals: Deprecated in iOS 7.0
– scanForPeripheralsWithServices:options:
– stopScan

   state  property
   delegate  property

 

CBService

   UUID  property
   peripheral  property
   isPrimary  property
   characteristics  property
   includedServices  property

 

CBCharachteristic

   UUID  property
   service  property
   value  property
   descriptors  property
   properties  property
   isNotifying  property
   isBroadcasted  property

 

Impostare correttamente una connessione BLE

Di seguito è illustrato il setup minimale di una connessione BLE, nel rispetto delle specifiche Apple e seguendo le indicazioni presenti sulla documentazione ufficiale.

1. Definire un Central Manager

Il central manager è in questo caso lo Smartphone, ovvero il dispositivo alla ricerca di periferiche cui connettersi.

myCentralManger = [[CBCentralManager alloc]initWithDelegate:self queue:nil options:0];

L’allocazione del central manager richiama il metodo implementato dal protocollo CBCentralManagerDelegate:

- (void)centralManagerDidUpdateState:(CBCentralManager *)central

 

2. Effettuare la scansione delle periferiche 4.0 disponibili

[myCentralManger scanForPeripheralsWithServices:nil options:0];

Ogni qualvolta una periferica viene trovata, viene richiamato un metodo implementato dal protocollo CBCentralManagerDelegate:

-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

 

3. Connettersi alla periferica desiderata

[myCentralManger connectPeripheral:myPeripheralBC127 options:nil];

Se la connessione và a buon fine viene richiamato un metodo implementato dal protocollo CBPeripheralDelegate:

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral

 

4. Andare ad osservare i Servizi che la periferica offre

peripheral.delegate=self;

[peripheral discoverServices:nil];

Se vengono trovati servizi disponibili per la periferica viene richiamato un metodo implementato dal protocollo CBPeripheralDelegate:

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

 

5. Andare ad osservare le Caratteristiche per un dato servizio

for(CBService *service in peripheral.services){

[peripheral discoverCharacteristics:nil forService:service];

}

Se vengono trovate caratteristiche disponibili per il servizio viene richiamato un metodo implementato dal protocollo CBPeripheralDelegate:

-(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

 

6. Scrivere e leggere il valore della caratteristica che si vuole utilizzare come canale di comunicazione

  • Impostare un metodo in ascolto su una particolare caratteristica:

for(CBCharacteristic *caratteristica in service.characteristics){
myCharacteristic = caratteristica;
[peripheral setNotifyValue:YES forCharacteristic:caratteristica];
}

A questo punto se la periferica accetta notifiche in lettura, ogni qualvolta il valore della caratteristica viene modificato viene richiamato un metodo implementato nel protocollo CBPeripheralDelegate:

-(void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

in cui è possibile osservare il nuovo valore della caratteristica.

  • Scrivere una stringa su una particolare caratteristica:

NSData* data = [self.sendTextField.text dataUsingEncoding:NSUTF8StringEncoding];
[myPeripheralBC127 writeValue:data forCharacteristic:myCharacteristic type:CBCharacteristicWriteWithResponse];

Se il valore è scritto correttamente nella caratteristica viene richiamato il metodo implementato nel protocollo CBPeripheralDelegate:

- (void)peripheral:(CBPeripheral *)peripheral didWriteValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error

 

Setup con Arduino UNO

  1. Collegare Arduino UNO al PC e caricare lo Sketch di Esempio di Comunicazione Seriale.
  2. Collegare il Modulo Bluetooth LE (testato con HM-10 e BC127) ad Arduino sui PIN 10 e 11 oltre il Pin di massa.
  3. Alimentare il modulo Bluetooth con alimentazione esterna, se necessario, oppure con lo stesso Arduino.
  4. Aprire il Monitor seriale ed accertarsi di ottenere risposta da Arduino e dal Modulo Bluetooth.
  5. Caricare l’applicazione in Debug sul proprio iPhone.
  6. Scambiare i comandi tramite BLE seguendo le regole imposte dalla documentazione del modulo Bluetooth.

Allego all’articolo il codice sorgente scritto da me per creare una semplice app che consenta di svolgere tutte le funzioni sopra descritte.

 

Conclusioni

L'evoluzione del Bluetooth lascia ben sperare in una maggiore apertura futura dell'azienda di Cupertino verso l'Open Source. Resto a disposizione per maggiori informazioni su come connettere un modulo Bluetooth 4.0 a un device Apple, oppure su come utilizzare il codice allegato al presente articolo. I vostri commenti, entusiasti o meno, potrebbero generare un seguito di questo articolo. 

2 Comments

  1. Luigi.D'Acunto 15 maggio 2014
  2. Piero Boccadoro 15 maggio 2014

Leave a Reply