Bluetooth (VI): Creando el hilo cliente


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

24 comments

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

  2. 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?

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

  3. 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;

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

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

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

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

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

  8. 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!!

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

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s