Concluiremos la codificación del ejemplo completo de una aplicación que realiza un intercambio de información a través de Bluetooth mediante una arquitectura comunicación cliente-servidor mostrando cómo realizar el hilo encargado de solicitar la conexión, es decir, el cliente.
Comenzaremos creando la clase dentro de nuestro BluetoothService. Este hilo tendrá dos atributos privados: el dispositivo al que se quiere conectar y el socket que el dispositivo remoto abrirá para realizar la conexión.
// Hilo encargado de solicitar una conexion a un dispositivo que este corriendo un // HiloServidor. private class HiloCliente extends Thread { private final BluetoothDevice dispositivo; private final BluetoothSocket socket; public HiloCliente(BluetoothDevice dispositivo) { BluetoothSocket tmpSocket = null; this.dispositivo = dispositivo; // Obtenemos un socket para el dispositivo con el que se quiere conectar try { tmpSocket = dispositivo.createRfcommSocketToServiceRecord(UUID_SEGURO); } catch(IOException e) { Log.e(TAG, "HiloCliente.HiloCliente(): Error al abrir el socket", e); } socket = tmpSocket; }
El hilo principal se encargará de solicitar la conexión al socket, cancelando en primer lugar la tarea de descubrimiento en caso de que esté activa (el proceso de descubrimiento consume muchísimos recursos y ralentiza la conexión). En caso de error, cerraremos el socket.
Una vez el socket se ha abierto, eliminamos la referencia al hilo cliente (es decir, la referencia que BluetoothService mantiene al propio hilo cliente) e instanciamos el hilo destinado a la conexión pasándole el socket, ya abierto, como parámetro.
public void run() { setName("HiloCliente"); if(bAdapter.isDiscovering()) bAdapter.cancelDiscovery(); try { socket.connect(); setEstado(ESTADO_REALIZANDO_CONEXION); } catch(IOException e) { Log.e(TAG, "HiloCliente.run(): socket.connect(): Error realizando la conexion", e); try { socket.close(); } catch(IOException inner) { Log.e(TAG, "HiloCliente.run(): Error cerrando el socket", inner); } setEstado(ESTADO_NINGUNO); } // Reiniciamos el hilo cliente, ya que no lo necesitaremos mas synchronized(BluetoothService.this) { hiloCliente = null; } // Realizamos la conexion hiloConexion = new HiloConexion(socket); hiloConexion.start(); }
Finalmente, se añade un método para cancelar la conexión de forma explícita.
public void cancelarConexion() { debug("cancelarConexion()", "Iniciando metodo"); try { socket.close(); } catch(IOException e) { Log.e(TAG, "HiloCliente.cancelarConexion(): Error al cerrar el socket", e); } setEstado(ESTADO_NINGUNO); } }
Con esto concluye la serie de artículos destinados a entender el funcionamiento básico del Bluetooth en un dispositivo Android. Puedes descargarte el código completo del ejemplo desde aquí. Si lo deseas, también puedes bajarte directamente el .apk o echarle un vistazo al ejemplo que Google proporciona.
Artículos relacionados
Bluetooth (I): Activando y desactivando el Bluetooth en Android
Bluetooth (II): Descubriendo dispositivos cercanos
Bluetooth (III): El esquema cliente-servidor
Bluetooth (IV): Creando el hilo de conexión
Bluetooth (V): Creando el hilo servidor
Excelente tu app!!,
Gracias por tu tutorial y por dejarnos tu código. Ha sido una gran ayuda.
Me alegro de que te sirva. Gracias a ti por leerme.
Un saludo.
Ante todo Daniel, muchas gracias por el currado tutorial sobre Bluetooth y encima en el idioma de cervantes. Mi agradecimiento por adelantado.
He instalado la aplicación, así como compilado el proyecto en Eclipse y en ambos casos, cuando me conecto con un PC, abro conexión desde Hyperterminal y envío cualquier cadena hacia el PC o desde el PC, ni envío ni recibo absolutamente nada. Con otra aplicación pruebo y no hay problema.
No te puedes imaginar, lo que agradezco el que me puedas orientar sobre el tema, llevo bastante tiempo intentando dar con el problema y no soy capaz.
Gracias de antemano.
Santiago.
Hola, Santiago.
Siento no poder ayudarte, pero no estoy familiarizado con el uso del Hyperterminal.
Un saludo.
Que tal daniel..
buen dia gracias por este gran contenido, pero me surge una duda ¿es posible controlar un dispositivo de manera remota pero como administrador?
me explico: seria posible que desde un dispositivo una persona pudiera activar el bluetooth de otro? y establecer una conexión?
oye amigo no me deja descargar tu proyecto espero me puedas ayudar a pasarmelo saludos!!!
Prueba a copiar el enlace (haciendo click derecho sobre él y seleccionando «copiar dirección del enlace») y pegarlo sobre una nueva ventana del navegador.
A veces algunos complementos de bloqueo de publicidad o estadísticas hacen que funcionen de forma anómala los URL Shorteners como goo.gl.
Un saludo.
Excelente el tutorial, mejor que algunos libros que leí sobre el tema.
Muchas gracias 😉
Hola que tal me e quedado atorado en el primer tutorial en que archivo tengo que poner
private Button btnBluetooth = (Button)findViewById(R.id.btnBluetooth);
private BluetoothAdapter bAdapter;
El programa no me funciona de manera conerrecta…….Cuando se supone que se debe conectar a otro dispositivo, no lo hace, incluso cuando en la aplcacion marca que esta conectado. Ademas cada que se pulsa el botn «Enlazados» de la aplicacion, se cieera.
los dos deben estar en modo «visible» es decir activa el bluetooth en los 2 dispositivos y acepta los 120seg de «visible».Si funciona
Me pasa exactamente lo mismo… pudiste solucionarlo?
Cuando preciono «Enlazados» se me cierra la aplicacion.
Gracias por tu explicación y el código, al principio no entendía bien como funcionaba ahora veo que es un chat, muy interesante gracias por la ayuda.
Amigo buen tutorial, podras darnos el codigo del bluetooth pero en processing.
gracias
Muchas gracias por el tutorial. Quería preguntarle si hay alguna forma de mostrar el flujo de datos de lectura en un activity diferente al que se utiliza para crear el handle y el servicio. Ya que consigo cambiar de activity al recibir un mensaje concreto del handle pero no consigo modificar este nuevo activity a partir del flujo de entrada.
Muchísimas gracias.
Excelente tutorial, ayuda muchísimo. Me gustaría saber si a la hora de querer conectar con un dispositivo Bluetooth como un HC05 o 06 el procedimiento es el mismo.
hola una pregunta como lo habro en el emulador de eclipse? no puedo abriri me bota error en el adapter gracias
Los emuladores de android no tiene soporte para emular bluetooth, asique aunque pudieras correrlo sin problemas (cosa que dudo) no podrias hacer funcionar el bluetooth
Hola, me gustaria saber como abrir el proyecto entero que dejaste subido para probarlo bien porque estoy teniendo problemas.
Aclaro que estoy usando la version 1.3.1 del Android Studio
Te agradeceria una respuesta porque ando necesitando un programa como este!
PD:Excelente tutorial!!
Pude abrir el proyecto… pero no me conecta con ningun dispositivo, por mas que los 2 esten visibles. Aparece como conectado pero no los conecta realmente. ah… y el boton ENLAZADOS hace que se cierre la app
Hola Daniel, excelente post…podrias pasarme tu email? Hay un par de consultas que me gustaría hacerte por un proyecto en el que esto en la Universidad Nacional de Córdoba en Argentina.
http://www.theappguruz.com/blog/to-allow-two-way-text-chat-over-bluetooth-in-android
Buenas te hago una consulta. Me figura que se encuentra conectado pero en realidad no lo estan. Sabes como solucionarlo?
Hola disculpa al realizar la conexión marca un error al realizar la lectura y me manda a la line 407 de bluetoothServices