Editing Bombilla LED de colores con Bluetooth Low Energy

Jump to: navigation, search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 49: Line 49:
 
* Para aprender como funciona Bluetooth Low Energy en Android, el mejor tutorial y código que he encontrado es el de Dave Smith [http://www.doubleencore.com/2013/12/bluetooth-smart-for-android/] con código fuente en [https://github.com/devunwired/accessory-samples/tree/master/BluetoothGatt]
 
* Para aprender como funciona Bluetooth Low Energy en Android, el mejor tutorial y código que he encontrado es el de Dave Smith [http://www.doubleencore.com/2013/12/bluetooth-smart-for-android/] con código fuente en [https://github.com/devunwired/accessory-samples/tree/master/BluetoothGatt]
 
* 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%).
 
* 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).  
+
* 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ítica 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 quién haga un push cuando haga falta).  
 
* El flujo de una aplicación BLE en Android es es siguiente.
 
* El flujo de una aplicación BLE en Android es es siguiente.
 
# Obtener el adaptador Bluetooth de Android para poder acceder a la funcionalidad BLE
 
# Obtener el adaptador Bluetooth de Android para poder acceder a la funcionalidad BLE
# Escanear/Buscar dispositivos BLE (servidores) disponibles en el entorno por medio de la función <code>startLeScan()</code>. Este escaneo tiene que ser limitado en el tiempo y, tras unos segundos, se para el escaneo a través de la función <code>stopLeScan()</code>. Cada dispositivo detectado durante el escaneo genera un evento <code>onLeScan()</code> en el cliente Android.
+
# Escanear/Buscar dispositivos BLE (servidores) disponibles en el entorno (este escaneo tiene que ser limitado en el tiempo) por medio de la función <code>startLeScan()</code>. Tras unos segundos, parar el escaneo a través de la función <code>stopLeScan()</code>. Este proceso genera eventos <code>onLeScan()</code> para cada dispositivo detectado.
# 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: <code>mGatt.readCharacteristic(characteristic)</code> ) 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, <code>onCharacteristicRead()</code> )
+
# Para descubrir los servicios que ofrece un dispositivo hay que utilizar el servicio 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 funcionan en modo asíncrono, esto es, se hace una petición (por ejemplo, para leer el valor de una característica se utiliza: <code>mGatt.readCharacteristic(characteristic)</code>) 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, <code>onCharacteristicRead()</code> )
 
En el proyecto se han utilizado los siguientes comandos de GATT:
 
En el proyecto se han utilizado los siguientes comandos de GATT:
 
# <code>connect()</code> para conectarse al dispositivo desde el cliente. Genera el callback <code>onConnectionStateChange()</code>
 
# <code>connect()</code> para conectarse al dispositivo desde el cliente. Genera el callback <code>onConnectionStateChange()</code>
# <code>discoverServices()</code> para descubrir los servicios y características disponibles en un dispositivo. Genera el callback <code>onServicesDiscovered()</code>
+
# <code>discoverServices</code> para descubrir los servicios y características disponibles en un dispositivo. Genera el callback <code>onServicesDiscovered</code>
# <code>readCharacteristic()</code> 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 <code>onCharacteristicRead()</code>
+
# <code>readCharacteristic()</code> para leer el valor de una característica. El valor de la caracteristica en el deispositivo es recibido por el cliente en el callback <code>onCharacteristicRead()</code>
# <code>writeCharacteristic()</code> 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 <code>onCharacteristicWrite()</code>
+
# <code>writeCharacteristic()</code> para leer 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 <code>onCharacteristicWrite()</code>
 
# <code>discconnect()</code> para desconectar el cliente del dispositivo servidor.
 
# <code>discconnect()</code> 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:
+
# 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";
 
  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:
+
# 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";
 
  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:
+
# Esta característica almacena un vector de 18 bytes en ASCCI según el formato ya descrito en la introducción del proyecto:
 
     data = r + "," + g + "," + b + "," + bright + ","
 
     data = r + "," + g + "," + b + "," + bright + ","
 
     // 30 2C 31 30 38 2C 36 30 2C 38 34 2C 2C 2C 2C 2C 2C 2C
 
     // 30 2C 31 30 38 2C 36 30 2C 38 34 2C 2C 2C 2C 2C 2C 2C
Line 70: Line 70:
 
     // 128,1,0,50,,,,,,,,
 
     // 128,1,0,50,,,,,,,,
 
     // 31 32 38 2C 31 2C 30 2C 35 30 2C 2C 2C 2C 2C 2C 2C 2C
 
     // 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.
 
 
[[File:ControlLight.png|600px]]
 
 
 
=== Enlaces ===
 
El código del proyecto en github [https://github.com/jmgjmg/MSMBle]
 
 
Descarga la aplicación desde Google Play [https://play.google.com/store/apps/details?id=com.tumaku.msmble]
 
 
[[Category:Proyectos]][[Category:Multimedia]]
 

Please note that all contributions to Wiki Makespace Madrid may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see Wiki Makespace Madrid:Copyrights for details). Do not submit copyrighted work without permission!

To protect the wiki against automated edit spam, we kindly ask you to type the two words you see in the box below:

Cancel | Editing help (opens in new window)