BLE y GATT para IoT

Versión de audio de la publicación

Según Wikipedia, Bluetooth es un estándar de tecnología inalámbrica utilizado para intercambiar datos entre dispositivos fijos y móviles en distancias cortas. Bluetooth de baja energía (Bluetooth LE o BLE) es una tecnología de red de área personal inalámbrica (WPAN) diseñada y comercializada por el Grupo de Interés Especial Bluetooth (Bluetooth SIG). De acuerdo con el Bluetooth SIG, BLE está diseñado para un funcionamiento de muy baja potencia. BLE admite velocidades de datos de 125 Kb/s a 2 Mb/s, con múltiples niveles de potencia de 1 milivatio (mW) a 100 mW. Varios factores clave influyen en el alcance efectivo de una conexión Bluetooth confiable, que puede variar desde un kilómetro hasta menos de un metro. La nueva generación de Bluetooth 5 proporciona una mejora teórica del rango de 4x sobre Bluetooth 4.2, de aproximadamente 200 pies (60 metros) a 800 pies (240 metros).

Wikipedia enumera actualmente 36 definiciones de perfiles Bluetooth definidos y adoptados por el Bluetooth SIG, incluida la Especificación de Perfil de Atributo Genérico (GATT). De acuerdo con el Bluetooth SIG, el GATT se basa en el Protocolo de Atributos (ATT) y establece operaciones comunes y un marco para los datos transportados y almacenados por el ATT. GATT proporciona servicios de descubrimiento y descripción de perfiles para el protocolo BLE. Define cómo se agrupan los atributos ATT en conjuntos para formar servicios.

Dado su bajo consumo de energía y perfiles bien desarrollados, como GATT, BLE es un protocolo inalámbrico de corto alcance ideal para dispositivos de Internet de las Cosas (IoT), en comparación con protocolos de la competencia, como ZigBee, Bluetooth classic y Wi-Fi. En esta publicación, exploraremos el uso de BLE y la especificación GATT para transmitir datos de sensores ambientales de un sensor de IoT a una puerta de enlace de IoT.

Sensor IoT

En este post, usaremos un microcontrolador de placa única Arduino para servir como un sensor IoT, en realidad una serie de sensores. La placa Sense Arduino Nano 33 BLE de 3,3 V habilitada para IA, lanzada en agosto de 2019, viene con el potente procesador nRF52840 de Nordic Semiconductors, una CPU ARM Cortex-M4 de 32 bits que funciona a 64 MHz, 1 MB de memoria Flash de CPU, 256 KB de SRAM y un módulo de baja energía Bluetooth 5 independiente NINA-B306.

Sensor Arduino Nano 33 BLE (con cabezales) en tabla de cortar el pan

El sensor también contiene una impresionante variedad de sensores integrados:

  • 9-sensor inercial axis (LSM9DS1): Sensor de aceleración lineal digital 3D, un sensor de velocidad angular digital 3D
    y un sensor magnético digital 3D
  • Sensor de humedad y temperatura (HTS221): Sensor digital capacitivo para humedad relativa y temperatura
  • Sensor barométrico (LPS22HB): Sensor nano de presión MEMS: barómetro de salida digital absoluta de 260-1260 hectopascales (hPa)
  • Micrófono (MP34DT05): Sensor de audio MEMS Micrófono digital omnidireccional
  • Sensor de Gestos, Proximidad, Color de Luz e Intensidad de Luz (APDS9960): Detección avanzada de gestos, Detección de proximidad, Sensor de Luz Ambiental Digital (ALS) y Sensor de Color (RGBC).

El Sense es un microcontrolador de placa única excelente y de bajo costo para aprender a recopilar y transmitir datos de sensores de IoT.

Puerta de enlace IoT

Una puerta de enlace IoT, de acuerdo con TechTarget, es un dispositivo físico o un programa de software que sirve como punto de conexión entre la Nube y los controladores, sensores y dispositivos inteligentes. Todos los datos que se trasladan a la nube, o viceversa, pasan por la puerta de enlace, que puede ser un dispositivo de hardware dedicado o un programa de software.

En este post, utilizaremos una computadora de placa única (SBC) Raspberry Pi 3 Modelo B+ de última generación, para servir como puerta de enlace de IoT. Este modelo Raspberry Pi cuenta con un sistema de procesador de núcleo cuádruple de 64 bits Cortex-A53 (ARMv8) de 1,4 GHz en un Chip (SoC), 1 GB LPDDR2 SDRAM, LAN inalámbrica de doble banda, Bluetooth 4.2 BLE y Gigabit Ethernet.

Para seguir con la publicación, puede sustituir Raspberry Pi por cualquier máquina basada en Linux para ejecutar el script de Python de ejemplo incluido.

Raspberry Pi 3 Modelo B+

El Arduino transmitirá la telemetría del sensor IoT, a través de BLE, al Raspberry Pi. Raspberry Pi, mediante Wi-Fi o Ethernet, puede transmitir de forma segura los datos de telemetría del sensor a la Nube. En terminología Bluetooth, el dispositivo Periférico Bluetooth (también conocido como Servidor GATT), que es Arduino, transmitirá datos al dispositivo Central Bluetooth (también conocido como Cliente GATT), que es Raspberry Pi.

Arduino Sketch

Para aquellos que no están familiarizados con Arduino, un sketch es el nombre que Arduino usa para un programa. Es la unidad de código que se carga en una memoria flash no volátil y se ejecuta en una placa Arduino. El lenguaje Arduino es un conjunto de funciones de C/C++. Todas las construcciones estándar de C y C++ soportadas por el compilador avr-g++ deberían funcionar en Arduino.

Para este post, el croquis, combo_sensor_ble.ino, contiene todo el código necesario para recopilar la telemetría del sensor ambiental, incluida la temperatura, la humedad relativa, la presión barométrica y la luz ambiental y el color RGB. Todo el código de esta publicación, incluido el boceto, se puede encontrar en GitHub.

La telemetría del sensor será anunciada por el Sense, sobre BLE, como un Servicio de Detección Ambiental del GATT (Número asignado del GATT 0x181A) con múltiples Características del GATT. Cada característica representa una lectura de sensor y contiene los valores de sensor más actuales, por ejemplo, Temperatura (0x2A6E) o Humedad (0x2A6F).

Cada característica del GATT define cómo deben representarse los datos. Para representar los datos con precisión, es necesario modificar las lecturas del sensor. Por ejemplo, utilizando la biblioteca ArduinoHTS221, la temperatura se captura con dos puntos decimales de precisión (por ejemplo, 22,21 °C). Sin embargo, la característica de Temperatura GATT (0x2A6E) requiere un valor de 16 bits con signo (- 32,768-32,767). Para mantener la precisión, el valor capturado (por ejemplo, 22,21 °C) se multiplica por 100 para convertirlo en un entero (por ejemplo, 2221). Raspberry Pi se encargará de convertir el valor al valor original con la precisión correcta.

La especificación GATT no tiene ninguna característica predefinida actual que represente la luz ambiental y el color RGB. Por lo tanto, he creado una característica personalizada para los valores de color y le he asignado un identificador único universal (UUID).

De acuerdo con la documentación, la luz ambiental y el color RGB se capturan como valores de 16 bits (un rango de 0-65,535). Sin embargo, usando la biblioteca ArduinoAPDS9960, he encontrado que la escala de las lecturas está dentro de un rango de 0-4097. Sin sumergirse en las malas hierbas, el valor de conteo máximo (o saturación) es variable. Se puede calcular en función del tiempo de integración y el tamaño del registro de recuento (por ejemplo, 16 bits). El tiempo de integración de ADC parece estar establecido en 10 ms en el archivo de la biblioteca, Arduino_APDS9960.cpp.

Los valores RGB se representan típicamente como color de 8 bits. Podríamos convertir los valores a 8 bits antes de enviarlos o manejarlos más tarde en la puerta de enlace de Internet de las cosas de Raspberry Pi. Para fines de demostración en comparación con la eficiencia de transferencia de datos, el croquis concatena los valores de 12 bits juntos como una cadena (por ejemplo, 4097,2811,1500,4097). La cadena se convertirá de 12 bits a 8 bits en Raspberry Pi (por ejemplo, 255,175,93,255).

Previsualización y depuración de Servicios de dispositivos BLE

Antes de mirar el código que se ejecuta en Raspberry Pi, podemos usar cualquier número de aplicaciones móviles para previsualizar y depurar el servicio de Detección Ambiental que se ejecuta en Arduino y se anuncia a través de BLE. Una aplicación comúnmente recomendada es NRF Connect de Nordic Semiconductor para dispositivos móviles, disponible en Google Play. He encontrado que la versión de Android funciona mejor para interpretar y mostrar correctamente los valores característicos del GATT que la versión de iOS de la aplicación.

A continuación, vemos un escaneo de mi vecindad local para dispositivos BLE que se anuncian, utilizando la versión de Android de la aplicación móvil NRF Connect. Tenga en cuenta el dispositivo BLE, ArduinoNano33BLESense (indicado en rojo). Además, tenga en cuenta la dirección de control de acceso a medios (dirección MAC) de ese dispositivo BLE, en mi caso, d1:aa:89:0c:ee:82. La dirección MAC se requerirá más adelante en la puerta de enlace de IoT.

Conexión para el dispositivo, vemos tres Servicios. El Servicio de Detección Ambiental (indicado en rojo) contiene las lecturas del sensor.

Al perforar el Servicio de Detección Ambiental (0x181A), vemos las cuatro Características esperadas: Temperatura (0x2A6E), Humedad (0x2A6F), Presión (0x2A6D) y Característica Desconocida (936b6a25-e503–4f7c-9349-bcc76c22b8c3). Dado que Nrf Connect no puede reconocer la lectura del sensor de color como una Característica registrada del GATT (sin Número asignado del GATT), se muestra como una Característica desconocida. Mientras que los valores de temperatura, humedad y presión (indicados en rojo) se interpretan y muestran correctamente, la lectura del sensor de color se deja como texto hexadecimal sin procesar (por ejemplo, 30-2c-30-2c-30-2c-30-00 o 0,0,0,0).

Estos resultados indican que todo está funcionando como se esperaba.

Código Python del Cliente BLE

Para actuar como Cliente BLE (también conocido como dispositivo central), Raspberry Pi ejecuta un script Python. El script, rasppi_ble_receiver.py, utiliza el módulo bluepy Python para interactuar con dispositivos BLE a través de Bluez, en Linux.

Para ejecutar el script Python, ejecute el siguiente comando, sustituyendo el argumento dirección MAC por la dirección MAC anunciada de su propio dispositivo BLE.

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

A diferencia de la aplicación NRF Connect, el módulo bluepy Python no es capaz de interpretar y mostrar correctamente los valores característicos del GATT. Por lo tanto, el script toma el texto hexadecimal entrante sin procesar del Arduino y lo coacciona a los valores correctos. Por ejemplo, una lectura de temperatura debe transformarse de bytes, b'\xb8\x08\x00\x00', a una matriz de bytes, bytearray(b'\xb8\x08\x00\x00'), luego a un entero, 2232, luego a un decimal, 22.32, y finalmente a la escala Fahrenheit, 72.18°F.

Las lecturas del sensor se recuperan del dispositivo BLE cada dos segundos. Además de mostrar las lecturas numéricas del sensor, el script Python también muestra una muestra de color del color RGB de 8 bits, así como una muestra de escala de grises que representa la intensidad de la luz utilizando el módulo colr Python.

La siguiente grabación de pantalla muestra una vista paralela tanto del monitor Serie Arduino como de la salida de terminal de Raspberry Pi. El Raspberry Pi (dispositivo central) se conecta al Arduino (dispositivo periférico) cuando se inicia el script Python. Raspberry Pi lee e interpreta con éxito los datos de telemetría del Servicio de Detección Ambiental.

Conclusión

En este post, exploramos el uso de BLE y la especificación GATT para transmitir datos de sensores ambientales de un dispositivo periférico a un dispositivo central. Dado su bajo consumo de energía y sus perfiles bien desarrollados, como GATT, Bluetooth Low Energy (BLE) es un protocolo inalámbrico de corto alcance ideal para dispositivos IoT.



+