You are on page 1of 15

Desarrollo de Aplicaciones Android UCLM 2012/13

Conectividad Bluetooth

Curso de Android 2012/13

Bluetooth es una tecnologa standard abierta, global wireless para intercambio de datos sobre distancias cortas entre aparatos fijos y mviles, creado areas de redes personales (PANs), con altos niveles de seguridad.

4 tareas principales para comunicarse usando Bluetooths La configuracin de Bluetooth Encontrar aparatos que estn o bien ya apareados o que se encuentre dentro del area local Conectar aparatos Transferir datos entre aparatos

Desarrollo de Aplicaciones Android UCLM 2012/13

EL marco de aplicaciones de Android provee acceso a la funcionalidad Bluetooth a travs de la Android Bluetooth API

Clases e interfaces necesarias (I)


BluetoothAdapter (radio bluetooth) -Descubrimiento de otros aparatos BT -Consulta a la lista de aparatos ligados - Instanciar un BluetoothDevice usando una direccin MAC conocida - Crear un BluetoothServerSocket para escuchar las conversaciones de otros equipos BluetoothDevice Es el equipo remoto con BT. Esta clase se usa para pedir conexin con un equipo remoto a travs de la interfaz BluetoothSocket BluetoothSocket Punto de conexin para intercambiar datos con otros equipos BT usando InputStream y OutputStream. Es la interfaz de un socket BT. La devuelve el BluetoothServerSocket ante un pedido de conexin cuando la conexin es aceptada BluetoothServerSocket Representa un servidor socket abierto para pedidos entrantes. Al comenzar una conexin un aparato debe abrir un servidor socket

Desarrollo de Aplicaciones Android UCLM 2012/13

Clases e interfaces necesarias (II)


BluetoothClass (solo lectura) Describe las caractersticas y capacidades del equipo BT BluetoothProfile: Interfaz que especifica el perfil de la aplicacin (Android 3.0) - Auriculares (BluetoothHeadset) Provee soporte para auriculares para mviles junto con Hands-Free - A2DP (Advanced Audio Distribution Profile- BluetoothA2dp) Define como audio de alta calidad puede ser transmitido entre equipos BT - Equipos de salud (BluetootHealth a partir de Android 4) Para crer aplicaciones que se comunican con equipamiento de salud que utilicen BT (monitores de frecencia cardaca, medidores de tension arterial, etc) BluetoothHeathCallback , BluetoothHealthAppConfiguration - Manos libres (Hands-Free) BluetoothProfile.ServiceListener Interfaz que notifica cuando un cliente ha sido conectado o desconectado de un servicio con un determinado perfil.

Desarrollo de Aplicaciones Android UCLM 2012/13

Permisos Bluetooth
BLUETOOTH: Necesario para realizar cualquier comunicacin BT (pedir o aceptar conexiones, enviar datos) BLUETOOTH_ADMIN: Necesario para descubrimiento de equipos o configurar BT Para aplicaciones que necesiten descubrir y conectar equipos BT

Se declaran en el Manifiesto
<manifest ... > <uses-permission android:name="android.permission.BLUETOOTH" /> ... </manifest>

Desarrollo de Aplicaciones Android UCLM 2012/13

Pasos para la conectividad


1)Obtener el adaptador Bluetooth (sellama al mtodo esttico getDefaultAdapter())
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

2) Habilitar el adaptador (llamando a startActivityForResult con el intent ACTION_REQUEST_ENABLE)


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

Desarrollo de Aplicaciones Android UCLM 2012/13

3) Descubrimiento de equipos Bsqueda en el area local de equipos que tengan BT habilitado Se usa el BluetoothAdapter Una vez descubierto se intercambian el nombre, tipo, y la direccin MAC nica Se elige si comunicarse o no Una vez comunicado por primera vez se hace una peticion de vinculacin. Una vez vinculados las conexiones siguientes se hacen sin necesidad de descubrimiento.

Estar vinculados no significa estar conectados


Estar conectados significa compartir un canal RFCOMM.

El API de Android requiere estar vinculados antes de generar el canal RFCOMM

Desarrollo de Aplicaciones Android UCLM 2012/13

3) Descubrimiento de equipos Primero se buscan los aparatos vinculados llamando a getBondedDevices


Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices(); // si hay aparatos vinculados if (pairedDevices.size() > 0) { // Loop a travs de los aparatos vinculados for (BluetoothDevice device : pairedDevices) { //Agrega el nombre y direccin a un array adapter para mostrarlos en una ListView mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); } }

Desarrollo de Aplicaciones Android UCLM 2012/13

3) Descubrimiento de equipos Luego comienza el descubrimiento de servicios llamando al mtodo startDiscovery() La aplicacin debe registrar un BroadcastReceiver para el intent ACTION_FOUND
// Crear un BroadcastReceiver para ACTION_FOUND private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); // cuando se encuentra un aparato if (BluetoothDevice.ACTION_FOUND.equals(action)) { // obtiene el objeto BluetoothDevice desde el intent BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // Agrega el nombre y direccin a un array adapter para mostrarlos en una ListView mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); } } }; // Registra el BroadcastReceiver IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mReceiver, filter);

Desarrollo de Aplicaciones Android UCLM 2012/13

3) Descubrimiento de equipos Si se quiere hacer visible el dispositivo propio a otros equipos hay que llamar a startActivity con el intent ACTION_REQUEST_DISCOVERABLE
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent);

Desarrollo de Aplicaciones Android UCLM 2012/13

4) Conectando equipos Implementar mecanismos de ambos lados (clientes y servidor)


Un equipo abre un server socket y el otro , usando la direccin MAC del server inicia la conexin.

Servidor:
Desarrollo de Aplicaciones Android UCLM 2012/13

a) Crea unBluetoothServerSocket llamando al listenUsingRFcommWithServiceRecord(String,UUID) b)Comienza a escuchar llamando al mtodo accept() Es bloqueante, hasta una excepcin o hasta que el aparato remoto mande un pedido de conexin con la UUID correspondiente. En este caso el metodo accept() devuelve BluetoothSocket c) Si no se aceptan mas conexiones invocar al mtodo close()

4) Conectando equipos Implementar mecanismos de ambos lados (clientes y servidor)


Un equipo abre un server socket y el otro , usando la direccin MAC del server inicia la conexin.

Cliente
Desarrollo de Aplicaciones Android UCLM 2012/13

a) Crea unBluetoothSocket llamando al createRFcommWithServiceRecord(UUID) b)Inicia la conexin llamando al mtodo connect() Connect chequea el UUID, si coincide con el del serversocket y el remoto acepta la comunicacin, comparten entonces el canal Rfcomm. Es bloqueante, se realiza con un thread separado del thread principal.

5) Gestionando la conexin Una vez conectados comienza el envo de datos 1) Se hace usando las clases InputStream y OutputStream que manejan la transmisin a travs del Socket. Para obtener y enviar datos se invocan a los mtodos getInputStream() Y getOutputStream. 2) Se leeen y se escriben datos en los streams usando read(byte[]) y write(byte[]) respectivamente

Y eso es todo bsicamente

Desarrollo de Aplicaciones Android UCLM 2012/13

EJEMPLO

CHAT CON BLUETOOTH

Permisos declarados en el Manifiesto Dos actividades declaradas en el Manifiesto: DeviceListActivity (Abre cuadro de dilogo) BluetoothChat (Inicia la aplicacin)
Desarrollo de Aplicaciones Android UCLM 2012/13

EJEMPLO

CHAT CON BLUETOOTH

Tres archivos .java (dos actividades y una clase) BluetoothChat.java: Archivo principal, despliega el chat DeviceListActivity.java: Actividad que aparece como un dilogo. Muestra una lista de los aparatos vinculados y los descubiertos BluetoothChatService.java: Clase que configura y gestiona las comunicaciones con otros equipos. Tres threads: Uno que escucha, otro para conectar, Otro para enviar datos

Desarrollo de Aplicaciones Android UCLM 2012/13