David González Verdugo Android Senior Specialist

Beacons en Android

Bluetooth es uno de los estándares tecnológicos más conocidos hoy en día y es utilizado en una gran variedad de situaciones donde se necesita intercambiar datos.

Una variante de esta tecnología es BLE o Bluetooth Low Energy, que se diferencia del Bluetooth común en el bajo consumo de batería básicamente y es una buena opción para aplicaciones que solo necesitan intercambiar datos de vez en cuando.

En esta entrada, voy a hablar sobre una clase de dispositivos denominados beacons,  los cuales hacen uso de BLE, y a continuación, introduciré un ejemplo básico en Android para detectarlos.

¿Qué es exactamente un beacon?

Un beacon es un transmisor hardware que transmite un paquete de información, permitiendo a smartphones, tablets y otros dispositivos electrónicos, realizar acciones específicas cuando se encuentren cerca.

La información transmitida incluye un UID o universally unique identifier y varios bytes que pueden ser utilizados para determinar la localización física del dispositivo.

Todos los beacons poseen las siguientes características configurables independientemente del fabricante o el protocolo utilizado:

  • Tx power: es la potencia con la que los beacons transmiten una señal que viaja por el aire y disminuye con la distancia. Lógicamente, cuanto más grande sea esta potencia, más batería consumirá el beacon.
  • Intervalo de emisión: este valor define la frecuencia con la que emite un beacon. A diferencia del tx power, cuanto más bajo sea este intervalo de emisión, más consumirá el beacon, pero es importante pensar un poco antes de establecer este intervalo muy alto, ya que el dispositivo receptor tendría más dificultades para detectar el beacon en este caso.

Protocolos de beacons

  • iBeacon: creado por Apple, fue el protocolo que introdujo la tecnología BLE mundialmente y define 3 parámetros:
    • UUID: identifica un grupo.
    • Major: identifica un subgrupo de beacons dentro de un grupo más grande.
    • Minor: identifica un beacon específico.

  • Eddystone:  es un proyecto de código abierto desarrollado por Google. A diferencia de iBeacon, tiene soporte oficial para iOS y Android. Un beacon configurado con este protocolo puede emitir uno de los siguientes tipos de paquetes:
    • Eddystone-UID: contiene un identificador de un beacon.
    • Eddystone-URL: contiene una URL.
    • Eddystone-TLM: es emitido con los paquetes anteriores y contiene el estado de salud de un beacon, como el nivel de batería por ejemplo.
    • Eddystone-EID: contiene un identificador encriptado que cambia periódicamente.
  • AltBeacon: protocolo desarrollado por Radius Networks. Fue creado como una alternativa al protocolo cerrado iBeacon, ofreciendo las mismas funcionalidades pero siendo capaz de entregar más información en cada mensaje emitido.

Usos prácticos

  • (GEO) Marketing: una aplicación puede mostrar ofertas y recomendaciones dependiendo de la localización de un cliente, predicha por los beacons.
  • Museos: un beacon puede ser instalado cerca de una obra de arte en cada sala de tal forma que los visitantes obtengan información relevante cuando estén cerca.
  • Salud: monitorización de movimientos y actividades de pacientes en el hogar.
  • Prevención: en actividades peligrosas, es posible asegurar que los trabajadores lleven puesto los equipos adecuados, cumpliendo los estándares de seguridad.

Detectando beacons en Android

Aunque hay muchas librerías para detectar beacons en Android, vamos a utilizar android-beacons-library, desarrollada por la misma gente que creó el protocolo abierto AltBeacon. Esta librería puede ser fácilmente configurada para detectar una gran variedad de beacons, incluyendo los beacons más populares del mercado.

Enlace: https://github.com/AltBeacon/android-beacon-library

*Importante: antes de empezar con la aplicación Android, necesitamos configurar los beacons a utilizar. Algunos fabricantes proveen una aplicación para establecer los diferentes parámetros como el modo de emisión (iBeacon, Eddystone…) y el periodo. Para este ejemplo, utilizaremos el protocolo Eddystone y un periodo de escaneo de 1 segundo, así que es importante ajustar el periodo de emisión del beacon en concordancia.

Una vez explicado lo que necesitamos, empecemos añadiendo la dependencia de la librería android-beacon-library en el fichero build.gradle y compilando el proyecto.

A continuación, crearemos una actividad que llamaremos RangingActivity, implementará  BeaconConsumer  y utilizará BeaconManager para configurar la interacción con los beacons.

El método de arriba invoca un callback (onBeaconServiceConnect()), donde podemos empezar a detectar los beacons cercanos y recibir información sobre ellos utilizando RangeNotifier. Completemos este callback.

Ahora, implementaremos el método que es llamado una vez por cada periodo de escaneo configurado, para ofrecer información sobre los beacons visibles.

En el método de arriba, obtenemos datos relevantes de cada Beacon detectado como la distancia y podemos implementar diferentes comportamientos dependiendo de estos datos, como por ejemplo abrir una URL si el beacon se encuentra a un metro de distancia.

En resumen

Hemos visto un primer enfoque de los dispositivos beacons, qué son, qué protocolos pueden utilizar y como pueden ser detectados en una aplicación de Android.

Hay muchos detalles que no han sido explicados en esta entrada. Para más detalles, os recomiendo leer más documentación sobre el protocolo específico a utilizar en vuestras aplicaciones.