¿Cómo funcionan los iBeacon?

Las balizas iBeacon son un sistema diseñado para la localización en interiores.

El problema

Cuando estamos dentro de un edificio, el sistema GPS de nuestro smartphone no tiene visibilidad de los satélites de posicionamiento y resulta complicado ubicarlo. Además, el GPS tiene un error de varios metros en el mejor de los casos, lo que no nos permite ser lo suficientemente precisos intentando ubicar a una persona dentro de una habitación, por ejemplo.

La solución

Para solucionarlo se utilizan balizas Bluetooth que emiten constantemente una serie de identificadores que permiten que nuestro móvil las identifique y mida la potencia de señal que nos llega desde ellas. Sabiendo qué baliza es y la distancia a la que estamos de ella, podemos deducir nuestra posición en el edificio.

Tal como se explica en este documento de Apple, las balizas emiten unos valores predefinidos:

CampoLongitudDescripción
UUID16 bytesIdentificador único de la aplicación o el proveedor de la baliza.
major2 bytesRegión de la baliza.
minor2 bytesSubdivisión de la región.

El identificador completo de una baliza será UUID/major/minor y podemos utilizarlo como queramos. Por ejemplo, podríamos tener un UUID correspondiente a Egibide, el valor major podría representar el campus y el minor un aula concreta.

Convirtiendo un iPhone en baliza

Partiendo de estos tutoriales sobre como crear un emisor y un receptor, he creado una aplicación de ejemplo que convierte al iPhone en una baliza y en un receptor, mostrando los parámetros que se emiten y reciben.

El código fuente está disponible en este repositorio de GitHub.

macOS en la nube

A la hora de desarrollar aplicaciones para iOS, no todos tenemos accesible un Mac en el que trabajar. Para resolver este problema, he encontrado un servicio llamado macincloud que permite acceder remotamente a un equipo en el que podemos trabajar a un precio razonable.

El plan más barato es de 20 dólares al mes (unos 17 euros) y permite usar un Mac mini con 8GB de RAM durante un máximo de tres horas diarias.

Puntos a tener en cuenta:

  • Hay que recordar cerrar la sesión cada vez que vayamos a estar inactivos usando la opción del menú, no basta con cerrar la ventana.
  • Xcode y todo el software que necesitamos ya está instalado. Si falta algo, se puede pedir a través del formulario del panel de control.
  • El soporte es rápido, tuve problemas con CocoaPods, que no arrancaba, pero en unas horas lo habían reinstalado y estaba resuelto.

Unas capturas de ejemplo:

Programando un rover NXT con Java

Al hilo de un ejercicio que hemos hecho en la asignatura de programación, y los problemas para comprender por qué creamos los programas de este modo, se me ha ocurrido crear físicamente un pequeño rover basado en este robot en 5 minutos.

Resulta que al ladrillo de LEGO Mindstorms NXT que tengo se le puede reemplazar el firmware por otro llamado leJOS NXJ, que permite programar el sistema usando código escrito en Java.

Instalación del software necesario

Trabajo sobre macOS y antes de empezar he tenido que hacer algunos cambios:

  • Instalar Java 6 para macOS. Algunos de los componentes necesitan una máquina virtual Java de 32 bits, así que no queda otra que instalar la versión antigua.
  • Descargar NXJ y descomprimirlo.
  • Crear algunas entradas en el fichero ~/.profile o ~/.bash_profile:
export NXJ_HOME="<RUTA A LA CARPETA DESCOMPRIMIDA DE NXJ>"
export LEJOS_NXT_JAVA_HOME=$(/usr/libexec/java_home -v1.6)
export PATH="$NXJ_HOME/bin:$PATH"

Actualización del firmware

Advertencia: este proceso sobreescribe el firmware original de LEGO y, si algo va mal, os podéis quedar con un NXT inutilizado. Seguid las instrucciones del tutorial al pie de la letra, NO me hago responsable de lo que ocurra.

Dicho esto, el siguiente paso es instalar el firmware de LeJOS mediante el comando nxjflash.

Construyendo el rover

Siguiendo las instrucciones y con algunos extras propios, ha quedado así:

rover_nxt

Básicamente disponemos de dos motores, conectados en A y B, y un sensor de ultrasonidos, conectado en S1.

¡Hola mundo!

Primera prueba, siguiendo el tutorial:

import lejos.nxt.Button;

public class HolaMundo {
    public static void main (String[] args) {
        System.out.println("Hola mundo");
        Button.waitForAnyPress();
    }
}

Compilar y ejecutar el programa

Para compilar los programas, usamos nxjc y para enlazarlos y ejecutarlos en el ladrillo conectado por USB, nxj:

$ nxjc HolaMundo.java
$ nxj -r -o HolaMundo.nxj HolaMundo

En la documentación hay más detalles y opciones.

Moviendo el rover

En este repositorio de GitHub están el resto de los ejemplos, junto con un script para compilarlos cómodamente.

¿Y ahora?

Todo lo necesario para hacer programas más complejos está explicado en el tutorial de NXJ.