Utilizar BLE en apps de Cordova - Android e iOS

Ignacio Buioli
- 11/09/2017

En los diversos proyectos donde nos hemos visto involucrados, suele necesitarse una forma personalizada de capturar datos (mediante sensores), procesarlos y enviarlos a un dispositivo para su posterior uso. Lo natural es pensar en implementar Bluetooth, por su eficacia al transmitir a dispositivos cercanos y la posibilidad de implementarlo con micro-controladores Arduino. Por otro lado, es muy probable que necesitemos desarrollar una app para dispositivos móviles, que posteriormente almacene la información o la envíe a un servidor. Y así como venimos utilizando, nos interesa que dicha app se pueda desarrollar con Apache Córdova por sus posibilidades tanto en producción como en testeo al valerse de JavaScript.

Es común encontrar diversos módulos Bluetooth para Arduino, desde los primeros HM01 hasta los más modernos. El problema aparece con las compatibilidades y iOS. Los módulos HM01 son de funcionamiento sencillo, mientras que los más modernos como los HM10 y HM11 (por ejemplo, el modelo CC2541) utilizan la tecnología Bluetooth Low Energy (BLE).  Estos módulos tienen una serie de ventajas frente al resto en el mercado:

 

- Son económicos y se consiguen de diversas formas mediante importadores locales (a diferencia de los iBeacons).

- Se pueden utilizar en cualquier Arduino o incluso familias de micro-controladores que implementen comunicación Serial.

- Consumen poca energía para transmitir o recibir datos, utilizando 3.3v de Arduino y no 5v como la mayoría de los módulos.

- No necesitan ser emparejados con un dispositivo.

- No necesitan tener un disociador de voltaje en el puerto TX.

- Son compatibles con Android (a partir de la 4.3) y con iOS (es el único hardware de bluetooth compatible con iOS de todas formas).

 

Es por esto que, muy probablemente, estemos interesados en utilizarlos. Existen muchas maneras de conectar el módulo HM10/11 y no nos vamos a centrar en eso ahora. Tiene seis terminales pero solo necesitamos conectar 4: GND, VCC (3.3v, con 5v se quemará), TX y RX. En internet pueden encontrarse circuitos de complejidad baja, e incluso el código que no es más que un código donde el dato que queremos enviar por Bluetooth se debe escribir en el Serial (el Serial es conveniente generarlo nosotros, usando la librería de Arduino SoftwareSerial, asignando entonces un TX y RX personalizados).

Para el caso de una app Cordova será necesario desarrollar de forma distinta a un módulo Bluetooth convencional, y en eso si vamos a centrarnos. Para empezar, vamos a necesitar un plugin específico llamado BLE Central, el cual no tiene un ejemplo funcional para los módulos HM10/11. Aún así, podemos utilizar el ejemplo desarrollado para el módulo Adafruit Bluefruit LE, ya que su funcionamiento interno es compatible con los HM10/11 (en caso de poseer un módulo Adafruit Bluefruit LE, utilizando ese ejemplo sin modificaciones será suficiente).

El cambio dentro del código es muy sencillo y está relacionado con la UUID del módulo Bluetooth BLE HM10/11. En el ejemplo del Adafruit Bluefruit LE buscamos el archivo www/js/index.js, y ahí mismo buscamos la siguiente declaración de JavaScript:

 

// this is Nordic's UART service
var bluefruit = {
    serviceUUID: '6e400001-b5a3-f393-e0a9-e50e24dcca9e',
    txCharacteristic: '6e400002-b5a3-f393-e0a9-e50e24dcca9e', // transmit is from the phone's perspective
    rxCharacteristic: '6e400003-b5a3-f393-e0a9-e50e24dcca9e'  // receive is from the phone's perspective
};

 

Podemos ver que este fragmento simplemente declara la UUID y los puertos TX y RX que la app necesita para escuchar/enviar. Lo vamos a modificar de la siguiente manera:

 

var bluefruit = {
    serviceUUID: 'ffe0',
    txCharacteristic: 'ffe1', // transmit is from the phone's perspective
    rxCharacteristic: 'ffe1'  // receive is from the phone's perspective
};

 

Esta declaración hará que la app esté buscando todos los dispositivos con BLE y no un dispositivo en particular. Al compilar la app y ejecutarla desde un teléfono móvil (con el Bluetooth activado) podremos ver que la app va a encontrar un dispositivo llamado, generalmente, BT05 y que será nuestro Arduino conectado a un módulo BLE. También es posible encontrar dispositivos llamados unknow, que suelen tratarse de dispositivos que se encuentran cerca pero a los cuales no tenemos acceso.