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 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 UIDuniversally 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.

Ejemplo de iBeacons

Beacons en Android. Beacons on Android

  • 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.

compile 'org.altbeacon:android-beacon-library:${altbeacon.version}'

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

public class RangingActivity extends Activity implements BeaconConsumer, RangeNotifier {
    protected static final String TAG = "RangingActivity";
    private BeaconManager mBeaconManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ranging);

        mBeaconManager = BeaconManager.getInstanceForApplication(this);

        // En este ejemplo vamos a usar el protocolo Eddystone, así que tenemos que definirlo aquí
        mBeaconManager.getBeaconParsers().add(new BeaconParser().
                setBeaconLayout(BeaconParser.EDDYSTONE_UID_LAYOUT));

        // Bindea esta actividad al BeaconService
        mBeaconManager.bind(this);
    }
}

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.

@Override
public void onBeaconServiceConnect() {
    // Encapsula un identificador de un beacon de una longitud arbitraria de bytes
    ArrayList<Identifier> identifiers = new ArrayList<>();
    
    // Asignar null para indicar que queremos buscar cualquier beacon
    identifiers.add(null);

    // Representa un criterio de campos utilizados para buscar beacons
    Region region = new Region("AllBeaconsRegion"), identifiers);

    try {
        // Ordena al BeaconService empezar a buscar beacons que coincida con el objeto Region pasado
        mBeaconManager.startRangingBeaconsInRegion(region);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
    // Especifica una clase que debería ser llamada cada vez que BeaconsService obtiene datos, una vez por segundo por defecto
    mBeaconManager.addRangeNotifier(this);
}

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

@Override 
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) {
    if (beacons.size() > 0) {
        Log.i(TAG, "El primer beacon detectado se encuentra a una distancia de "+beacons.iterator().next().getDistance()+" metros.");        
    }
}

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.

También hemos publicado un video en #SGBootcamp en el que hablo sobre beacons y explico un ejemplo:

Y por otro lado, también podéis ver el código del ejemplo del video en: https://github.com/davigonz/SG-Bootcamp-Beacons

Espero que os haya gustado, si tenéis alguna pregunta, no dudéis en hacerla 😉

Otros enlaces relacionados

OCR en Android

Android Services desde cero

 

Share on LinkedInTweet about this on TwitterShare on FacebookShare on Google+Buffer this page

2 comentarios en “Beacons en Android

  1. Hola. Perdona quisiera ver si me
    Puedes ayudar. Estoy atorado en la programación de un beacon

    Está configurado en Eddystone y lo estoy utilizando en Dashboard pero los dispositivos cercanos no detectan el mensaje y el attachment aunque dice estar salvado en Dashboard en la app no aparece cargado. Lo único que necesito es que el beacon envíe un link a los teléfonos cercanos. Ya sean Android y de ser posible a iOS aunque fuese con una app ya existente como Chrome. Me puedes ayudar?

    De antemano agradezco tu atención

Deja un comentario

By completing the form you agree to the Privacy Policy