Curso de Android 2012/13 Conectividad Bluetooth
Bluetooth es una tecnología standard abierta, global wireless para intercambio de datos sobre distancias cortas entre aparatos fijos y móviles, creado areas de redes personales (PANs), con altos niveles de seguridad. EL marco de aplicaciones de Android provee acceso a la funcionalidad Bluetooth a través de la Android Bluetooth API 4 tareas principales para comunicarse usando Bluetooths La configuración de Bluetooth Encontrar aparatos que estén o bien ya apareados o que se encuentre dentro del area local Conectar aparatos Transferir datos entre aparatos
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 dirección 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 conexión con un equipo remoto a través de la interfaz BluetoothSocket BluetoothSocket Punto de conexión 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 conexión cuando la conexión es aceptada BluetoothServerSocket Representa un servidor socket abierto para pedidos entrantes. Al comenzar una conexión un aparato debe abrir un servidor socket
Clases e interfaces necesarias (II) BluetoothClass (solo lectura) Describe las características y capacidades del equipo BT BluetoothProfile: Interfaz que especifica el perfil de la aplicación (Android 3.0) - Auriculares (BluetoothHeadset) Provee soporte para auriculares para móviles 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 cardíaca, 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.
Permisos Bluetooth BLUETOOTH: Necesario para realizar cualquier comunicación 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>
Pasos para la conectividad 1)Obtener el adaptador Bluetooth (sellama al método estático 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); }
3) Descubrimiento de equipos Búsqueda en el area local de equipos que tengan BT habilitado Se usa el BluetoothAdapter Una vez descubierto se intercambian el nombre, tipo, y la dirección MAC única Se elige si comunicarse o no Una vez comunicado por primera vez se hace una peticion de vinculación. 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
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 través de los aparatos vinculados for (BluetoothDevice device : paireddevices) { //Agrega el nombre y dirección a un array adapter para mostrarlos en una ListView marrayadapter.add(device.getname() + "\n" + device.getaddress()); } }
3) Descubrimiento de equipos Luego comienza el descubrimiento de servicios llamando al método startdiscovery() La aplicación 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 dirección 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);
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);
4) Conectando equipos Implementar mecanismos de ambos lados (clientes y servidor) Un equipo abre un server socket y el otro, usando la dirección MAC del server inicia la conexión. Servidor: a) Crea unbluetoothserversocket llamando al listenusingrfcommwithservicerecord(string,uuid) b)comienza a escuchar llamando al método accept() Es bloqueante, hasta una excepción o hasta que el aparato remoto mande un pedido de conexión con la UUID correspondiente. En este caso el metodo accept() devuelve BluetoothSocket c) Si no se aceptan mas conexiones invocar al método close()
4) Conectando equipos Implementar mecanismos de ambos lados (clientes y servidor) Un equipo abre un server socket y el otro, usando la dirección MAC del server inicia la conexión. Cliente a) Crea unbluetoothsocket llamando al createrfcommwithservicerecord(uuid) b)inicia la conexión llamando al método connect() Connect chequea el UUID, si coincide con el del serversocket y el remoto acepta la comunicación, comparten entonces el canal Rfcomm. Es bloqueante, se realiza con un thread separado del thread principal.
5) Gestionando la conexión Una vez conectados comienza el envío de datos 1) Se hace usando las clases InputStream y OutputStream que manejan la transmisión a través del Socket. Para obtener y enviar datos se invocan a los métodos getinputstream() Y getoutputstream. 2) Se leeen y se escriben datos en los streams usando read(byte[]) y write(byte[]) respectivamente Y eso es todo básicamente
EJEMPLO CHAT CON BLUETOOTH Permisos declarados en el Manifiesto Dos actividades declaradas en el Manifiesto: DeviceListActivity (Abre cuadro de diálogo) BluetoothChat (Inicia la aplicación)
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 diálogo. 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