Bombilla LED de colores con Bluetooth Low Energy

From Wiki Makespace Madrid
Revision as of 15:39, 28 February 2014 by 95.63.23.55 (Talk) (Detalles)

Jump to: navigation, search

Bombilla LED de colores con Bluetooth Low Energy

ESTADO: Propuesto para M-Week Feb 2014

Miembros: Javier M.

Objetivo

Controlar una bombilla LED desde internet a través de un móvil

Motivación

Aprender cómo funciona Bluetooth Low Energy y poder integrarlo después en otros proyectos

Antecedentes

Tengo una bombilla yeelight comprada en Seeedstudio. Hay publicado un pseudo SDK para Android. Las últimas semanas he estado trasteando con Bluetooth Low Energy y el último API de Android. Tras el "Hola mundo", ahora me gustaría programar algo "de verdad".

No tengo ni experiencia, ni dispositivos, ni entorno de desarrollo iOS. Si alguien se anima, se puede hacer el mismo proyecto en paralelo para entorno Apple y comparar las plataformas.

Para interactuar con la bombilla, y si da tiempo quiero utilizar el SDK de twinsprite, una startup de unos amigos que une objetos virtuales y objetos físicos.


Métodos y técnicas utilizadas

  • Bombilla yeelight
  • Bluetooth Low Energy
  • Android (+ iOS?)
  • API de twinsprite


Detalles

Tras leer el código, esto es todo lo que hay que saber para controlar la bombilla yeelight (color en formato RGB e intensidad de 0 a 100):

   public static final String YEELIGHT_SERVICE = "0000fff0-0000-1000-8000-00805f9b34fb";
   public static final String CHARACTERISTIC_CONTORL = "0000fff1-0000-1000-8000-00805f9b34fb";
   data = r + "," + g + "," + b + "," + bright + ","
   // 30 2C 31 30 38 2C 36 30 2C 38 34 2C 2C 2C 2C 2C 2C 2C
	
   // 128,1,0,50,,,,,,,,
   // 31 32 38 2C 31 2C 30 2C 35 30 2C 2C 2C 2C 2C 2C 2C 2C
	
   characteristic.setValue(data.getBytes());
   gatt.writeCharacteristic(characteristic);


Dicho y hecho. Realmente sólo hace falta ese código y cuatro días de eclipse, android, stackoverflow y makespace para conseguirlo!!! Aunque escribiré un tutorial más detallado sobre el proyecto, aquí resalto algunos puntos importantes:

  • He utilizado el IDE de eclipse compilando para el API19 de Android (4.4.2) que es el disponible en Nexus 7
  • Recomiendo la documentación creada por Yeelight y compartida desde su web [1]. En el API de Android hay código fuente aunque por desgracia todavía no hay una app de ejemplo. El servicio de soporte técnico de Yeelight es muy bueno y responde rápido :-)
  • Para aprender como funciona Bluetooth Low Energy en Android, el mejor tutorial y código que he encontrado es el de Dave Smith [2] con código fuente en [3]
  • Bluetooth Low energy (BLE) implementa el concepto de cliente y servidor. En el caso de la bombilla Yeelight, la bombilla es un servidor que ofrece sus servicios (control del color e intensidad de la bombilla) y el dispositivo android (Nexus 7) es el cliente que hace peticiones a este servicio (encender el color naranja con intensidad 50%).
  • Simplificando mucho, un servicio BLE se compone de una serie de características. Las características no son más que un conjunto de bytes que se pueden escribir o leer según unas propiedades que se especifican en el servicio (por ejemplo,hay que autenticarse antes de leer, los datos se encriptarán,...). Las características también pueden implementar el concepto de notificación. Cuando una característica cambia de valor, informa a todos los clientes que se hayan registrado a sus notificaciones (no hace falta hacer polling desde el cliente, será el servidor quien haga un push cuando haga falta).
  • El flujo de una aplicación BLE en Android es es siguiente.
  1. Obtener el adaptador Bluetooth de Android para poder acceder a la funcionalidad BLE
  2. Escanear/Buscar dispositivos BLE (servidores) disponibles en el entorno por medio de la función startLeScan(). Este escaneo tiene que ser limitado en el tiempo y, tras unos segundos, se para el escaneo a través de la función stopLeScan(). Cada dispositivo detectado durante el escaneo genera un evento onLeScan() en el cliente Android.
  3. Para descubrir los servicios que ofrece un dispositivo hay que utilizar el perfil GATT de BLE(The GATT profile is a general specification for sending and receiving short pieces of data known as "attributes" over a BLE link. All current Low Energy application profiles are based on GATT.) La mayoría de funciones de GATT trabajan en modo asíncrono, esto es, se hace una petición (por ejemplo, para leer el valor de una característica se utiliza: mGatt.readCharacteristic(characteristic) ) y la respuesta se recibe a posteriori en otra función a través de un mecanismo de callback definido en el API BLE de Android (en el caso anterior, onCharacteristicRead() )

En el proyecto se han utilizado los siguientes comandos de GATT:

  1. connect() para conectarse al dispositivo desde el cliente. Genera el callback onConnectionStateChange()
  2. discoverServices() para descubrir los servicios y características disponibles en un dispositivo. Genera el callback onServicesDiscovered()
  3. readCharacteristic() para leer el valor de una característica. El valor de la caracteristica almacenado en el dispositivo servidor es recibido por el cliente en el callback onCharacteristicRead()
  4. writeCharacteristic() para escribir el valor de una característica. El resultado (éxito, error) de la operación de escritura en el servidor lo recibe el cliente a través del callback onCharacteristicWrite()
  5. discconnect() para desconectar el cliente del dispositivo servidor.
  • La bombilla Yeelight impementa un servicio propietario pero perfectamente documentado. Su identificador (UUID en terminología BLE) es:
public static final String YEELIGHT_SERVICE = "0000fff0-0000-1000-8000-00805f9b34fb";
  • El color de la bombilla y su intensidad se controla a través de una única característica:
public static final String CHARACTERISTIC_CONTROL = "0000fff1-0000-1000-8000-00805f9b34fb";
  • Esta característica almacena un vector de 18 bytes en ASCII según el formato ya descrito en la introducción del proyecto:
   data = r + "," + g + "," + b + "," + bright + ","
   // 30 2C 31 30 38 2C 36 30 2C 38 34 2C 2C 2C 2C 2C 2C 2C
	
   // 128,1,0,50,,,,,,,,
   // 31 32 38 2C 31 2C 30 2C 35 30 2C 2C 2C 2C 2C 2C 2C 2C
  • En breve limpiamos el código Android y lo subimos a github. También escribiremos un tutorial explicando el código.

ControlLight.png