Sunteți pe pagina 1din 16

Bluetooth

La plataforma android incluye soporte para la pila de redes bluetooth, que permite a un dispositivo
inalmbricamente intercambiar informacin con otros dispositivos bluetooth.
El marco de la aplicacin provee acceso a las funcionalidades bluetooth a travs de las Apis bluetooth de
android. Esas Apis permiten aplicaciones para conectarse inalmbricamente con otros dispositivos bluetooth,
habilitando caractersticas inalmbricas punto a punto y multipunto.
Usando las Apis bluetooth, en android se puede realizar lo siguiente.
Escanear por otros dispositivos bluetooth
Preguntar el adaptador local bluetooth para aparear los dispositivos bluetooth
Establecer canales RFCOMM
Conectarse a otros dispositivos a travs del servicio de deteccin
Transferir informacin para y desde otros dispositivos.
Administrar mltiples conexiones.
Lo Bsico
Este documento describe cmo usar las Apis bluetooth de android para lograr las cuatro tareas ms
necesarias para comunicarse usando bluetooth:
Configuracin del bluetooth
Encontrar dispositivos que estn apareados o disponibles en el rea local.
Conectar dispositivos
Transferir datos entre dispositivos
Todo sobre las Apis bluetooth de android est disponible en el paquete android.bluetooth. Aqu est el
sumario de clases e interfaces que necesitaras para crear conexiones bluetooth.
BluetoothAdapter
Representa el adaptador Bluetooth (radio Bluetooth). El BluetoothAdapter es el punto de entrada
para todas las interacciones bluetooth. Usando este, usted puede descubrir otros
dispositivos bluetooth, preguntar la lista de dispositivos unidos (apareados) , instanciar un
BluetoothDevice usando una direccin MAC conocida, y crear un BluetoothServerSocket
para escuchar por comunicaciones de otros dispositivos.
BluetoothDevice
Representa un dispositivo bluetooth remoto. Usar este para requerir una conexin con un
dispositivo remoto a travs de un BluetoothSocket o preguntar informacin acerca de
dispositivo tal como el nombre, direccin, clase y estado de unin.


BluetoothSocket
Representa la interfaz de un Bluetooth socket (enchufe Bluetooth) (similar TCP socket). Esta es
el punto de conexin que permite a una aplicacin el intercambio de datos con otro dispositivo
bluetooth va InputStream y OutputStream.
BluetoothServerSocket
Representa un server socket abierto que escucha solicitudes entrantes (Similar a TCP serverSocket).
Con el fin e conectar dos dispositivos android, un dispositivo debe abrir un server socket con
esta clase. Cuando un dispositivo bluetooth remoto hace una solicitud de conexin al
dispositivo, el BluetoothServerSocket retornara un BluetoothSocket Conectado
cuando la conexin es aceptada.
BluetoothClass
Describe las caractersticas generales y capacidades de un dispositivo bluetooth. Este es un set de
solo lectura de propiedades que definen las clases de dispositivo mayor y menor del
dispositivo. Sin embargo, esto no es fiable, describe todos los perfiles de Bluetooth y servicios
soportados por el dispositivo, pero es til como una sugerencia para el tipo de dispositivo.
BluetoothProfile
Una interfaz que representa un perfil Bluetooth. Un perfil Bluetooth son unas especificaciones de
interfaz inalmbrica para comunicaciones basadas en bluetooth entre dispositivos. Un
ejemplo es el Hands-Free profile. Para mas discusiones de perfiles, ver Workin with Profiles.
BluetoothHeadset
Provee soporte para auriculares a ser usados con los telfonos mviles. Esto incluye ambos perfiles
bluetooth: auriculares y manos libres (v1.5).
BluetoothA2dp
Define como la alta calidad de audio puede ser transmitida de un dispositivo a otro sobre una
conexin bluetooth. A2DP destaca Advance Audio Distribution Profile.
BluetoothHealt
Representa un Healt Device profile Proxy que controla el servicio de Bluetooth.
BluetoothHealthCallback
Una clase abstracta que usted usar para implementar devoluciones de llamadas
Bluetoothhealth. Usted debe extender esta clase y poner en prctica los mtodos de devolucin de
llamada para recibir actualizaciones sobre los cambios en el estado de registro de la aplicacin y del
estado del canal bluetooth.

BluetoothhealthAppConfiguration
Representa una configuracin de aplicacin que aplicacin de terceros Bluetooth Health registre
para comunicarse con un dispositivo Bluetooth Health.
BluetoothProfile.ServiceListener
Una interfaz que notifica clientes IPC BluetoothProfile cuando se han conectado o desconectado
del servicio (este es, el servicio interno que corre un particular perfil).
Permisos Bluetooth
Con el fin de usar caractersticas bluetooth en tu aplicacin, necesitas declarar por lo menos uno de los
permisos de bluetooth: BLUETOOTH o BLUETOOTH_ADMIN.
Debes requerir el permiso BLUETOOTH_ADMIN con el fin de iniciar el descubrimiento de dispositivos o
manipular las configuraciones bluetooth. La mayora de las aplicaciones necesitan permisos nicamente para
habilitar el descubrimiento de dispositivos Bluetooth local. Las otras habilidades garantizadas por estos
permisos no deben ser usadas, a menos que la aplicacin sea un administrados de poder (power manager)
esto modificara las configuracin e Bluetooth a peticin del usuario.
Entonces debe tambin tener el permiso BLUETOOTH.
Declarar los permisos Bluetooth en el archivo manifest de tu aplicacin. Por ejemplo:
<manifest ... >
<uses-permission android:name="android.permission.BLUETOOTH" />
...
</manifest>
Configuracin del Bluetooth
Antes de que tu aplicacin pueda comunicarse por bluetooth, necesitas verificar que el bluetooth es
soportado en el dispositivo, y si es as garantizar que este est habilitado.
Si bluetooth no es soportado, entonces debes Graciosamente deshabilitar cualquier caracterstica bluetooth.
Si bluetooth esta soportado, pero inhabilitado, entonces debes requerir que el usuario habilite el Bluetooth
sin dejar tu aplicacin. Esta configuracin es completada en dos pasos, usando el BluetoothAdapter.
Figura 1: dialogo habilitando Bluetooth
1. Obtener el BluetoothAdapter
El BluetoothAdapter es requerido por cualquiera y toda Bluetooth Activity. Para obtener el
BluetoothAdapter, llamar el mtodo static getDefaultAdapter ().
Este devuelve un BluetoothAdapter que representa el adaptador Bluetooth propio del dispositivo (el
Bluetooth Radio), hay un adaptador Bluetooth para el sistema entero, y tu aplicacin puede
interactuar con este usando este objeto. Si getDefaultAdapter () devuelve nulo, entonces el
dispositivo no soporta bluetooth y tu historia termina aqu. Por ejemplo:

BluetoothAdapter mBluetoothAdapter =
BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// Device does not support Bluetooth
}
2. Siguiente, necesitas asegurar que el bluetooth este habilitado. llamar isEnable () para comprobar si el
bluetooth est actualmente habilitado. Si este mtodo devuelve falso, entonces el bluetooth est
deshabilitado. Para solicitar que el Bluetooth sea habilitado, llamar startActivityForResult () con la
intent action ACTION_REQUEST_ENABLE esto emitir una solicitud para habilitar el bluetooth a travs
del sistema de configuraciones (sin parar tu actividad). Por ejemplo:

if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent,REQUEST_ENABLE_BT);
}
Un dialogo aparecer solicitando permisos de usuario para habilitar el bluetooth, como se muestra en
la figura 1. Si el usuario responde SI, el sistema iniciara la habilitacin del bluetooth y el foco volver
a tu aplicacin una vez proceso se complete (o falle).
La constante REQUEST_ENABLE_BLUETOOTH es pasada a startActivityForResult () como un entero
definido localmente (que debe ser mayor que cero), que el sistema pasa de nuevo usted en la
implementacin de tu onActivityResult () como el parmetro requestCode.

Si se habilito el bluetooth con xito, tu actividad recibe el cdigo resuelto RESULT_OK en la devolucin
de llamada de onActivityResult (), si el bluetooth no se activo debido a un error (o el usuario dijo que
NO) entonces el cdigo resulto es RESULT_CANCELED.

Opcionalmente, tu aplicacin puede tambin escuchar por el brocadas intent ACTION_STATE_CHANGED, que
el sistema transmitir cuando el estado del bluetooth cambie. Esta transmisin contiene los campos extra
EXTRA_STATE y EXTRA_PREVIOUS_STATE, conteniendo el nuevo y el viejo estado del bluetooth,
respectivamente. Los posibles valores de los campos extras son STATE_TURNING_ON, STATE_ ON,
STATE_TURNING_OFF y STATE_OFF. La escucha de esta transmisin puede ser usada para detectar cambios
hechos en el estado del bluetooth mientras tu aplicacin est corriendo.

Tip: Habilitando la detectabilidad automticamente se habilitara el bluetooth. Si tienes previsto
conscientemente habilitar la detectabilidad del dispositivo antes de desarrollar la Bluetooth Activity, usted
puede saltarse el paso 2 arriba. Leer acerca de detectabilidad, abajo.

Encontrando Dispositivos
Usando el BluetoothAdapter, puedes encontrar dispositivos bluetooth remotos ya sea a travs de la
deteccin de dispositivos o mediante consulta a la lista de dispositivos pares (unidos).
La deteccin de dispositivos es un procedimiento de escaneo que busca dispositivos bluetooth activados en
el rea local y entonces solicita alguno informacin acerca de cada uno (esto es algunas veces referido a
como detectando, preguntando o escaneando). Sin embargo, un dispositivo bluetooth dentro del rea
local responder a una solicitud de deteccin solo si este est actualmente habilitado o es detectable, este
responder a una solicitud de deteccin para el intercambio de alguna informacin, tal como el nombre del
dispositivo, la clase y su direccin MAC exclusiva. Usando esta informacin el desempao del dispositivo
detectado puede ser elegida para inicializar una conexin con el dispositivo detectado.

Una vez la conexin est hecha con el dispositivo remoto por primera vez, una solicitud de apareo es
automticamente presentada a el usuario. Cuando un dispositivo es apareado, la informacin bsica acerca
del dispositivo (tal como el nombre del dispositivo, clase y direccin MAC) son guardadas y pueden ser ledas
usando las Apis Bluetooth. Usando la conocida direccin MAC de un dispositivo remoto, una conexin puede
ser iniciada en cualquier momento sin realizar la deteccin (asumiendo que el dispositivo este en el rango).

Recuerde que hay una diferencia entre estar apareado y estar conectado. Para ser apareado significa que los
dos dispositivos estn conscientes de la existencia del otro, tener una llave de enlace compartida puede ser
usada para autenticacin, y ser capaces de establecer una conexin encriptado con cada uno de los otros.
Para ser conectados significa que el dispositivo actualmente comparte un canal RFCOMM y est habilitado
para transmitir informacin con cada uno de los otros. Las actuales APIs Bluetooth android requieren que
los dispositivos estn apareados antes de que la conexin RFCOMM pueda ser establecida. (El apareo es
realizado automticamente cuando inicializas una conexin encriptada con las Bluetooth APIs)

La siguiente seccin describe como encontrar dispositivos para ser apareados, o descubrir nuevos
dispositivos usando la deteccin de dispositivos.

Nota: los dispositivos con android no estn detectables por defecto. Un usuario puede hacer
detectable el dispositivo por un tiempo limitado a travs de la configuracin del sistema, o una
aplicacin puede solicitar que el usuario habilite la detectabilidad sin dejar la aplicacin. Como
habilitar la detectabilidad es discutido abajo.

Consultando los dispositivos apareados

Antes de realizar la deteccin de dispositivos, es digno preguntar por el conjunto de dispositivos apareados o
vinculados para ver si el dispositivo deseado es conocido. Para esto entonces, llamar getBondedDevice ().
Esto retornara un conjunto de Bluetoothdevices representando los dispositivos apareados. Por ejemplo,
puedes consultar todos los dispositivos apareados y entonces mostrar cada uno de los dispositivos al usuario,
usando un ArrayAdapter:

Set<BluetoothDevice> 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());
}
}
Todos lo que se necesita del objeto BluetoothDevice con el fin de iniciar la conexin es la direccin MAC. En
este ejemplo, esto es guardado como parte de un ArrayAdapter que se mostrara al usuario. La direccin
MAC puede despus ser extrada con el fin de iniciar la conexin. T puedes aprender ms acerca de crear
una conexin en la seccin conectando dispositivos.

Detectando dispositivos

Para iniciar la deteccin de dispositivos, simplemente llamar startDiscovery (). El proceso es asncrono y el
mtodo inmediatamente retornara con un booleano indicando si la deteccin inicio exitosamente. El
proceso de deteccin usualmente implica una exploracin de indagacin por cerca de 12 segundos, seguida
por una pgina de escaneo de cada uno de los dispositivos encontrados para recuperar su nombre
Bluetooth.

Tu aplicacin debe registrar un BroadcastReceiver para el intent ACTION_FOUND con el fin de recibir
informacin acerca de cada dispositivo detectado. Por cada dispositivo, el sistema emitir el intent
ACTION_FOUND. Este intent lleva campos EXTRA_DEVICE y EXTRA_CLASS, conteniendo un BluetoothDevice y
un BluetoothClass, respectivamente. Por ejemplo, aqu es cmo puedes registrarte para manejar la
transmisin cuando el dispositivo esta detectado.
// Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice device =
intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
};
// Register the BroadcastReceiver
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); // Don't forget to unregister during
onDestroy
Todos lo que se necesita del objeto BluetoothDevice con el fin de iniciar la conexin es la direccin MAC. En
este ejemplo, esto es guardado como parte de un ArrayAdapter que se muestra al usuario. La direccin MAC
puede despus ser extrada con el fin de iniciar la conexin. T puedes aprender ms acerca de crear una
conexin en la seccin conectando dispositivos.

Precaucin: La realizacin de la deteccin de dispositivos es un procedimiento pesado para el
adaptador Bluetooth y consume una gran cantidad de sus recursos. Una vez haya encontrado un
dispositivo para conectar, asegurase siempre de parar la deteccin con cancelDiscovery () antes
de intentar establecer una conexin. Tambin, si t ya tienes una conexin con un dispositivo,
entonces realizar una deteccin puede reducir significativamente el ancho de banda
disponible para la conexin, por lo que no debes realizar una deteccin mientras se est
conectado.

Habilitando detectabilidad

Si quieres hacer el dispositivo local detectable para otros dispositivos, llama startActivityForResult (Intent,
int) con action intent ACTION_REQUEST_DISCOVERABLE.
Esto emitir una solicitud para habilitar el modo detectable a travs de la configuracin del sistema (sin parar
tu aplicacin). Por defecto, el dispositivo ser detectable por 120 segundos. Puedes definir una duracin
diferente aadiendo el Intente extra EXTRA_DISCOVERABLE_DURATION. La mxima duracin en aplicacin
establecerse en 3600 segundos, y el valor de cero significa que el dispositivo esta siempre detectable.
Cualquier valor por debajo de cero o arriba de de 3600 segundos es colocado automticamente como 120
segundos. Por ejemplo, este fragmento establece la duracin a 300:
Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
un dialogo ser desplegado, solicitando permiso del usuario para hacer al dispositivo detectable, como se
muestra en la figura 2.
Figura 2: el dialogo de habilitando detectabilidad

Si el usuario responde Yes, entonces el dispositivo se convertir en detectable por el monto de tiempo
especificado. Tu Activity entonces recibir una llamada a la devolucin onActivityResult () con el cdigo
resultante igual a la duracin que el dispositivo esta detectable. Si el usuario responde No o si ocurre un
error, el cdigo resultante es RESULT_CANCELED.

Nota: si el bluetooth no est habilitado en el dispositivo, entonces habilitar la detectabilidad del
dispositivo automticamente habilitara el Bluetooth.

El dispositivo silenciosamente permanecer modo detectable por el tiempo asignado. Si usted quiere ser
notificado cuando el modo detectable Ha cambiado, usted puede registrar un BroadcastReceiver para el
intent ACTION_SCAN_MODE_CHANGED. Este contendr los campos extra EXTRA_SCAN_MODE y
EXTRA_PREVIOUS_SCAN_MODE, que indican que el dispositivo esta en cualquiera de los dos modos de
detectabilidad, no detectable pero disponible para recibir conexiones, no detectable y no disponible para
recibir conexiones, respectivamente.

T no necesitas habilitar la detectabilidad del dispositivo si tu vas a iniciar la conexin con un dispositivo
remoto. Habilitar la detectabilidad solo es necesario cuando quieres tu aplicacin para albergar un server
socket que aceptara conexiones entrantes, debido a que los dispositivos remotos deben ser capaces de
detectarlo antes de que pueda iniciar la conexin.

Conectando dispositivos

Con el fin de crear una conexin entre tu aplicacin en 2 dispositivos, debes implementar ambos
mecanismos el lado servidor y el lado cliente. Porque un dispositivo debe abrir un server Socket y el otro
debe iniciar la conexin (usando la direccin MAC del dispositivo servidor para iniciar la conexin). El servidor
y el cliente se consideran conectados entre s cuando cada uno tiene un BluetoothSocket conectado en el
mismo canal RFCOMM. En este punto, cada dispositivo puede obtener corrientes de entrada y salida y la
transferencia de informacin puede iniciar, que es discutido en la seccin acerca de administrando una
conexin. Esta seccin describe como iniciar la conexin entre dos dispositivos.

El dispositivo servidor y el dispositivo cliente obtienen el requerido BluetoothSocket de diferentes maneras.
El servidor recibir este cuando una conexin entrante es aceptada. El cliente lo recibir cuando este abre un
canal RFCOMM al servidor.

Una tcnica de implementacin es automticamente preparar cada dispositivo como un servidor, de modo
que cada uno tenga un server socket abierto y escuchando por conexiones. Entonces ambos dispositivos
pueden iniciar una conexin con el otro y convertirse en cliente. Alternativamente, un dispositivo puede
albergar la conexin y abrir un server socket en demanda y el otro dispositivo puede simplemente iniciar la
conexin.

Nota: si los dos dispositivos no estn previamente apareados, entonces el framework de android
mostrara automticamente una notificacin de solicitud de apareamiento o un dialogo para el usuario
durante el procedimiento de conexin, como se muestra en la figura 3.
Figura 3: dialogo de apareo de Bluetooth

As que cuando se trata de conectar los dispositivos, la aplicacin no necesita preocuparse acerca de si los
dispositivos estn apareados. Su intento de conexin RFCOMM se bloquear hasta que el usuario ha
enlazado correctamente, o se producir un error si el usuario rechaza la vinculacin, o si el emparejamiento
falla o se demora demasiado.

Conectndose como un servidor

Cuando quieras conectar dos dispositivos, uno debe actuar como servidor manteniendo abierto un
BluetoothServerSocket. El propsito del server socket es escuchar por solicitudes de conexiones entrantes y
cuando una es aceptada, proveer un BluetoothSocket conectado. Cuando el BluetoothSocket es adquirido
desde el BluetoothServerSocket, el BluetoothServerSocket puede (o debe) ser descartado, a menos que
quieras aceptar mas conexiones.

Este es el procedimiento bsico para configurar un server socket y aceptar una conexin.

1. Obtener un BluetoothServerSocket llamando a listenUsingRfcommWithServiceRecord (String, UUID).
El string es un nombre de identificacin de su servicio, que el sistema automticamente escribir una
nueva entrada base de datos entrante de protocolo de deteccin de servicio (SDP) en el dispositivo (el
nombre es arbitrario y puede simplemente ser el nombre de su aplicacin). El UUID es tambin
incluido en la entrada SDP y ser lo bsico para el acuerdo de conexin con el dispositivo cliente. Esto
es cuando el cliente intenta conectarse con este dispositivo, este llevara un UUID que nicamente
identifica el servicio con que este quiere conectarse. Estos UUID deben coincidir con el fin de la
conexin sea aceptada (en el siguiente paso).

2. Iniciar la escucha de solicitud de conexin llamando accept ().
Esta es una llamada de bloqueo. Esta retornara cuando cualquiera de los dos una conexin ha sido
aceptada o han ocurrido excepciones. Una conexin es aceptada solo cuando un dispositivo remoto ha
enviado una solicitud de conexin con un UUID correspondiente con la registrada con ese socket de
escuche del servidor. Cuando tiene xito accept () retornara un BluetoothSocket conectado.

3. Al menos que quieras aceptar conexiones adicionales, llamar a close ().
Esto libera el server socket y todos sus recursos, pero no cierra el BluetoothSocket conectado que ha
sido devuelto por accept (). A diferencia de TCP/IP, RFCOMM solo permite un cliente conectado por
canal al mismo tiempo, entonces en la mayora de los casos tiene sentido llamar a close () en el
BluetoothServerSocket inmediatamente despus de aceptar un socket conectado.

El llamado a accept () no debe ser ejecutado en el hilo de la interfaz de usuario en la actividad principal
porque esto es una llamada de bloqueo y prevendr cualquier otra interaccin con la actividad. Esto
usualmente tiene sentido para hacer todo el trabajo con un
BluetoothServerSocket o BluetoothSocket en un nuevo hilo administrado por tu aplicacin.
Para abortar una llamada de bloqueo tal como accept (), llamar a close () en el
BluetoothServerSocket (o BluetoothSocket) desde otro hilo y la llamada de bloqueo inmediatamente
retornara. Note que todos los mtodos en un BluetoothServerSocket o
BluetoothSocket son hilos seguros.

Ejemplo.

Aqu est un hilo simplificado para el componente server que acepta llamadas entrantes.

private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;

public AcceptThread() {
// Use a temporary object that is later assigned to mmServerSocket,
// because mmServerSocket is final
BluetoothServerSocket tmp = null;
try {
// MY_UUID is the app's UUID string, also used by the client code
tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
} catch (IOException e) { }
mmServerSocket = tmp;
}

public void run() {
BluetoothSocket socket = null;
// Keep listening until exception occurs or a socket is returned
while (true) {
try {
socket = mmServerSocket.accept();
} catch (IOException e) {
break;
}
// If a connection was accepted
if (socket != null) {
// Do work to manage the connection (in a separate thread)
manageConnectedSocket(socket);
mmServerSocket.close();
break;
}
}
}

/** Will cancel the listening socket, and cause the thread to finish */
public void cancel() {
try {
mmServerSocket.close();
} catch (IOException e) { }
}
}

En este ejemplo solo una llamada entrante es deseada, entonces tan pronto como una conexin es aceptada
y el BluetoothSocket es adquirido, la aplicacin enva el BluetoothSocket adquirido a un hilo separado, cierra
el BluetoothSocket y rompe los ciclos.

Note que cuando accept () devuelve el BluetoothSocket, el socket ya est conectado, entonces tu no debes
llamar connect () (como lo haces desde el lado del cliente).

manageConnectedSocket () es un mtodo ficticio en la aplicacin que inicializara el hilo para la transferencia
de datos, con esto discutido en la seccin administrando una conexin.

Debes usualmente cerrar tu BluetoothServerSocket tan pronto como termines de escuchar las conexiones
entrantes. En este ejemplo, close () es llamado tan pronto como el BluetoothSocket es adquirido. Usted
tambin puede proveer un mtodo publico en tu hilo que puede cerrar el BluetoothSocket en el evento que
tu necesites parar escuchando en el server socket.

Conectando como cliente

Con el fin de iniciar una conexin con un dispositivo remoto (un dispositivo sosteniendo un server socket
abierto), debes primero obtener un objeto BluetoothDevice que represente el dispositivo remoto. (como
obtener un BluetoothDevice es cubierto en la seccin arriba acerca de encontrando dispositivo). Debes
entonces usar el BluetoothDevice para adquirir un BluetoothSocket e iniciar la conexin.

Ac esta el procedimiento bsico:

1. Usando el BluetoothDevice, obtener un BluetoothSocket llamando
createRfcommSocketWithServiceRecord (String, UUID).
Este inicializa un BluetoothSocket que se conectara con el BluetoothDevice. El UUID pasado aqu debe
coincidir con el UUID usado por el dispositivo servidor cuando este abre este BluetoothServerSocket
(con ListenUsingRfcommWithServiceRecord (String, UUID)). Usando el mismo UUID es simplemente
cuestin de codificar la cadena UUID dentro de tu aplicacin y entonces referenciarla desde el servidor
y el cdigo cliente.

2. Inicialice la conexin llamando connect ().
Sobre este llamado el sistema de realizara una bsqueda SDP en el dispositivo remoto con el fin de
coincidir el UUID. Si la bsqueda es exitosa y el dispositivo remoto acepta la conexin, este compartir
el canal RFCOMM para ser usado durante la conexin y connect () devolver. Este mtodo es una
llamada de bloqueo. Si, por alguna razn, la conexin falla o el mtodo connect () est fuera de tiempo
(despus de 12 segundo), entonces este lanza una excepcin.
Debido a que connect () es una llamada de bloqueo, este procedimiento de conexin debe siempre
ser llevado a cabo en un hilo separado de el hilo de la actividad principal.

Nota: debes siempre asegurar que el dispositivo no est realizando deteccin de dispositivos c
uando llamas a connect (). Si la deteccin esta en progreso, entonces el intento de conexin
ser significativamente ms lento y es ms probable que falle.

Ejemplo

Aqu est un ejemplo bsico de un hilo que inicializa una conexin bluetooth.

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) { }
}
}

Observe que cancelDiscovery () es llamado antes de la conexin. Usted siempre debe hacer esto antes de
conectar y es seguro llamar sin comprobar si actualmente se est ejecutando o no (pero si quieres
comprobar, llamar isDiscovering ()).

manageConnectedSocket () es un mtodo ficticio en la aplicacin que iniciara el hilo para transferencia de
informacin, que este discutido en la seccin sobre administrando una conexin.

Cuando tu hayas terminado con tu BluetoothSocket, siempre llamar a close () para limpiarlo. Si lo hace,
inmediatamente cerrar el socket conectado y limpiara todos los recursos internos.

Administrando una conexin

Cuando tengas satisfactoriamente conectados dos dispositivos (o ms), cada uno tendr un BluetoothSocket
conectado. Esto es donde la diversin comienza porque puedes compartir informacin entre los dispositivos.
Usando el BluetoothSocket, el procedimiento general para transferir informacin arbitraria es simple.

1. Obtener el InputStream y el OutPutStream que manejaran las transmisiones entre el socket, va
getInputStream () y getOutPutStream (), respectivamente.
2. Leer y escribir informacin para los streams con read (byte []) y write (byte []).
Que es este.
Hay, por supuesto, detalles de la implementacin a considerar. Primero y principal, debes usas un hilo
dedicado para todos los streams Reading y writing. Esto es importante porque los mtodos read (byte []) y
write (byte []) son llamadas de bloqueo. read(byte []) bloqueara hasta que haya lago para leer en el stream.
write (byte []) usualmente no bloquea, pero puede bloquear para controlar el flujo si el dispositivo remoto
no est llamando read (byte []) con la suficiente rapidez y los buffers intermedios estn llenos. Entonces tu
ciclo principal en el hilo debe dedicarse a leer del InputStream. Un mtodo pblico separado en el hilo puede
ser usado para iniciar escritura en el OutPutStream.

Ejemplo

Ac est un ejemplo de cmo podra ser esto:
private class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;

public ConnectedThread(BluetoothSocket socket) {
mmSocket = socket;
InputStream tmpIn = null;
OutputStream tmpOut = null;

// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;
}

public void run() {
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()

// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
} catch (IOException e) {
break;
}
}
}
/* Call this from the main activity to send data to the remote device */
public void write(byte[] bytes) {
try {
mmOutStream.write(bytes);
} catch (IOException e) { }
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}
El constructor adquiere los streams necesarios y una vez ejecutado, el hilo esperara por informacin para
venir a travs de InputStream. Cuando read (byte []) devuelve con bytes del stream, la informacin es
enviada a el main Activity usando un miembro manejador desde la clase padre. Entonces este vuelve y
escribe ms bytes del stream.
El envi de datos es tan simple como llamar al mtodo write () del hilo de la aplicacin principal y pasndole
los bytes a ser enviados. Este mtodo entonces simplemente llama write (byte []) para enviar informacin al
dispositivo remoto.
El mtodo cancel () del hilo es importante para que la conexin se puede finalizar en cualquier momento
mediante el cierre del BluetoothSocket. Este siempre debe ser llamado cuando se haya terminado de usar la
conexin Bluetooth.
Para una demostracin de uso de las Apis de Bluetooth, ver el Bluetooth Chat simple app.

S-ar putea să vă placă și