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

El método principal del hilo se encargará de mantenerse a la espera (el método accept() es bloqueante) siempre y cuando no exista una conexión activa en este momento. Una vez que un cliente haya solicitado la conexión, se sale del método accept()


		public void run()
		{
			debug("HiloServidor.run()", "Iniciando metodo");
			BluetoothSocket socket = null;

			setName("HiloServidor");
			setEstado(ESTADO_ATENDIENDO_PETICIONES);
			// El hilo se mantendra en estado de espera ocupada aceptando conexiones
			// entrantes siempre y cuando no exista una conexion activa.
			// En el momento en el que entre una nueva conexion,
			while(estado != ESTADO_CONECTADO)
			{
				try {
					// Cuando un cliente solicite la conexion se abrirá el socket.
					socket = serverSocket.accept();
				}
				catch(IOException e) {
					Log.e(TAG, "HiloServidor.run(): Error al aceptar conexiones entrantes", e);
					break;
				}

A continuación realizamos un lock del objeto y, dependiendo del estado, creamos un nuevo hilo de conexión (al que pasamos el socket que acabamos de abrir) que se encargará de recibir y enviar mensajes o bien cerraremos el socket si ya disponemos de una conexión activa.


				// Si el socket tiene valor sera porque un cliente ha solicitado la conexion
				if(socket != null)
				{
					// Realizamos un lock del objeto
					synchronized(BluetoothService.this)
					{
						switch(estado)
						{
							case ESTADO_ATENDIENDO_PETICIONES:
							case ESTADO_REALIZANDO_CONEXION:
							{
								// Estado esperado, se crea el hilo de conexion que recibira
								// y enviara los mensajes
								hiloConexion = new HiloConexion(socket);
								hiloConexion.start();
								break;
							}
							case ESTADO_NINGUNO:
							case ESTADO_CONECTADO:
							{
								// No preparado o conexion ya realizada. Se cierra el nuevo socket.
								try {
									socket.close();
								}
								catch(IOException e) {
									Log.e(TAG, "HiloServidor.run(): socket.close(). Error al cerrar el socket.", e);
								}
								break;
							}
							default:
								break;
						}
					}
				}

			} // End while
		}

Finalmente, codificaremos un método que se encargará de cerrar el socket en caso de que así se lo solicitamos.


		public void cancelarConexion()
		{
			try {
				serverSocket.close();
			}
			catch(IOException e) {
				Log.e(TAG, "HiloServidor.cancelarConexion(): Error al cerrar el socket", e);
			}
		}
	}

Como último paso para tener operativa nuestra aplicación, más adelante veremos cómo codificar el cliente Bluetooth para solicitar la conexión al servidor.

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

Anuncios

3 comments

  1. Buen día.

    De ante mano gracias por el tutorial, pero tengo un inconveniente, necesito recibir datos asi como el chat pero desde un dispositivo que toma medidas de presion y las envía por Bluetooth pero al realizar la conexion no empareja, es decir no sale la solicitud de la clave para conectar, como pudiera realizar conexion con este dispositivo, gracias.

  2. Me he descargado tu apk pero no funciona bien, tiene 2 fallos:

    -El botón Enviar está deshabilitado.
    -Cuando clicko en Enlazados, la app se cierra.

    Podrías corregirlo ?

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