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

  • El cliente realiza, a través del socket, una solicitud de conexión. Esta llamada es bloqueante, por lo que el resultado sólo podrá ser éxito o fracaso.

Inicio de la conexión

  • El servidor acepta la conexión, notificándoselo al cliente. A continuación, abre un socket de tipo BluetoothSocket como resultado de aceptar la conexión.

Creación del socket de conexión en el servidor

  • El cliente recibe la notificación del servidor, dando como resultado una conexión correcta y saliendo de espera ocupada
  • Tanto cliente como servidor obtienen los flujos de entrada y salida de su respectivo socket.

Creación de la conexión y de los flujos de entrada y salida

  • El hilo de la conexión comienza a sondear el flujo de entrada esperando obtener datos. Si la lectura se realiza, se envían los datos a la interfaz a través de un Handler.
  • El envío de datos se realiza mediante la escritura en el flujo de salida.

Uso del handler para la obtención de datos del hilo de la conexión

En posteriores artículos echaremos un vistazo al código de cada uno de estos elementos. En este punto debemos tener claros los siguientes conceptos:

  • Cada uno de los elementos involucrados (Servidor, cliente y conexión) estará gestionado por un hilo independiente.
  • El servidor hace uso de dos sockets: un socket para aceptar las conexiones entrantes (BluetoothServerSocket) y otro para establecer la conexión (BluetoothSocket). El socket de la conexión es abierto en el momento en el que se acepta una conexión entrante (método accept()), y se le pasará como parámetro al hilo encargado de mantener la conexión.
  • El cliente hace uso de un sólo socket (BluetoothSocket). Se obtiene a partir del BluetoothDevice al cual se pretende conectar, y una vez solicitada y aceptada la conexión (método connect()) se le pasa como parámetro al hilo encargado de mantener la conexión.
  • En un principio ambos dispositivos involucrados en la conexión actúan como clientes y como servidores, esperando conexiones entrantes y también pudiendo solicitarlas.
  • El servidor será, finalmente, el primero de los dispositivos que acepte una conexión entrante. Normalmente (pero no necesariamente, ya que pueden desearse conexiones simultaneas), el proceso de aceptar conexiones se detendrá mientras exista una conexión activa.
  • El proceso de descubrimiento consume muchísimos recursos, por lo que conviene detener el proceso en caso de que se encuentre en marcha.

Artículos relacionados

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

Bluetooth (II): Descubriendo dispositivos cercanos

7 comments

  1. Hola Dani.
    Estoy intentando conectar un arduino con android. Las placas/tarjetas Arduino son baratas y se les pueden aclopar muchos sensores. Quiero conseguir hacer una especie de robot, como los muchos videos que hay por la red, me gustaria hasta poner una camara y ver el enfoque en un control del android.
    Un saludo.

    1. Hola, Manuel.

      Yo tengo aparcado en el cajón un Arduino duemilanove al que le he dado menos uso del que quisiera. Ahora mismo en dealextreme venden decenas de shields y módulos por muy poco dinero, así que es una oportunidad de oro para ponerse a trastear con ello.

      El año que viene comenzaré un máster en ingeniería de sistemas y control y es más que probable que me ponga a profundizar en el tema 🙂

      Aquí tienes un buen ejemplo de cómo usar un módulo bluetooth para conectar una placa arduino y un teléfono con Android, aunque me imagino que ya habrás indagado por tu cuenta: http://www.instructables.com/id/Androino-Talk-with-an-Arduino-from-your-Android-d/

      Gran iniciativa 😉

  2. Hola Daniel. Muy bueno tu tutorial,magnifico!!!.
    Yo estoy conectando un registrador de nuestra autoria con android.
    Al principio me fallaba esporadicamente en el createRfcommSocketToServiceRecord(MY_UUID), yo le hacia un reset al android y volvia a funcionar OK.Pero ya ni con el reset se me recupera , haciendo muchas pruebas al final logre tener el error exacto es InvocationTargetException. Al final es como todo lo que leo “y si la apertura de la conexión se realiza correctamente” y es eso que NO se realiza correctamente. Ya no se que mas hacer, quisiera ver si puedes darme alguna ayuda para yo poder seguir en mi desarrollo. Gracias, esperando por tu ayuda

Deja un comentario

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