jueves, 17 de mayo de 2012

Adroid + Bluetooth



Hay 4 tareas principales al momento de hablar de Bluetooth.

  • Configuracion del bluetooth
  • Busqueda de los dispositivos que esten disponibles en el area local
  • La conexion de dispositivos
  • Transferencia de datos entre dispositivos

Configuración de Bluetooth


Antes de que la aplicacion se pueda comunicar atraves de Bluetooth, es necesario verificar que el Bluetooth es compatible con el dispositivo, y si es asi, asegurarnos de que esta habilitado.

Si el bluetooth NO es compatible, tendremos que deshabilitarlo. Si el bluetooth es compatible, pero esta desactivada, entonces tendremos que pedir al usuario que active el Bluetooth sin dejar la aplicacion. Esta configuracion se realiza en dos pasos, utilizando los BluetoothAdapter.



1.-Recibe las BluetoothAdapter
Los BluetoothAdapter se requiere para cualquier y toda la actividad Bluetooth. Para obtener los BluetoothAdapter , llame al metodo getDefaultAdapter(). Esto devuelve un BluetoothAdapter que representa el adaptador Bluetooth del dispositivo propio (la radio Bluetooth).Hay un adaptador Bluetooth para todo el sistema, y ​​su aplicación puede interactuar con él con este objeto. Si getDefaultAdapter() devuelve un valor nulo, entonces el dispositivo no es compatible con Bluetooth y la historia termina aquí. Por ejemplo:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
    // Device does not support Bluetooth
}
2.-Activar Bluetooth

A continuación, es necesario asegurarse de que Bluetooth está activada. Llamar isEnabled() para comprobar si se permite en la actualidad Bluetooth. Si este método devuelve false, Bluetooth está desactivado. Para solicitar que el Bluetooth esté habilitado, llamada startActivityForResult() con ACTION_REQUEST_ENABLE. Este emitirá una solicitud para activar Bluetooth a través de los ajustes del sistema (sin detener la aplicación). Por ejemplo:

if (!mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

Dispositivos de Busqueda


La búsqueda de dispositivos es un procedimiento de exploración que busca en el área local para dispositivos habilitados para Bluetooth y luego solicitar alguna información sobre cada uno de ellos (esto se refiere a veces como "descubrir", "investigar" o "análisis"). Sin embargo, un dispositivo Bluetooth dentro del área local responderá a una solicitud de descubrimiento sólo si está habilitado para ser detectable. Si un dispositivo se puede detectar, que responderá a la petición de descubrimiento mediante el intercambio de cierta información, como por ejemplo el nombre del dispositivo, la clase, y su dirección MAC única. Con esta información, el dispositivo realiza el descubrimiento puede entonces elegir para iniciar una conexión con el dispositivo descubierto.

Una vez que se establece una conexión con un dispositivo remoto por primera vez, una solicitud de emparejamiento se presenta automáticamente al usuario. Cuando un dispositivo está sincronizado, la información básica acerca de ese dispositivo (como el nombre del dispositivo, la clase, y la dirección MAC) se guarda y se puede leer utilizando el API de Bluetooth. Utilizando la conocida dirección MAC de un dispositivo remoto, una conexión se puede iniciar con él en cualquier momento sin necesidad de realizar el descubrimiento (suponiendo que el dispositivo está dentro del rango).
Recuerde que hay una diferencia entre estar vinculado y conectado.

La conexion de dispositivos


Antes de realizar la detección de dispositivos, vale la pena consultar el conjunto de dispositivos emparejados para ver si el dispositivo deseado ya se conoce. Para ello, llame a getBondedDevices(). Esto devolverá un conjunto de BluetoothDevice dispositivos s pareadas que representan. Por ejemplo, puede consultar todos los dispositivos vinculados y, a continuación muestran el nombre de cada dispositivo para el usuario, utilizando un ArrayAdapter:

Set pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
    // Loop through paired devices
    for (BluetoothDevice device : pairedDevices) {
        // Add the name and address to an array adapter to show in a ListView
        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
    }
}
Todo lo que necesita BluetoothDevice con el fin de iniciar una conexión es la dirección MAC. En este ejemplo, se guarda como una parte de un ArrayAdapter que se muestra al usuario. La dirección MAC más adelante se pueden extraer con el fin de iniciar la conexión. 



Conectando con un cliente


Con el fin de iniciar una conexión con un dispositivo remoto (un dispositivo de la celebración de un socket de servidor abierto), primero debe obtener una BluetoothDevice objeto que representa el dispositivo remoto. (Obtener una BluetoothDevice se trata en la sección anterior sobre dispositivos Búsqueda .) A continuación, debe utilizar el BluetoothDevice para adquirir una BluetoothSocket e iniciar la conexión.



  1. Uso de la BluetoothDevice, consiga un BluetoothSocket llamando createRfcommSocketToServiceRecord(UUID).
    Esto inicializa un BluetoothSocket que se conectará a la BluetoothDevice . El UUID pasado por aquí debe coincidir con el UUID utilizado por el dispositivo de servidor cuando abrió su BluetoothServerSocket (con listenUsingRfcommWithServiceRecord(String, UUID) ). Utilizando el mismo UUID es simplemente una cuestión de codificar la cadena de UUID en su aplicación y, a continuación hace referencia a que tanto el servidor y el código de cliente.
  2. Iniciar la conexión llamando a connect() .
    Tras esta llamada, el sistema realizará una búsqueda de SDP en el dispositivo remoto con el fin de que coincida con el UUID. Si la búsqueda tiene éxito y el dispositivo remoto acepta la conexión, que compartirá el canal RFCOMM para usar durante la conexión y connect() regresará. Este método es una llamada de bloqueo. Si, por cualquier razón, la conexión falla o el connect() varias veces al método (después de unos 12 segundos), entonces se producirá una excepción.
    Debido a connect() es una llamada de bloqueo, este procedimiento de conexión debe realizarse siempre en un hilo separado del hilo principal actividad.
private class ConnectThread extends Thread {
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;
 
    public ConnectThread(BluetoothDevice device) {
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;
        mmDevice = device;
 
        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try {
            // MY_UUID is the app's UUID string, also used by the server code
            tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) { }
        mmSocket = tmp;
    }
 
    public void run() {
        // Cancel discovery because it will slow down the connection
        mBluetoothAdapter.cancelDiscovery();
 
        try {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException) {
            // Unable to connect; close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException) { }
            return;
        }
 
        // Do work to manage the connection (in a separate thread)
        manageConnectedSocket(mmSocket);
    }
 
    /** Will cancel an in-progress connection, and close the socket */
    public void cancel() {
        try {
            mmSocket.close();
        } catch (IOException e) { }
    }
}