bluetooth

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;
		}

(más…)

Bluetooth (V): Creando el hilo servidor


Siguiendo con la serie de artículos dedicados al Bluetooth que dejamos aquí, vamos a continuar desarrollando la clase BluetoothService añadiéndole el hilo encargado de hacer las funciones de servidor.

Tal y como hicimos con el servidor destinado a mantener la conexión, declararemos socket como atributo privado constante. En esta caso será de tipo BluetoothServerSocket, que a diferencia del BluetoothSocket tradicional, se encarga de mantenerse en escucha en un puerto y abrir un socket (esta vez sí, de la clase BluetoothSocket ) cuando detecta una conexión entrante. Comenzaremos codificando el constructor:


	// Hilo que hace las veces de servidor, encargado de escuchar conexiones entrantes y
	// crear un hilo que maneje la conexion cuando ello ocurra.
	// La otra parte debera solicitar la conexion mediante un HiloCliente.
	private class HiloServidor extends Thread
	{
		private final BluetoothServerSocket serverSocket;

		public HiloServidor()
		{
			BluetoothServerSocket tmpServerSocket = null;

			// Creamos un socket para escuchar las peticiones de conexion
			try {
				tmpServerSocket = bAdapter.listenUsingRfcommWithServiceRecord(NOMBRE_SEGURO, UUID_SEGURO);
			} catch(IOException e) {
				Log.e(TAG, "HiloServidor(): Error al abrir el socket servidor", e);
			}

			serverSocket = tmpServerSocket;
		}
	}

(más…)

Bluetooth (IV): Creando el hilo de conexión


Como vimos en anteriores artículos, los elementos necesarios para realizar una comunicación entre dos dispositivos a través de Bluetooth van a ser:

  • Cliente
  • Servidor
  • Conexión

Codificaremos cada uno de estos elementos como hilos independientes encargados de centrarse exclusivamente en su tarea. Así, el hilo servidor se encargará de escuchar conexiones entrantes, aceptarlas y establecer la conexión, mientras que el hilo cliente será el encargado de solicitar la conexión y establecerla una vez que haya sido aceptada por el servidor. Por lo tanto, el hilo encargado de establecer la conexión será lanzado tanto por el cliente como por el servidor.

Comenzaremos codificando el hilo encargado de establecer la conexión. Crearemos una clase específica que contendrá los tres hilos, de modo que la funcionalidad entre interfaz de usuario y lógica de la aplicación se mantenga separada.

Crearemos la clase añadiéndole unas cuantas constantes para definir los posibles estados y mensajes a manejar por el handler y un par de atributos privados para almacenar el estado actual de la conexión, el socket de la conexión y el handler que se encargará de comunicar los datos a la interfaz de usuario.

(más…)

Bluetooth (III): El esquema cliente-servidor


Hasta ahora hemos sido capaces de activar y desactivar el Bluetooth, hacer visible nuestro dispositivo y detectar los dispositivos visibles que encuentren en las proximidades. Es hora de intercambiar información por medio del protocolo Bluetooth, para lo cual necesitaremos unas pequeñas nociones básicas de la arquitectura cliente-servidor.

En primer lugar, el protocolo Bluetooth no se diferencia gran cosa de otros protocolos como TCP. El funcionamiento es básicamente el siguiente:

  • El servidor crea un socket de tipo BluetoothServerSocket y lo pone a la escucha de peticiones de conexión.
  • El servidor se mantiene en espera ocupada atendiendo solicitudes de conexión mediante el método accept(). Este método bloqueará el hilo hasta que una conexión entrante sea recibida.
  • El cliente instancia un dispositivo Bluetooth (BluetoothDevice) a partir de la dirección del dispositivo.
  • El cliente abre un nuevo socket de tipo BluetoothSocket a partir del dispositivo que obtuvo previamente.

Instanciación del socket cliente a partir del dispositivo (más…)

Bluetooth (II): Descubriendo dispositivos


Una vez que sabemos cómo funciona el proceso de activación y desactivación del Bluetooth, es hora de buscar dispositivos cercanos que nos permitan establecer una conexión. Para entender los ejemplos mostrados en este artículo se recomienda leer el artículo anterior, Bluetooth (I): Activando y desactivando el Bluetooth en Android.

Como vimos, para que se realice una conexión Bluetooth es necesaria la siguiente secuencia de pasos:

  1. El dispositivo B se configura como servidor, aceptando conexiones entrantes.
  2. El dispositivo A solicita la conexión al dispositivo B. Para ello, es necesario que A conozca la dirección física de B.
  3. En el caso de que A no conozca la dirección de B, la conexión no podrá llevarse a cabo.

Dado que las direcciones no se conocen a priori, es necesario un mecanismo que permita a un dispositivo Bluetooth «encontrar» a otro. Este proceso se denomina descubrimiento o discovery.

Para que el dispositivo A descubra al dispositivo B, es necesario que B, además de tener activado el Bluetooth, cambie su estado a «visible». Esto lo hacíamos solicitándoselo de forma explícita al usuario, tal y como vimos en el artículo anterior.


	Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
	startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

Partiendo de la base de que el dispositivo B se encuentra visible con el Bluetooth activo, ¿cómo hacemos que el dispositivo A le «descubra»? (más…)

Bluetooth (I): Activando y desactivando el Bluetooth en Android


El primer paso a la hora de desarrollar una aplicación que haga uso de la comunicación mediante Bluetooth es comprobar si éste está activado o no en el dispositivo y, en caso de que no sea así, solicitar al usuario permiso para activarlo.

En primer lugar, si vamos a hacer uso del Bluetooth será requisito indispensable añadir los permisos adecuados para ello en el fichero AndroidManifest.xml:


    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

Pese a que la tecnología Bluetooth está ampliamente extendida, es de obligado cumplimiento la comprobación de que el servicio está disponible en el dispositivo. Para realizar esta operación haremos uso de la clase android.bluetooth.BluetoothAdapter. Declararemos una referencia como atributo dentro de nuestra Activity y a continuación codificaremos un método, al que llamaremos configurarAdaptadorBluetooth(), que se encargará de detectar si el dispositivo puede hacer uso del Bluetooth y si éste se encuentra activo o no.

(más…)