Flash Técnico: Conexión con sensores Bluetooth Low Energy (BLE) para soluciones IoT

Vivimos en un mundo en continuo cambio en el que cada vez son más los objetos que se pueden interconectar entre sí.

Sin apenas darnos cuenta, somos muchos los que usamos pulseras inteligentes, sensores que miden la frecuencia cardiaca en nuestras actividades deportivas, etc.

Este tipo de sensores están haciendo posible la transformación industrial hacia lo que será la industria 4.0. Utilizando diferentes sensores podremos tener más mediciones, mayor precisión e incluso anticipar problemas mucho antes de que sucedan.

La mayoría de estos sensores se comunican de forma inalámbrica a través de bluetooth.

En esta ocasión vamos a hablar sobre el funcionamiento de sensores sencillos que usan Bluetooth Low Energy (BLE).

Por poner un ejemplo, para poder conectarnos a un monitor de pulsaciones, BLE utiliza algo similar a un sistema de descubrimiento que permite poder establecer una comunicación con el monitor. Una vez conectados, tenemos a nuestra disposición una serie de servicios – que en ocasiones se pueden agrupar en perfiles- y características. Todo ello basado en identificadores de 16bits.

Los servicios se utilizan para agrupar diferentes características relacionadas. Estas características son los contenedores de los datos de los usuarios y, además, pueden llevar una serie de descriptores.

Este es un gráfico de cómo se pueden agrupar los servicios y características:

Por lo tanto, podríamos decir que en el “perfil” del monitor de pulsaciones disponemos de n servicios. Cada uno de estos servicios tiene un numero n de características. A su vez, dichas características pueden contener descriptores.

La forma de comunicarnos con el monitor de pulsaciones es a través de los diferentes ids (UUID) que tienen las características y los servicios.

De esta forma, es posible suscribirnos a un servicio de notificaciones que se encargará de enviar información.

Podemos probar todo esto con dos comandos en Linux.

Con hcitool podemos ver los dispositivos bluetooth que están a nuestro alcance;

userFoo@computerFoo:~/foo$ sudo hcitool lescan
LE Scan …
11:22:33:44:55:66 (unknown)
11:22:33:44:55:66 Polar OH1 555DDD0F

Como se puede ver tenemos una pulsera Polar OH1 (monitor cardiaco) a la que podemos conectarnos.

Con el comando gattool podremos hacer el resto, para ello usamos -I para el modo interactivo y desde aquí poder introducir los comandos necesarios para poder tener una conversación con nuestra pulsera. Esta conversación es posible mediante la inserción de comandos a través de un terminal.

userFoo@computerFoo:~/foo$ gatttool -b 11:22:33:44:55:66 -I
[11:22:33:44:55:66][LE]>

Con el comando connect, establecerá una comunicación y podremos pasar a ver los diferentes servicios disponibles con comando primary.

[11:22:33:44:55:66][LE]> connect
Attempting to connect to 11:22:33:44:55:66
Connection successful[11:22:33:44:55:66][LE]> primary
attr handle: 0x0001, end grp handle: 0x0009 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x000a, end grp handle: 0x000d uuid: 00001801-0000-1000-8000-00805f9b34fb
attr handle: 0x000e, end grp handle: 0x001c uuid: 0000180a-0000-1000-8000-00805f9b34fb
attr handle: 0x001d, end grp handle: 0x0025 uuid: 0000feee-0000-1000-8000-00805f9b34fb
attr handle: 0x0026, end grp handle: 0x0029 uuid: 0000180d-0000-1000-8000-00805f9b34fb
attr handle: 0x002a, end grp handle: 0x002d uuid: 0000180f-0000-1000-8000-00805f9b34fb
attr handle: 0x002e, end grp handle: 0x0036 uuid: fb005c20-02e7-f387-1cad-8acd2d8df0c8
attr handle: 0x0037, end grp handle: 0x003c uuid: 6217ff4b-fb31-1140-ad5a-a45545d7ecf3
attr handle: 0x003d, end grp handle: 0xffff uuid: fb005c80-02e7-f387-1cad-8acd2d8df0c8

En este cuadro de código, vemos el listado de servicios. Como explicaba anteriormente, cada uno de estos servicios se compone de una a n caracteristicas.

Nos interesa el servicio cuyo UUID comienza por 180D, que es el encargado del monitor cardiaco, podemos ver una lista completa de caracteristicas en las especificaciones bluetooth: https://www.bluetooth.com/specifications/gatt/characteristics/

Para poder ver las características de los servicios, debemos fijarnos en los handles attr y end de tal forma que el comando char-desc nos dará información sobre las características que nos interesan.

[11:22:33:44:55:66][LE]> char-desc 0x0026 0x0029
handle: 0x0026, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0027, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0028, uuid: 00002a37-0000-1000-8000-00805f9b34fb
handle: 0x0029, uuid: 00002902-0000-1000-8000-00805f9b34fb

La característica 2a37 es la que nos da la información del monitor. Para poder realizar dichas lecturas, es necesario pasarle los parámetros que indican la forma en la queremos recibir esta información. Es aquí donde entran en juego los descriptores. Necesitamos conocer el handle del descriptor al que le pasaremos los parámetros para que la característica 2a37 sepa como enviar los datos. En la siguiente web: https://www.bluetooth.com/specifications/gatt/descriptors/

Encontramos información sobre los descriptores y donde encontraremos nuestro descriptor que es el 2902. Así que la forma de pasar parámetros y esperar una respuesta es usando el comando char-write-req sobre el descriptor 2902 como vemos a continuación:

[11:22:33:44:55:66][LE]> char-write-req 0x0029 0100
Characteristic value was written successfully
Notification handle = 0x0028 value: 00 00
Notification handle = 0x0028 value: 00 00
Notification handle = 0x0028 value: 00 00

De esta forma, cada segundo nos retorna dos bytes hexadecimales en nuestra notificación, uno con la frecuencia cardiaca y otro que indica el valor del sensor “contacto con la piel”, este sensor no está disponible en nuestro monitor por lo que siempre será 00.

Para dejar de recibir las notificaciones, debemos escribir 0000 en los parámetros de entrada y para salir del terminal usamos el comando quit.

[11:22:33:44:55:66][LE]> char-write-req 0x0029 0000
Notification handle = 0x0028 value: 00 00
Characteristic value was written successfully
[11:22:33:44:55:66][LE]> quit

Por último, es posible escribir todo esto en una sola línea en Linux sin necesidad de programar nada. Sería una forma de hacer pruebas de forma muy rápida y sencilla al que podríamos crear un pequeño script en Phyton u otro lenguaje de programación que nos sirva de frontend para este comando.

userFoo@computerFoo:~/foo$ gatttool -b 11:22:33:44:55:66 –char-write-req -a 0x0029 -n 0100 –listen
Characteristic value was written successfully
Notification handle = 0x0028 value: 00 00
Notification handle = 0x0028 value: 00 00
Notification handle = 0x0028 value: 00 00
Notification handle = 0x0028 value: 00 00

De esta forma ya tendríamos un punto de entrada en el manejo de nuestros sensores BLE.

Jose Navero consultor en ilitia technologies