BLE e GATT per IoT

Versione Audio del post

Secondo Wikipedia, il Bluetooth è una tecnologia wireless standard utilizzato per lo scambio di dati tra dispositivi fissi e mobili su brevi distanze. Bluetooth Low Energy (Bluetooth LE o BLE) è una tecnologia wireless Personal Area Network (WPAN) progettata e commercializzata dal Bluetooth Special Interest Group (Bluetooth SIG). Secondo il Bluetooth SIG, BLE è progettato per il funzionamento a bassissima potenza. BLE supporta velocità di trasmissione dati da 125 Kb / s a 2 Mb / s, con livelli di potenza multipli da 1 milliwatt (mW) a 100 mW. Diversi fattori chiave influenzano la portata effettiva di una connessione Bluetooth affidabile, che può variare da un chilometro fino a meno di un metro. La nuova generazione Bluetooth 5 offre un miglioramento teorico della gamma 4x rispetto a Bluetooth 4.2, da circa 200 piedi (60 metri) a 800 piedi (240 metri).

Wikipedia elenca attualmente 36 definizioni di profili Bluetooth definiti e adottati dal Bluetooth SIG, inclusa la specifica Generic Attribute Profile (GATT). Secondo il Bluetooth SIG, GATT è costruito sulla parte superiore del protocollo di attributo (ATT) e stabilisce operazioni comuni e un quadro per i dati trasportati e memorizzati dal ATT. GATT fornisce servizi di rilevamento e descrizione del profilo per il protocollo BLE. Definisce come gli attributi ATT sono raggruppati in set per formare servizi.

Dato il suo basso consumo energetico e profili ben sviluppati, come GATT, BLE è un protocollo wireless a corto raggio ideale per dispositivi Internet of Things (IoT), rispetto ai protocolli concorrenti, come ZigBee, Bluetooth classic e Wi-Fi. In questo post, esploreremo l’uso di BLE e le specifiche GATT per trasmettere i dati dei sensori ambientali da un sensore IoT a un gateway IoT.

Sensore IoT

In questo post, useremo un microcontrollore a scheda singola Arduino per fungere da sensore IoT, in realtà una serie di sensori. La scheda 3.3 V AI-enabled Arduino Nano 33 BLE Sense, rilasciata nell’agosto 2019, viene fornita con il potente processore nRF52840 di Nordic Semiconductors, una CPU ARM Cortex-M4 a 32 bit in esecuzione a 64 MHz, 1 MB di memoria flash CPU, 256KB di SRAM e un modulo Bluetooth 5 low energy stand-alone NINA-B306.

Arduino Nano 33 BLE Senso (con intestazioni) su breadboard

Il Senso contiene anche una serie impressionante di sensori incorporati:

  • 9-asse del Sensore Inerziale (LSM9DS1): 3D, digitale, sensore di accelerazione lineare, digitale 3D
    velocità angolare del sensore, e un 3D digitale con sensore magnetico
  • Sensore di Umidità e Temperatura (HTS221): Capacitivo sensore digitale di umidità relativa e temperatura
  • Sensore Barometrico (LPS22HB): MEMS nano sensore di pressione: 260-1260 hectopascal (hPa) uscita digitale assoluta barometro
  • Microfono (MP34DT05): MEMS audio sensore omnidirezionale microfono digitale
  • Gesto, prossimità, colore della luce, e sensore di intensità della luce (APDS9960): Advanced Gesture detection, rilevamento di prossimità, Digital Ambient Light Sense (ALS), e senso di colore (RGBC).

Il senso è un eccellente, a basso costo single-board microcontrollore per conoscere la raccolta e la trasmissione dei dati del sensore IoT.

IoT Gateway

Un IoT Gateway, secondo TechTarget, è un dispositivo fisico o un programma software che funge da punto di connessione tra il Cloud e controller, sensori e dispositivi intelligenti. Tutti i dati che si spostano nel cloud, o viceversa, passano attraverso il gateway, che può essere un’appliance hardware dedicata o un programma software.

In questo post, useremo una recente generazione Raspberry Pi 3 Modello B + single-board computer (SBC), per servire come un gateway IoT. Questo modello Raspberry Pi è dotato di un 1.4 GHz Cortex-A53 (ARMv8) 64-bit quad-core del processore Sistema su un chip (SoC), 1 GB LPDDR2 SDRAM, dual-band wireless LAN, Bluetooth 4.2 BLE, e Gigabit Ethernet.

Per seguire con il post, si potrebbe sostituire il Raspberry Pi per qualsiasi macchina basata su Linux per eseguire lo script Python campione incluso.

Raspberry Pi 3 Modello B+

L’Arduino trasmetterà la telemetria del sensore IoT, su BLE, al Raspberry Pi. Il Raspberry Pi, utilizzando Wi-Fi o Ethernet, è quindi in grado di trasmettere in modo sicuro i dati di telemetria del sensore al Cloud. Nella terminologia Bluetooth, il dispositivo periferico Bluetooth (aka GATT Server), che è l’Arduino, trasmetterà i dati al dispositivo centrale Bluetooth (aka GATT Client), che è il Raspberry Pi.

Arduino Sketch

Per chi non ha familiarità con Arduino, uno schizzo è il nome che Arduino utilizza per un programma. È l’unità di codice che viene caricata nella memoria flash non volatile e funziona su una scheda Arduino. Il linguaggio Arduino è un insieme di funzioni C/C++. Tutti i costrutti C e C++ standard supportati dal compilatore avr-g++ dovrebbero funzionare in Arduino.

Per questo post, lo schizzo, combo_sensor_ble.ino, contiene tutto il codice necessario per raccogliere la telemetria del sensore ambientale, compresa la temperatura, l’umidità relativa, la pressione barometrica e la luce ambientale e il colore RGB. Tutto il codice per questo post, incluso lo schizzo, può essere trovato su GitHub.

La telemetria sensore sarà pubblicizzato dal senso, oltre BLE, come un servizio di rilevamento ambientale GATT (GATT assegnato numero 0x181A) con caratteristiche multiple GATT. Ogni caratteristica rappresenta una lettura del sensore e contiene i valori del sensore più attuali, ad esempio Temperatura (0x2A6E) o Umidità (0x2A6F).

Ogni caratteristica del GATT definisce come devono essere rappresentati i dati. Per rappresentare i dati con precisione, le letture del sensore devono essere modificate. Ad esempio, utilizzando la libreria ArduinoHTS221, la temperatura viene catturata con due punti decimali di precisione (ad esempio, 22,21 °C). Tuttavia, la caratteristica Temperatura GATT (0x2A6E) richiede un valore firmato a 16 bit (- 32,768-32,767). Per mantenere la precisione, il valore catturato (ad esempio, 22.21 °C) viene moltiplicato per 100 per convertirlo in un numero intero (ad esempio, 2221). Il Raspberry Pi gestirà quindi la conversione del valore al valore originale con la precisione corretta.

La specifica GATT non ha caratteristiche predefinite attuali che rappresentano la luce ambientale e il colore RGB. Pertanto, ho creato una caratteristica personalizzata per i valori dei colori e gli ho assegnato un identificatore univoco universale (UUID).

Secondo la documentazione, la luce ambientale e il colore RGB vengono acquisiti come valori a 16 bit (un intervallo di 0-65,535). Tuttavia, utilizzando la libreria ArduinoAPDS9960, ho trovato la scala delle letture all’interno di un intervallo di 0-4097. Senza immergersi nelle erbacce, il valore massimo di conteggio (o saturazione) è variabile. Può essere calcolato in base al tempo di integrazione e alla dimensione del registro di conteggio (ad esempio, 16 bit). Il tempo di integrazione ADC sembra essere impostato su 10 ms nel file della libreria, Arduino_APDS9960.cpp.

I valori RGB sono in genere rappresentati come colori a 8 bit. Potremmo convertire i valori a 8 bit prima di inviarlo o gestirlo in un secondo momento sul gateway IoT Raspberry Pi. Per motivi dimostrativi rispetto all’efficienza del trasferimento dei dati, lo schizzo concatena i valori a 12 bit insieme come una stringa (ad esempio, 4097,2811,1500,4097). La stringa verrà convertita da 12 bit a 8 bit sul Raspberry Pi (ad esempio, 255,175,93,255).

Anteprima e debug BLE Device Services

Prima di guardare il codice in esecuzione sul Raspberry Pi, possiamo utilizzare qualsiasi numero di applicazioni mobili per visualizzare in anteprima ed eseguire il debug del servizio di rilevamento ambientale in esecuzione su Arduino e pubblicizzato su BLE. Un’applicazione comunemente consigliata è NRF Connect for Mobile di Nordic Semiconductor, disponibile su Google Play. Ho trovato che la versione di Android funziona meglio interpretando correttamente e visualizzando i valori caratteristici del GATT rispetto alla versione iOS dell’app.

Di seguito, vediamo una scansione della mia vicinanza locale per i dispositivi BLE pubblicizzati, utilizzando la versione Android dell’applicazione mobile NRF Connect. Nota il dispositivo BLE, ArduinoNano33BLESense (indicato in rosso). Inoltre, nota l’indirizzo di controllo dell’accesso ai media (indirizzo MAC) di quel dispositivo BLE, nel mio caso, d1:aa:89:0c:ee:82. L’indirizzo MAC sarà richiesto in seguito sul gateway IoT.

Collegandosi al dispositivo, vediamo tre Servizi. Il Servizio di rilevamento ambientale (indicato in rosso) contiene le letture del sensore.

il Drill down Ambientale Rilevamento di Servizio (0x181A), vediamo le quattro Caratteristiche previste: Temperatura (0x2A6E), Umidità (0x2A6F), Pressione (0x2A6D), e Sconosciuta Caratteristica (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Poiché NRF Connect non è in grado di riconoscere la lettura del sensore di colore come caratteristica GATT registrata (nessun numero assegnato GATT), viene visualizzata come caratteristica sconosciuta. Mentre i valori di temperatura, umidità e pressione (indicati in rosso) vengono interpretati e visualizzati correttamente, la lettura del sensore di colore viene lasciata come testo esadecimale grezzo (ad esempio, 30-2c-30-2c-30-2c-30-00 o 0,0,0,0).

Questi risultati indicano che tutto funziona come previsto.

Codice Python client BLE

Per agire come client BLE (ovvero dispositivo centrale), Raspberry Pi esegue uno script Python. Lo script, rasppi_ble_receiver.py, utilizza il modulo bluepy Python per interfacciarsi con i dispositivi BLE tramite Bluez, su Linux.

Per eseguire lo script Python, eseguire il seguente comando, sostituendo l’argomento indirizzo MAC per l’indirizzo MAC pubblicizzato del proprio dispositivo BLE.

python3 ./rasppi_ble_receiver.py d1:aa:89:0c:ee:82

A differenza dell’app NRF Connect, il modulo bluepy Python non è in grado di interpretare e visualizzare correttamente i valori caratteristici del GATT. Quindi, lo script prende il testo esadecimale grezzo in entrata da Arduino e lo costringe ai valori corretti. Ad esempio, una lettura della temperatura deve essere trasformata da byte, b'\xb8\x08\x00\x00', a un array di byte, bytearray(b'\xb8\x08\x00\x00'), quindi a un numero intero, 2232, quindi a un decimale, 22.32 e infine alla scala Fahrenheit, 72.18°F.

Le letture del sensore vengono recuperate dal dispositivo BLE ogni due secondi. Oltre a visualizzare le letture del sensore numerico, lo script Python visualizza anche un campione di colore del colore RGB a 8 bit, nonché un campione in scala di grigi che rappresenta l’intensità della luce utilizzando il modulo colr Python.

La seguente registrazione dello schermo mostra una vista parallela sia del monitor seriale Arduino che dell’uscita del terminale Raspberry Pi. Il Raspberry Pi (dispositivo centrale) si collega all’Arduino (dispositivo periferico) quando viene avviato lo script Python. Il Raspberry Pi legge e interpreta con successo i dati di telemetria dal servizio di rilevamento ambientale.

Conclusione

In questo post, abbiamo esplorato l’uso di BLE e le specifiche GATT per trasmettere i dati dei sensori ambientali da un dispositivo periferico a un dispositivo centrale. Dato il suo basso consumo energetico e profili ben sviluppati, come GATT, Bluetooth Low Energy (BLE) è un protocollo wireless a corto raggio ideale per i dispositivi IoT.



+