Download as pdf
Download as pdf
You are on page 1of 52
SAP{TULO 4 Comunicacion con bluetooth Por CARSTEN VOGT Y MicueL GaRclA PINEOA isposiivs méviles pueden enviar y recibir datos @ través de milipes cana. Fe= para este propésito, pueden usar la red telefica o wif pero también pues Yalos @ través de bluetooth. Bluetooth es una tecnologia que permite Herwteernos de las conexiones con cable y conectar los dispositvas, de forte feambrica, La comunicacion bluetooth se limita a cortas distancias (nase 100 sa jependiondo de la potencia de transmision utlizada). Ademés, Ja voor, s bien baja (1 Mbps en la velocidad de datos basicos y 203 1d de datos mejorada). Hoy en dia, bluetooth es un estandar de Hore nacion de gran difusion para transmitir datos entre dispositvas movies en Iislancias cortas con tasas de datos relativamente bajas. F aunque, desde un punto de Vista técrco, la transmision de ga10s & Nour de arth es bastante simple, la programacién do aplicaciones distribuidas que f° jede llegar a ser compleja. En este capitulo programas que establezcan conexiones bluetooth Hae fos dispostives y permiianintercambio de datas ene clos. Se ester er lcomunica’ dos disposivos moviles con Android y también come Cormeeese erzpoattvo con Android con un PC. Para la programacion en el PC utiizaremos. ig edicion estndar de Java (Java SE). Objetivos: = Entender las difere Presentar los conceptos basicos y los pas Comunicaciones de datos a través de bluetooth. ‘Aprender a programar aplicaciones de Android que intercambian datos @ través de bluetooth. rencias entre bluetooth e Internet. ‘os necesarios para realizar 160 + Aprender a intercambiar datos entre una aplicacién de Android y una aplicacién basada en Java SE 4.1 Diferencias entre bluetooth e Internet Antes de entrar en los detalles de la tecnologia bluetooth, que es el tema principay de este capitulo, vale la pena destacar las diferencias entre Intemet y bluctow, {La siguiente lista remarca las diferencias entre ambos. + Intemet es una red que lo abarca todo, destinada a conectar tanto dispositivos fiios como méviles en una amplia gama de distancias utiizando diversas tec. ‘nologias cableadas e inalémbricas de comunicacion. Bluetooth es mucho mas limitado, ya que se limita @ conectar de manera inatémbrica (en su mayoria) {os dispositivos méviles a través de distancias cortas. * Lapila de protocolos de Internet (es decir, el sistema de normas de control de {a transmisi6n) no especifica ninguna tipo de tecnologia de transmision (ca- bleada o inatambrica, éptica o radio, etc.). Unicamente, se centra en capas Superiores donde se especifica cémo encaminar paquetes de datos en la red, ‘como establecer conexiones enire dispositivos, ete. Por el contrario, la pila del Protocolo bluetooth especifica la gama completa de capas, desde la transi. sién a partir de sefiales de radio en la capa inferior, hasta la transmision de Servicios o la sefalizacién telefonica en la parte superior. Internet tiene un esquema de direccionamiento global. Normalmente, los dis- ositivos de Internet son visibles con sus direcciones tnicas y por lo tanto. pueden ser contactados inmediatamente. En contraste con esto, dos disposit. vos bluetooth deben estar explicitamente «emparejados» antes de que pue dan intercambiar datos, Para el acceso a Intemet, Java para Android incluye los paquetes java.net, Java. toy android.net. Los primeros se utiizan también en Java SE (Java Standard Edition), por lo que un programador de aplicaciones Android puede Emplear el mismo cédigo para la comunicacién en Internet que usaria en Java SE tradicional. Para bluetooth, no hay ningun paquete comin a Java SE y An roid. Java SE utiliza una API que sigue el estandar JSR-82: en su lugar, An. droid define su propia API en el paquete android. bluetooth ‘Como puede verse a partir de la comparacion anterior, 1a programacién de @Bicactones distibuidas que se comunican a través de bluetooth tiene Sus pect. liaridades y es mas compleja que la programacion de aplicaciones basadke en Intemet. Por otro lado, la tecnologia bluetooth proporciona una forma bastante gerbes Pata lransferi datos entre dispositivos méviles, ya que evita la sobrecarga de erganizacion de Internet. Por tanto, es importante saber cémo programar ant aciones basadas en bluetooth tanto para Android y Java SE 2) Video[Tutorial ‘rincipal tetooth, : 2.1. Emparejar dispositivos asitivos, {Antes de que los datos puedan ser transmitidos entre dos dispo: stec- ‘bluetooth, los dispositivos deben estar «emparejados» (0 «vinculados»). El proceso yo mas de sincronizacion y/o «emparejamiento» se puede controlar a través de la interfaz de oria) Usuario o mediante la API de Android Java. En la interfaz de usuario de un smartp- ‘hone Android 0 Tablet PC, puede utiizar la secuencia de comandos Configura- pase ‘cién/Conexiones inalambricas y redes/Bluetooth (que le proporcionara explicaciones e suficientes); en un portal puede, por ejemplo, presionar la tecla «Bluetooth» en el a Jeciado y hacer clic en el icono de bluetooth que debe aparecer a continuacion, fared, IE| emparejamiento de dos dispositivos requiere de los siguientes pasos: pila det + Los adaptadores bluetooth de ambos dispositivos deben estar encendi- Peleg dos. Por otra parte, en uno de los dispositivos bluetooth debe estar acti- ce) vada la «detectabilidad». Esto hard que este dispositivo (en adelante «dispositivo B») sea visible en su entomo. Por lo tanto, el otro dispositive is dis- («dispositive A») puede encontrario y enviarle una solicitud de vincula- 10 Cién, tal como se describe en los pasos siguientes, sposit- pue- Nota: Normaimente, debe dejar apagado el bluetooth a menos que realmente fo necesie Esto le ahorraré un poco de energia y le protegerd contra ta transmision de datos no deseados. La funcién de detectabilidad bluetooth debe estar habilitada durante el proce- ‘0 de emparejamiento y deberia ser desactivada inmediatamente después. + El dispositivo A debe explorar su entorno para ver si hay otros disposi- tivos bluetooth, Por esto, encontrara todos los dispositivos detectables, especialmente el dispositive B (y probablemente algunos otros cuyos propietarios no se preocupan por su privacidad). * El dispositive A ahora debe enviar una solicitud de vinculacién con el dispositive B. La solicitud entrante se muestra al usuario del dispositive B rcion de 1s pecu y él puede decidir aceptar o rechazar la misma. Ademas, se solicita al adas ef Usuario que escriba una «clave de enlace» libremente elegida; sino, se pastante mostrara al usuario una clave de enlace generada por el sistema. Lo >recarge mismo sucede para el usuario del dispositivo A. Si ambos usuarios han nar aplk aceptado la solicitud y han escrito la misma clave (0 han verificado que las dos claves que se muestran son idénticas), los dispositivos han que- dado vinculados. 162 * El gran libro de Android avz 1. Switch on BT adapter 1. Switch on BT adapte, 2. Enable BT discoverabilty = 3. Scan for BT devices ~ Detect Device B en 4. Send pairing request 10 Device B 5 Display incoming request trom Device A J 6. Accopt paring «6 Accopt paring (Cm (with bak hays (with tink key) ~ Store kak key locaty 10 use i in the following connection establishment ‘vez. Desputs, los dispositivos pueden conectarse repetidamente uno con oto ¢ inlercambiar datos, utlizando la misma clave que ha sido almaceniada localmente ey ‘ambos dispositivos. 4.2.2 Transmisién de datos La transmisién de datos en bivetooth est basada en un modelo cliente-servder ‘con sockets (e! mismo modelo que se utliza para programar la transmision da datos a través de Internet). Un socket es una interfaz a una red de datos. Est significa que un programa puede leer datos entrantes de un socket y escribir bg datos de salida en el mismo sin necesidad de saber el funcionamiento interno de la red. Los datos se transmiten siempre a través de un par de sockets. Los dato escritos en el socket del cliente se pueden leer desde e! socket de! servidor, yl viceversa. Por lo tanto, los dos sockets se pueden considerar como los extrema4 de un canal de datos entre el cliente y el servidor. ‘Computer Node [ Computer Node Process ata Network Process LS [ifisecen = Socket Data = — B a La transmision de datos a través de un par de sockets bluetooth en Android requiere los siguientes pasos: * La aplicacion de servidor debe crear un «socket servidor» con un UUIO ~{identiicador Ginico universal) y esperar una solictud de conexién de un lente. (El formato de UUID y como generario se discutird mas adelante ‘en los ejemplos de programacién.) ‘+ Una aplicacion cliente debe crear un «socket de cliente» y enviar una so- liciud de conexién al socket del servidor,identifcandole por su UUID. ‘+ Elservidor debe aceplar la solitud. Después de esta aceptacién, el cien- te y el servdor estan conectados. Ahora comparten un canal RECOMM (RFCOMM = Radio Frequency Communication) para la siguiente trans- Imisin de datos. Es importante saber que el servidor crea un nuevo so- ‘chet para esta conexidn, Por lo tanto, el socket del servidor original permanece libre para nuevas peticiones de conexin entrantes. + Elciente y el servidor deben obtener los fujos de entrada y salida de sus Tespectivos sockets. Todos los datos que el cliente escriba en su flujo de salida apareceran en el flujo de entrada del servidor y viceversa. Por lo te tanto, el par de sockets se puede utilizar para la transferencia de datos *® biditeccional; es decir, la transferencia de datos se puede realizar en ambas direcciones. 1. Create a server socket with a UUID 2, Wait for a connection request 3. Create a (cient) socket 4, Send a connection request 3 Socket or 4 | Sorver 5. Accept he request | “‘communteation | Client E New socket for | withthe server communication f _mittitis cient _]~E Transmit data between the sockes 5 {in both directions) Lai ~ _ En las siguientes secciones vamos a entrar en los detalles de este procedi- iento, Antes de eso, es importante ver que las lamadas a los métodos de comu- { Micacion bluetooth se pueden bioquear, especialmente aquellas que esperan en clas solicitudes de cliente entrantes y que se conectan a un socket de servidor. Estas llamadas (y por lo tanto el procedimiento de establecimiento de conexion) fedeben ser ejecutadas por hilos de fondo dedicados a fin de evitar la congelacién de la interfaz grafica de usuario, © La plataforma Android incluye soporte para la pila de red bluetooth, que permi- “te a un dispositvo para el intercambio de datos de forma inalambrica con otros, Aispositives bluetooth. EI marco de aplicacién proporciona acceso a la funcionali- dad bivetooth a través de las-API de bluetooth de Android. Esta API permite que las aplicaciones se conectan de forma inalémbrica con otros dispositives bluetooth mediante una conexién punto a punto o punto a multipunto Usando la API de bluetooth, una aplicacién para Android puede realizar lo si- guiente: + Analizar en busca de otros dispositivos bluetooth. en Andro to y desde otros dispositivos. milples conexiones. 43. Las clases fundamentales en bluetooth A través de la API de bluetooth de Android se pueden realizar muchas tareas, per las cuatro tareas principales necesarias para comunicarse a través de bluetooth son: la configuracién de bluetooth, la busqueda de dispositivos que 0 bien estén vinculados 0 bien estan disponibles en el drea local, la conexién de dispositvosy, por tltimo, la transferencia de datos entre dispositivos. You Video[Tutorial]: Biuetooth programming in Android. Toda la API de bluetooth esta disponible en el paquete android. bluetooth, Las clases mas importantes para crear y gestionar conexiones bluetooth son: + La clase Bluctoothadapter se utiiza para representar y acceder al hhardware de los adaptadores locales bluetooth. Su método esto getDefauitAdapter() devuelve una referencia del adaptador local blvetoth del dispositive que ejecuta la aplicacién. En este adaptador hay méiodos ©omo enable() y disable() (actvar 0 desactivar el adaptada§ startDiscovery() (detectar dispositivos bluetooth visibles en el entorno)y getBondedDevices() (recibir una lista de los cispositives emparejados con este dispositvo). El método 1 stentisingRécomniti thServiceRecord (Stritg name, UID uuid) cteara un socket de servidor (véase la clase BluctoothServersocket més adelante) con un nombre y UU determinados. El nombre y el UUID seran registrados en el SDP (Servis Discovery Protoco). EI SDP proporciona a los clientes la_informacia rnecesaria para descubrir un servicio. La clase Biustoothbevice sive para representar los dispositivos remolos bluetooth y define los métodos que devuelven informacion en un dispost vo. Ademas, se incluye un método creatertconmsocket toserviceles cord (UUID uuid) que crea un socket de cliente listo para ser conectadl al socket de servidor con el UUID uuia (véase la clase Biuetoothsockst mas adelante). La clase piuctoothserversocket define las propiedades de los sockets de servidor que pueden aceptar peticiones de conexién (el socket «1.» en el diagrama anterior de la transmision de datos). Su método accept () bloqueara el hilo lamante hasta que dicha solictud entre en juego. El mé- todo le devolverd un objeto siuetoothsocket (véase a continuacién), que se puede utilizar para comunicarse con el cliente. Ademas, existe el méto- do close) que se llama cuando no se quieran aceptar mas solicitudes. + La clase Biuetoothsocket define una interfaz de comunicacién con otro dispositivo en forma de socket. Un objeto Biuetoothsocket es ulilizado por Un cliente para conectarse a un socket servidor (el socket «3.» en el dia- ‘grama). Este objeto es creado por el método createkfconnsocketToser- viceRecord() (véase mas arriba) y se conecta al servidor llamando a su método connect (). Esta llamada se bloqueard hasta que el servidor acepte {a llamada, Un objeto de la clase Bluetoothsocket también serd devuelio. por accept () llamado desde el lado del servidor (véase mas arriba y tam- bién el socket «5.» en el diagrama). Después de volver de connect () y ac- cept (), respectivamente, estos dos sockets bluetooth estardn conectados. Las llamadas a sus métodos gettnputstrean() y getoutputstrean() de- wuelven los flujos de informacion que se pueden utilizar para la transmision de datos (al igual que con los métodos read) y wrive() conocidos desde java. io). 2~ Enlaces de interés: Descripcion de la API de bluetooth: htips/developer.android.com/guide/topics/connectivity/bluetooth. html Documentacion del paquete android. bluetooth: htp://developer.android.com/reference/androidibluetooth/package-summary him! 4.4 Permisos en bluetooth Para poder acceder a la API bluetooth es necesario deciarar al menos uno de los siguientes permisos dentro del manifest de nuestra aplicacion. Estos permisos son necesarios para realizar cualquier comunicacién bluetooth, tales como solicitar una ‘onexién, aceptar una conexion y transferencia de datos, Los permisos disponibles son dos: + BLUETOOTH, que permite tnicamente realizar conexiones bluetooth y transferir datos. * BLUETOOTH ADMIN, que permite, ademas de realizar conexiones bluetooth y transferencias de datos, manipular las opciones de! sis- tema en lo referente a bluetooth, buscar otros dispositivos y realizar vinculos. ser conect letoothsocl ble, entonces se deben desactivar las funciones ot etooth es compatible, pero esté desactivado, entonces por ac ‘que el usuario permita activar el bluetooth sin salir de nuestra apli- acon, Esla configuracion se lleva a cabo en dos. pasos, ussrdena "-Blueteothadapter, La clase BluetoothAdapter es necesaria para cualquier actividad bluetooth Para obtener el sluetoothadapter, llamamos al mélodo getDefaultadapter) Esto devuelve un Bluetoothadapter que representa el propio adaplador bluo. tooth del dispositivo, Si getDefauitadapter () devuelve un valor nulo, entonces e| Gispositivo no soporta bluetooth y terminamos aqui. Ejemplo: 7 Adaptador local Bluetooth mbluetoothadapter = GluctoothAdapter.getvefaul tadopter(); // Si el adaptador es null, no soporta Bluetooth if (mBluetoothadapter == null) { Toast.makeText(this, "Bluetooth is not available", Toast. LENGTH_LONG).show(); finish(); return; Después es necesario asegurarse de que la funcion bluetooth esta activada Para ell, llamamos al mélodo icenabiea() para comprobar si el bluetooth esta habiltado. Si este método devuelve fais, significa que bluetooth esta desactivado. Para solicitar la activacién de bluetooth, tenemos que llamar al método startac- tivityForResult() con la accién ACTION REQUEST_ENABLE en el Intent Este emitiré una solicitud para activar bluetooth a través dé los ajustes del sistema (in detener su aplicacién). Ejemplo: 71 5i el adaptador to esta activo, pide habilitario, Af (InBluetoothAdapter.istnabled()) { Intent enabletntent = new In- tent (Bluetoothadapter. ACTION REQUEST_ENABLE); startactivityForftesult(enableIntent, REQUEST ENABLE BT); ‘Esto provocaré que aparezca un didlogo que solicita permiso al usuario para bilar luetooth, como se muestra en la siguiente figura 1. Si el usuario respon- ‘«Si», el sistema comenzara a activar bluetooth y el foco volvera a su aplicacién vez que finalice el proceso. La constante REQUEST_ENABLE_BT pasa a el método startactivityFo- gesute() un ndmero enlero defnido calmente (que debe ser mayor que 0), ue ‘sistema pasa de nuevo a nosotros en el método onactivityResult () de la en request Aras tn cen ene TT ene Si se habilita el bluetooth con éxito, la actividad recibe el cédigo RESULT_OK como resultado del método onAct iviryResuit() de devolucién de la llamada. Si a| bluetooth no estaba habilitado debido a un error (0 el usuario respondio «No»), jonces el cédigo de resultado sera RESULT_CANCELED. En el siguiente fragmento podemos ver el callback de la actividad AC- TION_REQUEST_ENABLE, que es llamada por Android cuando finaiza la activi Hdad ala que se llamé a través de startactivityforResult () Seanegeee eee eee public void onActivityresult(int requestcode, int resultCode, Intent data) { $#(D) Log-d(TAG, “onActivityResult “ + resultcode); suiteh (requestCode) { ase REQUEST_CONNECT.DEVICE_SECURE: 71 cuando DevicelistActivity devuelve un dispositivo para conectar Se (resultCode == Activity RESULT_OK) { connectDevice(data, true); > break; ‘case REQUEST_CONNECT_DEVICE_INSECURE: 77 cuando DevicelistActivity devuelve un dispositivo para conectar 4f (resultCode == Activity. RESULT_OK) { connectOevice(data, false); } break; case REQUEST_ENABLE_BT' | 7/ Devuelve habilitar el dispositivo bluetooth GF (resultCode == Activity.RESULT_OK) ( // Adaptador habilitado, Manamos método setupchat()s El gran libro de Android avanzadg y ase { 1 No podenos habilitar el adaptador Log.d(TAG, "BT not enabled”); Toast.makeText(this, R.string.bt not_enabled Leaving, Toast LENGTH SHORT) .show(); inish(); En caso de que este callback reciba como requestCode la constante RE. QUEST_ENABLE BT, comprobard que el valor devuelto por la actividad (resut- Code) corresponde con RESULT_OK para continuar la ejecucién. Si por e contrario el valor devuelto es RESULT_CANCELED, la actividad finalizara, Ejercicio paso a paso: Activador/Desactivador bluetooth. En este ejercicio vamos a crear una aplicacién que permitira habilitar y desha far la interfaz bluetooth de nuestro dispositive. Ademas también permitiré poner fen modo visible dicha interfaz, de este modo si algtin dispositive quiere conectarse ‘a nosotros nos vera cuando realice un escaneo de Ia red. 1. Crea un proyecto con eclipse con las siguientes definiciones. ‘Application nane: Gluetoothet Project name: Bluetootho1 Package name: com.bluetoothoL Activity name: Bluetoothot Layout nane: activity bluetoothor Resto de pardnetros por deFecto Modifica et fichero layout activity bluetoothO1.xm! de quo posea ol siguiente aspect. [derhttpi/ schemas android, con/apk/res/androtd irold. com/tools" android :paddingRight="@dinen/ activity hordzontal_margin” ‘androtd:paddingTop="@dinen/activity. vertical margin” ‘tools contexts" .Bluetoothor” > fautton ‘android:ide"@+id/button3” android:layout_width="wrap_content™ ‘android: 1ayout_height="wrap_content” Gndroid:layout_aligniert="@rid/button2” android: layout below="@rid/button2" ‘android: 1ayoutnargintop="28dp" ‘android: text="TURN_OFF" /> oe ‘Afiade [os pormisos necesarios en el AndroidManifest.xml para poder manojar {a Interfaz bluetooth. [aises-permission android sees permission android:nanes"androtd. per 4. Ahora vamos a modificar el codigo de la actividad Bluetooth01 java. {9 primero sera crear dos variables estaticas privada para activar la inter bluetooth y ponerlo en modo visible. Lo siguiente es afiadir en el método oncreate() Ia inicializacién de log ‘elementos gréficos de nuestra aplicacin y comprobar el estado de la interta bluetooth, Final TextView out = (TextView) findViewsyId(R.id.out); final Button button1 = (Button) findViewSyId(R.id.buttoni); final Button button2 = (Button) findView8yId(R.id.button2); Final Button button3 = (Button) FindViewSyId(R.id.button3); final BluetoothAdapter mBluetoothAdapter = Bluetoothadapter -getDefaultadapter(); if (mBluetoothAdapter == null) { ‘out. .append(“Dispositivo BT no soportado!!!"); Dentro del mismo método afiadiremos Ia funcién de cada bot6n. El primer activara la interfaz bluetooth. buttont -setOnClicktistener(new View.OnClicklistener() { public void onClick(View v) { if (ImBluetoothAdapter.istnabled()) { Intent enableBtIntent = new Intent( BluctoothAdapter.ACTION_REQUEST_ENABLE) ; startActivityForResult(enableBtintent, REQUEST_ENABLE_ BT); ? } DH 7. El segundo pondra la interfaz en modo visible. button2. setOnClickListener(new View.OnClickListener() { @verride public void onClick(View arge) { if (ImBluetoothAdapter.isDiscovering()) { 77 out.append("MAKING YOUR DEVICE DISCOVERABLE”); Context context = getApplicationContext(); CharSequence text = "MAKING YOUR DEVICE DISCOVERABLE”; Ant duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); 5 Intent enablestintent = new Intent¢ BluetoothAdapter. ACTION REQUEST DISCOVERABLE) ; startactivityForResult(enablestIntent, REQUEST_DISCOVERABLE_BT) ; El ltime apagara la interfaz bluetooth del dispositivo movil Tputton3 setonclickListener(new View.OnClickListener() { @verride public void onClick(View arg®) { ‘mBluetoothadapter.disable(); 11 out.append("TURN_OFF BLUETOOTH"); Context context = getApplicationContext(); CCharSequence text = “TURNING OFF BLUETOOTH"; Ant duration = Toast .LENGTH_LONG; Toast toast = Toast.nakeText (context, text, 15); ‘toast .show(); ? Ds .6 Busqueda de dispositivos bluetooth Jsando el Bluetoothadapter, podemos encontrar los dispositivos bluetooth re- ja'sea a través de la deteccion de dispositivos 0 mediante la consulta de la ppositivos vinculados con anterioridad. La deteccién de dispositives es un procedimiento de exploracion que busca en 1 area local aquellos dispositivos que tengan habiltados el bluetooth y se solicita informacion acerca de cada uno de ellos (esto se refiere a veces como «esca- 1008). Sin embargo, un dispositivo bluetooth dentro del area local responder a a solicitud de descubrimiento solo si esta habilitado para ser detectable. Si un ispositivo se puede detectar, respondera a la peticion de descubrimiento median- {e el intercambio de informacion, como el nombre del dispositivo, la clase y su Idreccién MAC. Usando esta informacién, se puede elegir un dispositive para ini ‘iar una conexién. Una vez que se realiza una conexién con un dispositive remoto por primera vez, una solictud de vinculacion se presenta automaticamente al usuario. Cuando fe émpareja un dispositivo, la informacion basica sobre el dispositivo (por ejemplo, tel nombre del dispositivo, la clase, y la direccion MAC) se guarda y posteriormente ‘se puede leer utiizando la API de Bluetooth. Uliizando una direccion MAC conoci- {da por un dispositive remoto permite iniciar una conexién en cualquier momento y sin realizar el descubrimiento (suponiendo que el dispositivo esta dentro del radio {Eide cobertura). Recuerde que hay una diferencia entre estar emparejado y estar conectado. Cuando dos dispositives estan emparejados significa que son conscientes de la existencia el uno del otro, ambos poseen una clave de enlace compartido que puede ser utiizado para la autenticacién, y son capaces de establecer una cone- 3i6n cifrada entre si. Por otro lado, cuando ambos dispositivos estan conectados significa que los dispositivos actualmente comparten un canal RFCOMM y son * capaces de transmitic datos entre si. La API actual de Bluetooth de Android requie re que dos dispositivos estén emparejados antes de establecer una conexion RFCOMM. 172 El gran libro de Android avanzado A.continuacién describiremos como encontrar los dispositivos que se han vin. culado, 0 como descubrir nuevos dispositivos utilizando la deteccién de disposit. vos. ‘Nota: Los dispositivos Android no son detectables por defecto. Un usuario puede hacer que et dispositivo sea reconocible por un tiempo limitado a través de la con- Siguracién del sistema, o que ta misma aplicacién pueda solicitar al usuario que permita la detectabilidad sin salir de la aplicacién. 4.6.1 Consultar dispositivos vinculados Antes de realizar la deteccion de dispositivos, vale la pena consultar el conjunto de ispositivos emparejados para ver si el dispositive deseado ya se conoce. Para ello, debemos llamar al método getBondedDevices(). Este método devolverd un conjunto de BiuetoothDevices que representan los dispositivos vinculados. Por ejemplo, puede consultar todos los dispositivos vinculados y luego mostrar el nombre de cada dispositivo al usuario, mediante un arrayadapter: 71 Get the local Bluetooth adapter mBtAdapter = BluetoothAdapter.getDefaul tadapter(); // Get a set of currently paired devices Set pairedDevices = mBtAdapt~ er. getBondedDevices(); 11 Tf there are paired devices, add each one to the ArrayAdapter if (paireddevices.size() > 0) { *FindViewBy- Td(R.id.title paired devices) .setVisibility(View.VISTBLE); for (BluetoothDevice device : pairedDevices) { PaireddevicesArrayAdapter.add(device.getNane() + “\n" + device.getAddress()); } else ( String noDevices = getResources().getText (R.string.none_pained).tosString() mPaireddevicesarrayadapter.add(noDevices); d Todo lo que se necesita desde el objeto a1uetoothbevice con el fin de iniciar luna conexién es la direccion MAC. En este ejemplo, se guarda como una parte del ArrayAdapter que se muestra al usuario. La direccin MAC mas tarde se puede extraer con el fin de iniciar la conexién. 46.2 Descubriendo dispositivos Para iniciar el descubrimiento de dispositivos, simplemente debemos de llamar al método startDiscovery(). El proceso es asincrénico y el método devolvera in mediatamente un booleano que indica si el descubrimiento se ha iniciado correc tamente. El proceso de descubrimiento por lo general implica una consulta de ‘de unos 12 segundos, seguido de un andlisis de pagina de cada ds- ‘encontrado para recuperar su nombre de bluetooth. Wvestra aplicacion debe registrar un BroadcastReceiver para Ia intencion {FOUND con el fin de recibir informacion sobre cada dispositive descu- Para cada dispositivo, el sistema emitiré el intent ACTION_FOUND. Esta les EXTRA DEVICE y EXTRA_CLASS, que respectivamente. Un ejem- lleva los campos adicional ign cuando se descubren iat Listens for discovered devices 77 The BroadcastReceiver th fiver Receiver = new BroadcastReceiver() ( private final BroadcastRece: override: public void onReceive(Context context, Intent intent) { ‘String action = intent.getaction(); 11 When discovery Finds a device 4€ (BluetoothDevice.ACTION FOUND.equals(action)) ( 7/ Get. the BluetoothDevice object from the Intent Bluetoothdevice device = in- _getParcelableExtra(BluetoothDevice. EXTM DEVICE) + ‘aNeubevicesArrayAdapter -add(device.getname() + *\’ Vice. getAddress()) y 1/ Register for broadcasts when a device is discovered IntentFilter filter = new IntentFil- Ker(BluetoothDevice.ACTION_ FOUND) ; this.registerReceiver(nReceiver, filter); nt + de ria anteriormente, todo lo que se necesita desde el objeto iciar una conexion es la direccion MAC. En este ler que se muestra al usua- jar la conexin. ‘AV igual que oour jetoothDevice con el fin de ini ijemplo, se quarda como una parte de un arrayadapt: fio. La direccién MAC més tarde se puede extraer con el fin de inici Precaucion: la realizacion de la deteccién de dispositivos es un procedimiento pesado para el adaptador bluetooth y consume una gran cantidad de recursos Una vez que ha encontrado un dispositivo para conectarse, asegirese de que siempre se cancela el descubrimiento con el método cancelDiscovery() antes de intentar una conexién. Ademds, si ya tenemos una conexion con un dispositivo, llevara cabo un descubrimiento puede reducir significativamente el ancho de ban- da disponible para la conexién, por lo que no debemos realizar el descubrimiento mientras estemos conectados. . el fin de inic 4.6.3 Habilitar Descubrimiento Si queremos que el dispositivo local sea reconocible por otros dispositivos, lame Renaivitercriansctmeesure etney con el © Inlent = AC. TION. REQUEST DISCOVERABLE. Este emit una solicitud para habitar el 0 devolvers iniciado corr na consulta 174 El gran libro de Android avanzado modo visible a través de los ajustes del sistema (sin detener su aplicacién). De forma predeterminada, el dispositivo seré detectable durante 120 segundos. Se puede definir una duracion diferente, afiadiendo el intent extra EX. TRA_DISCOVERABLE_DURATION. La duracién maxima que se puede establecer es de 3600 segundos, y el valor de 0 significa que el dispositivo esta siempre visible. Cualquier valor por debajo de 0 0 por encima de 3600 se ajusta automaticamente a 120 segundos. Por ejemplo, este fragmento de cédigo establece la duracién de 300: private void ensureDiscoverable() { if(0) Log.d(TAG, “ensure discoverabl if (mBluetoothAdapter .getScanMode() |=" Bluetoothadapter.SCAN_MODE_CONNECTABLE DISCOVERABLE) { Intent discoverableIntent = new In- tent (BluetoothAdapter . ACTION REQUEST DISCOVERABLE) ; discoverable- Intent.putExtra(BluetoothAdapter. EXTRA_DISCOVERABLE DURATION, 300); startactivity (discoverableIntent) ; } se A introducir este cédigo aparecera un cuadro de didlogo pidiendo permiso al usuario para hacer que el dispositivo sea visible, como se muestra en la siguiente figura. Si el usuario responde «Si», entonces el dispositivo se volvera reconocible durante el periodo de tiempo especificado. Su actividad recibira entonces una llamada a onActivityResult (), con el codigo de resultado igual a la duracién que el dispositivo puede ser detectado. Si el usuario responde «No» o si se ha producido un error, serd el cddigo de resultado RESULT_CANCELED. Elec oe Eien crs nc) Carne UeI a Eee as Pee RR ied eerie re ttn 1 to do this? | | 4 siti El dispositivo se mantendra en modo de deteccién durante el tiempo asignado, Si queremos recibir una notificacion cuando el modo de deteccién cambie, se pue- de registrar mediante un sroadcastReceiver para el intent AC- TION_SCAN MODE CHANGED. Este contendré los campos adicionales EXTRA_SCAN MODE y EXTRA PREVIOUS_SCAN MODE, que le indican el modo de exploracién nueva y antigua, respectivamente. Los valores posibles para cada uno.—_son: SCAN_MODE_CONNECTABLE_DISCOVERABLE, SCAN_MODE_CONNECTABLE 0 SCAN_MODE_NONE, que indican que el dis- tivo esta en modo visible, en modo de no deteccién, pero todavia es capaz de ecibir.conexiones 0 en modo de no deteccién y no puede recibir conexiones, res- tivamente, No es necesario permitr la detectabilidad de un dispositivo si va a iniciar la co- jexi6n a un dispositive remoto. La habiitacién de descubrimiento solo es necesa- Mio cuando se desea que la aplicacion cree un socket servidor que acepte fonexiones entrantes, debido a que los dispositivos remotos deben ser capaces "de detectar el dispositivo antes de que pueda iniciar la conexi6n. : Visualizador de dispositivos ‘emparejados y vinculados A continuacién os mostraremos una pequefia aplicacion donde podremos vv sualizar los dispositivos emparejados, ademas de crear un método para la verifica- ' cion del estado de la interfaz bluetooth. 4, Crea un proyecto con eclipse con las siguientes definiciones. Application nane: Sluetoothe2 Project name: luetoothe2 Package nane: con.bluetoothe2 Activity nane: Bluetoothe2 Layout mane: activity bluetoothe2 Resto de pardeetros par defecto 2. Modifica el fichero layout activity bluetooth02.xml de que posea el siguiente aspecto, “ devices = btAdapter.getSondedDevices(); for (BluctoothDevice device : devices) { textviewl.append("\n Device: " + device.getNane() +“, 4 device); } p else { // Pronpt user to turn on Bluetooth Intent enablestintent = new Intent( Bluetoothadapt- ‘er ACTION_REQUEST_ENABLE) ; startactivityForResult(enableBtIntent, REQUEST_ENABLE 7); Dead mmunicacién con Bluetooth Por Ultimo creamos los métodos onrctivityResult () Pare completar la anejar actividad. a cal Fee is called when an activity completes. */ Ca erric e Laat, int resultCode, In- a. Lo sbar el 7 # Gee iniciar la conexién (usando la direccién Mi frotected void onActivityResult(int requestCode, tent data) { MMper.onactivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_ENABLE_BT) { CheckBluetoothstate(); ? * Goverride protected void onDestroy() { super.onDestroy(); } 4.7 Conexion de dispositivos i ‘con el fin de crear una aplicacién para realizar una conexion entre dos disposi enn se debe Implementar tanto los mecanismos del lado del servidor como los de} {p1ade del cliente, ya que un dispositive debe abrir un socket de servidor y el otro IAC del dispositivo de servidor para © iniciar una conexién). El servidor y el ‘cliente se consideran conectados entre si Is quando cada uno de ellos tiene un AluetoothSocket. conectado en el mismo canal vRFCOMM. En este punto, cada dispositivo puede obtener los flujos de entrada y nealida y [a transferencia de datos pueda comenzar. En este punto se describe ere iniciar la conexion entre dos dispositivos. > £1 dispositivo servidor y el dispositivo cliente obtienen el Bluetoothsocket fe- El servidor lo recibira cuando se acepla una cone- re te lo recibira cuando se abre un canal "{;querido de diferente manera. ~ yin entrante. Mientras que el client ,. RFCOMM con el servidor. Una técnica de implementacion es preparar automaticamente cada dispositivo como un servidor, de modo que cada uno tiene un socket de servidor abierta y ~ escuchar las posibles conexiones. Asi, cualquier dispositivo puede iniciar una co- nexion con el otro y convertirse en el cliente. Alternativamente, un dispositive pue- de ser explicitamente el host de la conexién y abrir un socket de servidor bajo __ demanda y el otro dispositivo simplemente iniciar la conexion. Nota: Si los dos dispositivos no se han sincronizado anteriormente, entonces ‘Android mostrar automaticamente una notificdcion de solicitud de asociacion o un ~cuadro de didlogo, como el que se muestra en la siguiente figura. Cuando se trata de conectar los dispositivos, la aplicacién no tiene que preacuparse por si los dis- positives estan vinculados. Su intento de conexion RFCOMM se bloqueara hasta {que el usuario se haya conectado correctamente, 0 se haya producido un error si el usuario rechaza la vinculacién, o si el emparejamiento falla 0 por tiempo de es- pera. 178 El gran libro de Android avanzado ri) EC Ur Suter iad arian Cites odes 4.7.1 Conexion como servidor Para la implementacién de un servidor ha de mantenerse abierto un socket de tipo BluetoothServersocket que sera el encargado de escuchar todas las solicitudes de conexién entrantes. Cuando se produce una solicitud y esta es aceptada, BluetoothServersocket proporciona un socket BluetoothSocket representando a la nueva conexién. Si es posible recibir mas conexiones, el BluetoothServerSocket debera seguir es- cuchando, pero en caso de que el dispositivo solo vaya a manejar una conexién (que por otro lado suele ser lo mas habitual), es muy recomendable cerrar el BluetoothServerSocket y liberar sus recursos. Concretando un poco, los pasos a seguir para implementar un servidor son los siguientes: 1. Obtener un Bluetoothserversocket a través de una llamada a listenUsingRfcommWithServiceRecord(). Este método crearé un nuevo SDP (Service Discovery Protocol) que quedard registrado en nuestro sistema y que definir de forma univoca al servicio ofrecido por nuestra aplicacién, de modo que cualquier cliente que lo necesite pueda pedir informacion sobre ese servicio concreto al servidor siempre y cuando conozca su nombre y obviando el resto de servicios disponibles. Una vez que el servidor muera, el SDP generado sera_—eliminado-—del_—ssistema. —El_~—smétodo ListenUsingREcommWlithServiceRecord() necesita dos parametros: un nombre y un UUID. El primero sirve para identificar al servicio de modo que, como se ha comentado hace un momento, el cliente pueda obtener informacién acerca de él. El segundo es usado por el cliente para intentar conectar. Si en la peticién de conexién el cliente no envia el UUID correspondiente al servicio, la conexion sera rechazada. 2. Comenzar a escuchar conexiones entrantes llamando al método accept (). El funcionamiento de esta llamada es practicamente el mismo que en el caso de un socket TCP/IP. El sistema quedara bloqueado hasta que se acepte una conexién o se lance una excepcion (es aconsejable que accept () esté dentro de un bloque trylcatch). Si la conexion tiene éxito, accept () devolveré un objeto Bluetoothsocket representando la conexién. 3. Sino se espera recibir ninguna conexion mas, puede liamarse a close (). El método close () provocaré que el EluetoothServerSocket se ciefre, pero sin afectar en absoluto al socket que nos devolvio. Gomunicacion con Bluetooth 179 Como se comenté anteriormente, la llamada a accept () es bloqueante, moti- o por el cual no es muy aconsejable que se realice en la misma actividad que igestiona la ventana visible en ese momento. Lo mas correcto es implementar algun tipo de servicio que gestione toda la in- structura bluetooth y hacer que corra en otro hilo distinto. De esa forma, ade- "mas, dicho servicio podria ser utilizado por cualquier otra aplicacin del sistema ique lo conozea y lo necesite. Aqui hay un hilo simplificado para el componente de servidor que acepta co- jnexiones entrantes: private class AcceptThread extends Thread { S|iprivate final BluetoothServerSocket mmServerSocket; public AcceptThread() { e // 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.. ListenUsingRfcommli thServiceRecord(NAME, } catch (IOException e) { } mmServerSocket = tmp; Hf public void run() { BluetoothSocket socket = null; // Keep listening until exception occurs ora socket is returned while (true) { try { socket = mnServerSocket.accept(); } catch (IOException e) { break; De // Tf @ 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 sacket, and cause the thread to finish */ public void cancel() { try { mnServerSocket.close(); } catch (IOException e) { } 180 El gran libro de Android avanzado ' En este ejemplo, solo se quiere una conexion entrante, tan pronto como una conexién es aceptada y se adquiere el pluetoothsocket, la aplicacion envia e| Bluetoothsocket adquirido a un hilo separado, se cierra el BluetoothServerso. cket y se rompe el bucle. Tenemos que tener en cuenta que cuando el método accept () devuelve e| BluetoothSocket, e! socket ya esta conectado, por lo que no debemos llamar a connect () (como se hace desde el lado del cliente), EI método manageConnectedSocket () es un método ficticio en la aplicacién que iniciard el hilo correspondiente a la transferencia de datos, aspecto que vere. mos en el punto 8.3 de este capitulo. Generalmente, debemos cerrar el BluetoothServersocket tan pronto como se haya terminado de escuchar las conexiones entrantes. En este ejemplo, el mé- todo close) es llamado tan pronto como el Bluetoothsocket se adquiere. Tam- bién es posible que desee proporcionar un método publico en el hilo que se puede cerrar el Bluetoothsocket privado en el caso que tengamos que dejar de escu- char en el socket del servidor. 4.7.2 Conexién como cliente Para iniciar una conexién con un dispositivo remoto (un dispositivo que sostiene un socket de servidor abierto), primero debemos obtener un objeto BluetoothDevice que represente el dispositivo remoto. A continuacién, debemos utilizar el Blue- toothDevice para adquirir un Bluetoothsocket e iniciar la conexion. El procedimiento basico serd el siguiente: Utilizando el B1uetoothDevice, conseguimos un BluetoothSocket llamando a createRfcommSocket ToServicekecord (UUID) . Esto inicializa un Bluetoothso- cket que se conectaré al BiuetoothDevice. El UUID pasado en este método de- be coincidir con el UUID utilizado por el dispositive servidor cuando abrid su BluetoothServersocket (con _listenUsingRfcommWithServiceRecord(String, UUID)). Iniciaremos la conexién llamando al método connect (). Tras esta llamada, el sistema llevard a cabo una bisqueda del SDP en el dispositivo remoto con el fin de que coincida con el UUID. Si la busqueda tiene éxito y el dispositivo remoto acepta la conexidn, se comparte el canal RFCOMM que sera utilizado durante la conexion y que connect (} devolvera. Este método es una llamada de bloqueo. Si, por cualquier raz6n, la conexién falla o se vence el tiempo de espera de! método connect () (después de unos 12 segundos), entonces esto conllevaré una excepci6n. Debido a que el método oonnect () es una llamada de bloqueo, esle procedimiento de conexion debe realizarse siempre en un hilo separado del hilo principal de la actividad Nota: Siempre debemos asegurarnos de que el dispositivo no esté realizando la detec- cién de dispositivos cuando se llama al método connect (). Si la deteccién se encuentra | en progreso, entonces el intento de conexidn se desacelera de manera significativa y & més probable que falle. Gomunicacion con Bluetooth Hat Pfivate class ConnectThread extends Thread { private final BluetoothSocket mmSocket; eprivate final BluetoothDevice mnDevice; public ConnectThread(BluetoothDevice device) { // Use a temporary object that is later assigned to mnSocket, // because mnSocket is final BluetoothSocket tmp = null; mmDevice = device; // Get a BluetoothSocket to connect with the given BluetoothDevice try { // W¥_UUID is the app’s UID 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 mnSocket..connect(); } catch (IOException connectException) { // Unable to connect; close the socket and get out try { mmSocket..close(); } catch (IOException closetxception) { } return; } // 00 work to manage the connection (in a separate thread) manageConnectedSocket (muSocket) ; /** Will cancel an in-progress connection, and close the socket */ public void cancel() { try { mmSocket .close(); } catch (10Exception e) { } Debemos observar que el método cancelDiscovery() es llamado antes de realizar la conexion. Siempre debemos hacer esto antes de conectar y asi nos aseguramos sin tener que comprobar si se esta ejecutando o no (pero si se quiere comprobar, debemos utilizar isDi scover ing ()) 182 El gran libro de Android avanzada Al igual que hemos comentado anteriormente, manageConnectedsocket () gg un método ficticic en la aplicacién que iniciara el hilo correspondiente a la transfe. rencia de datos, aspecto que veremos en el punto 8.3. Cuando terminamos con nuestro Bluetoothsocket, tenemos que llamar siempre a close () para limpiar. Si lo hacemos, se cerrard de inmediato a la cone. xi6n y limpiaremos todos los recursos intemos. 4.7.3 Gestion de ia conexién Cuando haya conectado con éxito dos (0 mas) los dispositivos, cada uno tendrd una conexién BluetoothSocket. Aqui es donde comienza la diversién, ya que Puede compartir datos entre dispositivos. Usando el Bluetoothsocket, el proce. dimiento general para la transferencia de datos arbitraria es simple: Obtener el inputstream y OutputStream que se encargan de las transmisio- nes a través de la toma de corriente, a través de los métodos getInputstream() y getoutputstream(), respectivamente. Leer y escribir datos en los arrays con read(byte [)) ywrite(byte (1). Existen algunos detalles que tenemos que considerar en la implementacién, En primer lugar, debemos utilizar un hilo dedicado para toda la lectura y la escritu- fa corriente. Esto es importante porque tanto read(byte {]) y write (byte (]) son métodos bloqueantes. El método read(byte [}) ‘se bloqueara hasta que haya algo que leer en la secuencia. El método write (byte {}) no se suele blo- quear, pero puede bloquear el control de flujo si el dispositivo remoto no esta lla- mando a read(byte []) con la suficiente rapidez y los buffers intermedios estan llenos. Por lo tanto, el bucle principal en el hilo debe ser dedicado a la lectura des- de el Inputstream. Un método piiblico separada en el hilo puede ser usado para iniciar la escritura en los ourputstream. Un ejemplo de cémo podria quedar seria el siguiente: private class ConnectedThread extends Thread { private final BluetoothSocket mSocket; private final InputStream mnInstrean; private final OutputStream mnOutStrean; public Connectedthread(BluetoothSocket socket, String socketType) { Log.d(TAG, “create ConnectedThread: " + socketType); mnSocket = socke! InputStream tmpIn OutputStream tmpout = null; null; // Get the BluetoothSocket input and output streams try { tmpIn = socket. getInputstream(); tmpOut = socket.getOutputstream(); } catch (IOException e) { Log.e(TAG, “temp sockets not created”, e); } | I i l | ! I I : i Frunicacion con Bluetooth 183 mainstream = tmpIn; mmOutStream = tmpOut; Bplic void run() { Log.i(TAG, "BEGIN mConnectedThread” byte[] buffer = new byte[1024]; int bytes; // Keep listening to the InputStream while connected while (true) { try { // Read fron the InputStream bytes = mnInstream.read(buffer); 7/ Send the obtained bytes to the UI Activity mHandler. obtainMessage(BluetoothChat .MESSAGE_READ, bytes, -1, buffer) -sendToTarget(); } catch (IOException e) { Log.e(TAG, “disconnected”, e); connectionLost(); // Start the service over to restart listening mode BluetoothChatService.this.start(); break; } ; } pe * Write to the connected Outstream. * @paran buffer The bytes to write oY public void write(byte[] buffer) ( try { mnOutStrean.write (buffer); /] Share the sent message back to the UI Activity Handler .obtainMessage(BluetoothChat.MESSAGE_WRITE, -1, “1, buFfer) -sendToTarget(); } catch (IOException e) { Log.e(TAG, “Exception during writ } + public void cancel() { try { mnSocket.close(); } catch (IOException e) ( Log-e(TAG, “close() of connect socket failed", e); a } | gran libro de Android avanzado 184 El constructor adquiere los flujos necesarios y, una vez ejecutado, el hilo va a esperar que los datos vienen a través del nputstream. Cuando read (byte {]) devuelva los bytes de la secuencia, los datos se envian a la actividad principal utilizando un controlador de miembro de la clase padre. Luego se vuelve y espera a mas bytes del stream. El envio de datos de salida es tan simple como llamar al método write () del thread desde la actividad principal pasandole los bytes a enviar. Este método sim- plemente llama a write (byte ()) para enviar los datos al dispositive remoto. EI método cance! () del thread es importante para que la conexién se puede interrumpir en cualquier momento por el cierre del Bluetoothsocket. A continuacién desde nuestro hilo principal, debemos utilizar el manejador pa- ra recuperar la informacion que ha estado tratando el hilo anterior: 7/ Message types sent from the BluetoothChatService Handler public static final int MESSAGE_STATE_CHANGE = 1; public static final int MESSAGE_READ = 2; public static final int MESSAGE_WRITE = 3; public static final int MESSAGE_DEVICE_NAME public static final int MESSAGE_TOAST = 5; 7] The Handler that gets information back from the BluetoothchatService private final Handler mHandler = new Handler() { @override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_STATE_CHANGE: f(D) Log.i(TAG, "MESSAGE_STATE_CHANGE: switch (msg.arg1) { case MESSAGE_WRITE: —* byte[] writeBuf = (byte[]) msg.obj; // construct a string from the buffer String writeMessage = new String(writeBuf); | mConversationArrayAdapter.add("Me: " + writeMessage); break; case MESSAGE_READ byte[] readBuf = (byte[]) msg.obj; // construct a string from the valid bytes in the buffer String readMessage = new String(readBuf, @, msg-argl); mConversationArrayAdapter.add(mConnectedDeviceName+": "4 + readMessage); + msg.argi); break; case MESSAGE_DEVICE_NAME: . J/ save the connected device’s name = mConnectedDeviceName = msg.getData().getString(DEVICE_NAME); | Toast .makeText(getApplicationContext(), “Connected to " + mConnectedDeviceName, Toast.LENGTH SHORT). show(); break; case MESSAGE_TOAST: Toast .makeText (getApplicationContext(), : msg.getData().getString(TOAST), | OOOO wunicacién con Bluetooth 185 a Toast. LENGTH_SHORT). show() break; } Estos procesos siempre deberan realizai bluetooth en nuestras aplicaciones. se cuando decidamos utilizar la cone- Ejercicio paso a paso: Transferencia de datos entre cliente/servidor. “atraves de este ejemplo vamos a ver un uso completo de la arquitectura clien- igervidor bluetooth utiizada en Android. Para ello lo primero sera crear un pro- {0 con eclipse con las siguientes definiciones. Application name: BTCompleto Project name: BTCompleto Package name: com.btcompleto activity name: BTcompleto Layout name: activity btcompleto Resto de pardmetros por defecto. 4731 Activando y desactivando el bluetooth en Android si vamos a hacer uso del bluetooth sera requisito indispensable primer lugar, | fichero AndroidManifest.xm: jiadir los permisos adecuados para ello en el Gaases-permission android:name="BLUETOOTH"/> tuses-permission android:name= "BLUETOOTH ADMIN" /> Pese a que la tecnologia bluetooth est ampliamente extendida, es de obligado Eamplmiento la comprobacién de que el servicio esta disponible en el dispositivo. fara realizar esta operacion haremos uso de la clase an- oid. bluetooth Bluetoothadapter. Declararemos una referencia como alributo fentro de nuestra Activity y a continuacién codificaremos un método, al que llama- mos configurarAdaptadorBluetooth(), que se encargara de detectar si el dis- itivo puede hacer uso del bluetooth y si este se encuentra activo 0 no. Modificaremos nuestro layout donde incluiremos un bot6n que nos servira para ealizar la activacion y la desactivacion. @xml version="1.0" encoding="utf-8"?> inearLayout _xmlns:android="http://schemas.android. con/apk/res/android” xmlns:tools="ht tp: //schemas. android. con/tools android: - android: android: android: paddingBottom- android: paddingLeft="adimen/activity horizontal_margin” ee 186 : El gran libro de Android avanzadg ‘android: paddingRight="@dimen/activity_horizontal_margin” android: paddingTop="@dimen/activity_vertical_margin” tools:context=".MainActivity” >

You might also like