UT 3 PROGRAMACIÓN DE APLICACIONES PARA DISPOSITIVOS MÓVILES (II).pdf

download UT 3 PROGRAMACIÓN DE APLICACIONES PARA DISPOSITIVOS MÓVILES (II).pdf

of 29

Transcript of UT 3 PROGRAMACIÓN DE APLICACIONES PARA DISPOSITIVOS MÓVILES (II).pdf

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    1/29

    !

    UT3PROGRAMACIN DE APLICACIONES PARA

    DISPOSITIVOS MVILES (II).

    1.Paquetes opcionales para Java ME.

    Aqu tienes algunos de los paquetes opcionales para Java MEms conocidos: Wireless Messaging API (WMA). JSR-120, JSR-205. API de mensajera inalmbrica.

    Para el envo de mensajes SMSy MMS. Bluetooth API. JSR-82. API para la comunicacin por Bluetooth. Personal Information Management and File Connection API. JSR-75. Acceso a la

    lista de contactos del dispositivo y al sistema de archivos. Mobile Media API (MMAPI). JSR-135. Soporte de audio y vdeo. Reproduccin y

    captura. Location API. JSR-179. Localizacin geogrfica del dispositivo, mediante GPS u otros

    mecanismos. Mobile 3D Graphics. JSR-184. Soporte de grficos 3D. J2ME Web Services API (WSA). JSR-172. Soporte de servicios web en dispositivos

    mviles. Security and Trust Services API. JSR-177. Tratamiento de informacin privada,

    ejecucin segura, identificacin, autentificacin, etc.

    1.2.- Sun Java Wireless Toolkit.

    La plataforma Sun Java Wireless Toolkitcontieneuna gran cantidad de herramientas yutilidades que, en la plataforma que incluye Netbeans inicialmente(Java PlatformMicro Edition SDK), no siempre estn disponibles. Entre esas herramientas seencuentra la consola de mensajera inalmbrica (para trabajar con el envo yrecepcin de mensajes cortos y multimedia en el emulador), control del Bluetooth,gestin de contenidos y del sistema de archivos, etc.

    2.- Aplicaciones multihilo.

    En ms de una ocasin necesitars que tu aplicacin realice varias tareas al mismotiempo. Esto puede conseguirse mediante el uso de distintos hilos (o threads o hebras) deejecucin en el programa.Una aplicacin multihilocontendr al menos doshilos(flujos de ejecucin diferentes)que podrn ejecutarse de manera ms o menos independientey simultnea. La plataformaJava MEproporciona la posibilidad de construir y ejecutar aplicaciones multihiloal igualque tambin lo haca Java SE, aunque con algunas limitaciones.

    2.1.- El modelo de hilos en Java ME.

    Las mquinas virtuales que proporciona la plataforma Java ME permiten la ejecucin deaplicaciones multihiloutilizando los mismos mecanismos que la plataforma Java SE(claseThread, interfaz Runnable, objetos synchronized, mtodoswaity notify, etc.).

    Tanto la clase Threadcomo la interfaz Runnableestn disponibles en el paquete java.lang.No es necesario por tanto ningn paquete opcional para poder trabajar con el modelo de hilosde Java ME.

    2.2.- Creacin de midlets multihilo.

    Una aplicacin multihilo (o multihebra o multithread) es una aplicacin que contienevarios segmentos de cdigo (al menos dos) que pueden ser ejecutados concurrentemente.

    Toda aplicacin multihilo tiene un hilo principal que es lanzado por la mquina

    virtual en el momento en que la aplicacin empieza a ejecutarse. Desde ese hiloprincipal se irn creando el resto de hilos del programa y ser el ltimo que termine

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    2/29

    #

    su ejecucin. Cuando finalice el hilo principal, finalizar el programa.

    En Java existen dos formas de crear nuevoshilos de ejecucin:1 Mediante la implementacin de la interfaz Runnable.2 Mediante la extensin (herencia) de la clase Thread.

    Si decides implementar la interfaz Runnablepara dotar a tu aplicacin de varios hilosde ejecucinpuedes seguir los siguientes pasos: Declarar una claseque implemente la interfazRunnable. Sobrescribir el mtodorun de la interfazRunnable, que contendr el cdigo que se desea

    ejecutar en el hilo de ejecucinindependiente. Crear un objetode esa clase. Crear un objetode la clase Thread (hilo) utilizando el objeto recin creado como parmetro

    para el constructor del Thread. Llamar al mtodo start del hilo (thread) recin creado. A partir de ese momento se

    ejecutar el mtodo run en un hilo de ejecucindiferente al hilo principaldesde elcual se ha creado.

    Si haces la otra opcin (crear una clase que herede de Thread) podras hacerlo as: Declarar una clase que herede de la clase Thread.

    Sobrescribir el mtodo run, que contendr el cdigo que se desea ejecutar en el hilo. Crear un objeto de esa clase (ser el nuevo hilo). Llamar al mtodo start del hilorecin creado.

    3.- Mecanismos de persistencia (I). Sistemas de gestin de registros.

    La plataforma Java ME proporciona, al menos, dos mecanismos de almacenamiento yrecuperacin de informacinpara el perfil MIDP: Mediante el sistema RMS (Record Management System), donde el almacenamiento

    tiene lugar en la memoria internadel dispositivo. Mediante el sistema de gestin de archivos en memoria externa (paquete opcional

    JSR-75, tambin conocido como "PDA Optional Packages for the Java ME Platform").

    El sistema RMS o sistema de gestin de registros est basado en almacenes deinformacin implementados sobre bases de datos estructuradas en registros . Estosalmacenes de registros permiten a las aplicaciones almacenar informacin en una zona de lamemoria del dispositivo.Si lo que se desea es acceder al sistema de archivosde una memoria externainserta en eldispositivo (tarjetas SD, MMC, etc.), ser necesario recurrir al paquete opcional JSR-75.

    3.1.- El sistema de gestin de registros (RMS).

    Un almacn de registros o Record Stores consiste en un conjunto de registros quepermanece en la memoria no voltil del dispositivo, sin ser borrada (persistente),aun cuando el midlet que la ha creado haya finalizado su ejecucin. La mquinavirtual del dispositivo es la responsable de mantener la integridad de los Record

    Store creados por un midlet, para que puedan volver a ser utilizados en el futurocuando ese midlet vuelva a ejecutarse.Los almacenes son creados en ubicaciones dependientes de la plataforma a lascuales no tienen acceso directo los midlets.

    El sistema de gestin de registros (RMS) proporciona un mecanismo dealmacenamiento de datos persistentea travs de unabase de datos de registros. Lasherramientas necesarias para poder trabajar con este sistema de almacenamiento (clases,interfacesy excepciones) se encuentran en el paquetejavax.microedition.rmsy son lassiguientes:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    3/29

    $

    Clases Interfaces ExcepcionesRecordStore RecordComparator InvalidRecordIDException

    RecordEnumeration RecordStoreException

    RecordFilter RecordStoreFullException

    RecordListener RecordStoreNotFoundException

    RecordStoreNotOpenException

    Un almacn de registros o RecordStore est representado por un objeto de la claseRecordStore, cuyas principales caractersticas son: Cada almacn (RecordStore) contiene un conjunto de registros(record). Los nombresde los almacenesdeben ser nicospara una suite de midlets. Los nombres de los RecordStore son "case sensitive" (sensibles a maysculas y

    minsculas). Si una suite de midlets(o conjunto de midlets) es eliminada del dispositivo en el que

    est instalada, se eliminarn tambin todos los almacenes vinculados a ella. Un midlet puede acceder a un RecordStore creado por otro midlet de su misma

    suite (siempre que tenga permiso para ello).

    Los RecordStore mantienen adems un nmero de versin que va siendoincrementado cada vez que se produce alguna operacin que modifica loscontenidos del almacn. Del mismo modo, si un midlet utiliza varios hilos paraacceder a un almacn de registros, la responsabilidad de coordinar ese accesopara garantizar la coherencia de la informacin almacenada en el RecordStoreser del propio midlet.

    3.2.- Estructura de un almacn de registros.

    Un RecordStoreest formado por un conjunto de registros. Cada registroest formadopor dos elementos: Un identificador de registro(RecordID), que es un nmero enteroque determina de

    forma unvoca(clave primaria) al registro.

    Los datosalmacenados en el registro, que son un array de bytes.Cuando un registro se borra, su identificador no se vuelve a utilizar, de maneraque los registros de un almacn pueden no tener identificadores consecutivosdado que pueden ir siendo borrados.Todo almacn de registrostiene los siguientes atributos: Nombre, que debe ser nico para una suite. Puede obtenerse a travs del mtodo

    getNamede la clase RecordStore. Nmero de versin. Nmero entero que se va actualizando segn se realizan

    operaciones (insercin, borrado, actualizacin) sobre los registros delalmacn. Este nmero de versin le sirve a los midlets para saber si otroproceso o hilo ha modificado un determinado RecordStore. Puede obtenerse atravs del mtodo getVersion.

    Marca temporal (timestamp). Nmero entero largo (long) que representa el

    instante en el que se ha realizado la ltima operacin sobre el almacn .Puede obtenerse a travs del mtodo getLastModified. Se utiliza el formato Unixdetimestamp(nmero de milisegundos transcurridos desde el 1 de enero de 1970).

    3.3.- Gestin de un almacn de registros.

    Las operaciones generales(abrir, cerrar, eliminar, etc.) ms importantes que se puedenrealizar con un almacn de registros(RecordStore) son:

    Crear un RecordStore. Puedes usar el mtodo esttico openRecordStore. No sedispone de constructores.

    Eliminar un RecordStore. Para ello dispones del mtodo (tambin esttico)deleteRecordStore.

    Abrir la comunicacin con un RecordStore: mtodo openRecordStore. Estemtodo abre un Record Store con el nombre que se le haya pasado comoparmetro (String) o bien lo crea si no existe.Existen varias versiones de este mtodo

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    4/29

    %

    (mtodo sobrecargado). Cerrar la comunicacin con un RecordStore. Mtodo closeRecordStore.

    Para la manipulacin de los registros de un RecordStore dispones, entre otras, de lassiguientes operaciones: Aadirun nuevo registro (mtodo addRecord).

    Obtener el contenido de un registro(mtodo getRecord). Eliminarun registro (mtodo deleteRecord). Modificarun registro (mtodo setRecord) Obtener el nmero de registros(mtodo getNumRecords).

    3.4.- Operaciones avanzadas en un almacn de registros.

    Interfaz RecordEnumeration, para facilitar la navegacina travs de los registros. Interfaz RecordFilter, que puede ayudarte a realizarbsquedasms eficientes mediante

    el uso de un patrn de bsqueda. Interfaz RecordComparator, que proporciona los mtodos necesarios para la

    ordenacinde registros. Interfaz RecordListener, cuyos mtodos te permitirn capturar los eventos que se

    produzcan cuando se realice una determinada accin.

    3.5.- Un oyente para la monitorizacin de almacenes de registros. Lainterfaz RecordListener.

    La interfaz RecordListenerpermite capturar eventos que se producen a la hora derealizar cambios un RecordStore.Cuando ocurre algn evento, un mtodo es llamado paranotificar que se ha producido un cambio. Existen tres posibles eventos: registroaadido, registro modificado y registro borrado. En funcin del eventoque se hayaproducido se realizar una llamadaa uno de los siguientes mtodos de la interfaz: recordAdded (RecordStore almacen, int id). recordChanged (RecordStore almacen, int id).

    recordDeleted (RecordStore almacen, int id).Si quieres gestionar estos eventos, tendrs que implementar esta interfaz en alguna de las clasesde tu aplicacin y, por tanto, tendrs que escribir el cdigo que quieres que se ejecute cuando sereciba la notificacin de alguno de esos tres eventos.

    3.6.- Un ejemplo completo.

    Para finalizar con el sistema de gestin de registros, te proponemos que analices unejemplo completo. Se trata de una biblioteca de clases con la funcionalidad bsica paragestionar el acceso y manipulacin de registros almacenados en los dispositivosmviles(visualizacin, creacin, bsqueda, modificacin y borrado de registros).

    En esta biblioteca se ha intentado simplificar la reutilizacin del mecanismo de gestin deregistros, con independencia de la naturaleza de los mismos, a travs de una clase DBMgrquecontiene un RecordStore.

    Tienes una descripcin completa de la biblioteca y cmo usarla, as como el cdigo fuente de lasclases y recursos necesarios para compilar yprobar la aplicaciny la documentacin de todaslas clases en formato javadocen el anexo I. INCLUIDO EN LA PARTE DE RECURSOS

    4.- Conectividad.

    Una de las mayores ventajas de los dispositivos mvileses la posibilidad de estar siempre (ocasi siempre) vinculados a algn tipo de conexin, con la plataforma Java SE, se utilizan lasclases (InputStream, OutputStream, InputStreamReader, BinaryArrayInputStream ,

    DataInputStream, Reader,Writer, etc.) se encuentran en el paquetejava.io.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    5/29

    &

    Generic Connection Framework o GCF se trata de un conjunto de herramientas(clases e interfaces) diseado para facilitar el acceso a sistemas dealmacenamiento y conexin, sin necesidad de especificar ningn requisitosoftware o hardware. Estas clases e interfaces (la mayora son interfaces) seencontraban en el paquetejavax.microedition.io.

    El marco CLDC Generic Connection Framework define una serie de interfaces para darsoporte a la gran variedad de tipos de conexiones que nos podemos encontrar en dispositivosmviles, pero no implementa ninguna de ellas, (simplemente sirve de soporte).

    4.1.- La estructura genrica de conexiones (GCF).

    El marco GCF consiste en una jerarqua de interfaces y clases que permiten crearconexiones y realizar operaciones de E/S. Proporciona un mecanismo genrico deconectividadponiendo a disposicin de las aplicaciones una API comn para todos los tiposde conexiones bsicas.Todas las conexiones se crean utilizando el mtodo esttico open de la claseConnector. Si no se produce ningn error, este mtodo devuelve un objeto queimplementa una de las interfaces definidas en el marco GCF e implementadas por

    MIDP.La raz de la jerarquaes la interfaz Connection, que representa la conexin ms genrica yabstracta que se puede tener. Todas esas interfaces estn disponibles en el paquetejavax.microedition.io.Adems de la jerarqua de conexiones tambin dispones de: La clase Connector, que es la factora de conexiones(mtodo open). La excepcin ConnectionNotFoundException. La interfaz Datagram, que se utiliza para las conexiones basadas en paquetes.La clase Connector permite abrir cualquier tipo de conexin mediante el mtodo estticoopen. Por ejemplo:conexion= Connector.open ("http://www.mec.es");

    4.2.- Jerarqua de conexiones GCF.En la siguiente figura puedes observar un esquema de lajerarqua interfacesde la GCF:

    Aqu tienes la descripcin de algunas de ellas: La interfaz Connectiones el tipo bsico de conexin. Esta conexin slo puede abrirse y

    cerrarse. La interfaz InputConnectionrepresenta un dispositivo desde el que se pueden leer datos.

    Proporciona el mtodo openInputStream que devuelve un stream de entradapara laconexin.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    6/29

    '

    La interfaz OuputConnection representa un dispositivo en el que se pueden escribirdatos. Proporciona el mtodo openOutputStream que devuelve un stream de salidapara la conexin.

    La interfaz StreamConnectioncombina las conexiones de entrada y de salida anteriores(conexin bidireccional).

    La interfaz ContentConnection es una subinterfaz de StreamConnection. Proporciona

    acceso a informacin especfica del contenido (longitud de los datos, tipo de contenido,codificacin, etc.). La interfaz StreamConnectionNotifiedpermite a una aplicacin esperar conexiones

    de flujo entrantes de manera asncrona. Devuelve un StreamConnection a travsdel cual puede establecerse un enlace de comunicacin bidireccional.

    La interfaz DatagramConnection es utilizada para operaciones de E/S basadas enpaquetes (datagramas).

    La interfaz HttpConnectionrepresenta una conexin HTTP(web). La interfaz HttpsConnectionrepresenta una conexin HTTP segura. La interfaz CommConnection, se usa para conexiones por elpuerto serie.

    4.3.- Conexiones soportadas.

    El marco de conexiones genrico GCF soporta una gran cantidad diferente de conexiones. Lostipos de conexiones pueden identificarse a travs de la URL (localizador de recursosuniforme) que se utilice.

    Principales esquemas de URL para la GCFEsquema Tipo de conectividad Tipo de conexin GCF (interfaz)blt2cap Bluetooth. L2CAPConnectiondatagram Datagramas. DatagramConnection

    file Acceso al sistema de archivos.FileConnectionInputConnection

    httpProtocolo HTTP.

    HttpConnection

    https Protocolo HTTP seguro. HttpsConnectionsmsmmscbs

    SMS (mesajes de texto).MMS (mensajes multimedia).CBS (difusin de celda).

    MessageConnection

    apdujcrmi

    Comunicacin con tarjetas inteligentes(smart cards).

    APDUConnectionJavaCardRMIConnection

    socketserversocket

    Sockets.SocketConnectionServerSocketConnection

    datagram Datagramas UDP. UDPDatagramConnection

    5.- Mecanismos de persistencia (II). Acceso al sistema de archivos.

    Para acceder al sistema de archivosde una memoria externa introducida en el dispositivo nopuede usarse el sistema de gestin de registros RMS, sino que habra que recurrir alpaquete (JSR-75 Personal Information Management and File Connection API otambin conocido como "PDA Optional Packages for the J2ME Platform"). Esa biblioteca seencuentra en el paquete javax.microedition.io.file, el cual contiene las siguientesherramientas:

    Clases Interfaces ExcepcionesFileSystemRegistry FileConnection ConnectionClosedException

    FileStystcodeListener IllegalMode Exception

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    7/29

    (

    5.1.- API de acceso al sistema de archivos.

    Para acceder al sistema de archivosse utilizarn principalmente los mtodos proporcionadospor la interfaz FileConnection, que proporcionan la funcionalidad habitual para eltrabajo con archivos. Entre esas funcionalidades puedes encontrar mtodos para: Crearun archivo (mtodo create).

    Eliminarun archivo (mtodo delete). Obtener informacin sobre un archivo (mtodos getName, getPath, fileSize,canRead, canWrite, isHidden, isDirectory, lastModify, etc.).

    Crear un directorio(mtodo mkdir). Abrir flujos para realizar operaciones de E/S (mtodos openDataInputStream,

    openDataOutputStream, openInputStream, openOutputStream). Obtener listas de archivos de un directorio(mtodo list). Renombrar un archivo(mtodo rename).

    5.2.- Lectura de un archivo.

    Para leer el contenido de un archivopuedes seguir los siguientes pasos:

    Abrir una conexin con el archivo(mtodo esttico open de la clase Connector). Leer el contenido del archivo seleccionadode una manera similar a como se hara en

    una aplicacin de escritorio con Java SE. Por ejemplo:! Crear un flujo de salida ByteArrayOutputStream donde ir volcando lo que se vaya

    obteniendo del archivo.! Abrir un flujo de entrada InputStream a partir de la conexin abierta con el archivo.! Ir leyendo bytes del InputStream y depositndolos en el ByteArrayOutputStream

    hasta que se recorra el archivo completamente. Cerrar la conexin con el archivo(mtodo closede Connector).

    Recuerda que este tipo de tareas en las que se realizan operaciones de E/Sdeberas realizarlas dentro de un hilo de ejecucin diferente al hilo principal de laaplicacin. De ese modo, si por alguna razn la operacin tarda ms tiempo del

    esperado (o se produce algn tipo de bloqueo), la aplicacin no quedarabloqueada.

    5.3.- Escritura en un archivo.

    Para escribir en un archivopuedes seguir estos pasos: Preparar la informacin que deseas almacenar en el archivo (un String, el

    contenido de un array, etc.). Abrir una conexin con el archivo(mtodo esttico open de la clase Connector). Comprobar si existe el fichero para crearlo o bien truncarlo. Almacenar el contenido que se tenga preparado en el archivo seleccionadode

    manera similar como se hara en una aplicacin de escritorio con Java SE. Por ejemplo:! Abrir un flujo de salida OutputStream a partir de la conexin abierta con el archivo.!

    Volcar la informacin que se tenga preparada en el OutputStream (por ejemplomediante el mtodo write y sin olvidarnos de purgar elbuffercon un flush).

    Cerrar la conexin con el archivo(mtodo close de Connector).

    5.4.- Otras operaciones con archivos.

    Adems de las tpicas operaciones de lectura, escrituray obtencin de informacinsobrelos archivos, el paquetejavax.microedition.io.filetambin te va a permitir: Enumerar las races de los sistemas de archivosdisponibles en el dispositivo. Puedes

    hacerlo mediante el mtodo listRootsde la clase FileSystemRegistry. Registrar y borrar oyentes que sern invocados cuando las races de los sistemas

    de archivos cambien (por ejemplo al extraer una tarjeta de memoria). Para ello puedes

    utilizar los mtodos: addFileSystemListener y removeFileSystemListener, tambin de la claseFileSystemRegistry e implementar la interfaz FileSystemListener (con su mtodorootChanged).ejemplo

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    8/29

    )

    6.- Gestin de comunicaciones inalmbricas.

    Entre las diversas posibilidades de comunicacin inalmbrica que pueden ofrecer losdispositivos mviles se encuentran:

    Sistemas de comunicacin de vozpropios de la telefona mvil(GPS, UMTS, etc.). Sistemas de mensajerade telefona mvil (SMS, MMS). ConectividadWi-Ficon redes inalmbricasbasadas en el estndar 802.11. Emisin y recepcin en FM. Bluetooth. Infrarrojos.

    Como ejemplo de gestin de comunicaciones inalmbricasvamos a utilizar el protocoloBluetoothque posibilita la transmisin entre diferentes dispositivos, mediante un enlace por

    radiofrecuencia a poca distancia.

    6.1.- Gestin de las comunicaciones Bluetooth con Java ME.

    En Java ME, la API encargada de gestionar las comunicaciones Bluetooth es la JSR-82("Java APIs for Bluetooth"). Consta de dos paquetes: javax.bluetooth, que incluye las herramientas (clases e interfaces) necesarias para el

    descubrimiento de dispositivos, conexiny comunicacin. javax.obex, que contiene las herramientas para el manejo del protocolo OBEX, parecido al

    protocolo HTTP, utilizado para el intercambio de archivos.

    El protocolo OBEXse emplea para elintercambio de mensajes entre un cliente y unservidor. Estos mensajes estarn compuestos por una serie de cabeceras ms uncontenido o cuerpo del mensaje. El cliente enva rdenes al servidor junto conalgunas cabeceras y, en algunos casos, un contenido. Las cabecerasse encapsulan enun objeto de tipo HeaderSet y el contenido o cuerpo del mensaje se lee o escribe

    mediante objetos del tipo InputStreamy OutputStream.

    El funcionamiento de una comunicacin Bluetooth est basado en el modelocliente/servidor. El clientedeber realizar las siguientes actividades: Bsqueda de dispositivos. Bsqueda de servicios. Establecimiento de la conexin. Comunicacinpropiamente dicha.Mientras que en el caso del servidor, se encargar de: Crear una conexin servidora. Especificar los atributos del servicio. Abrir las conexiones con los clientes.

    6.2.- Identificacin de los dispositivos.

    Para obtener informacin relacionada con un dispositivo Bluetooth la API proporciona lassiguientes herramientas: La clase LocalDevice, que representa el dispositivo local. Ser el punto de partidade

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    9/29

    *

    cualquier comunicacin Bluetooth. La clase DeviceClass, para describir el tipo de dispositivoque tienes. La clase UUID, que representa los identificadores nicos universales para

    protocolosy servicios. Son nmeros enteros de 128 bits.

    Para obtener una referencia al objeto de la clase LocalDevice, que representa a

    nuestro dispositivo, puedes hacer uso del mtodo esttico getLocalDevice:LocalDevice dispositivoLocal= LocalDevice.getLocalDevice ();

    Con la clase DeviceClasspuedes obtener una descripcin del dispositivo: si es unordenador, un telfono mvil, una PDA, etc. Para ello puedes utilizar sus mtodosgetMajorDeviceClass, getMinorDeviceClass o getServiceClasses. Puedes obtener unareferencia al objeto DeviceClassmediante el mtodo getDeviceClassdel objeto de la claseLocalDeviceanterior.DeviceClass tipoDispositivo= LocalDevice.getLocalDevice().getDeviceClass ();String infoDispositivo= 0x + Integer.toHexString (deviceClass.getMajorDeviceClass()) + ...

    En el siguiente fragmento de cdigo tienes un ejemplo cmo usar las clases LocalDevice yDeviceClass:

    6.3.- Bsqueda de dispositivos.Un cliente debe intentar descubrir cules son los dispositivos Bluetooth que seencuentran dentro de su mbito de cobertura. Para llevar a cabo esta tarea, la APIproporciona las siguientes herramientas: Las clases LocalDevice, DeviceClass y UUID, que ya has visto. La clase DiscoveryAgent, para realizar las bsquedas de dispositivos. La interfaz DiscoveryListener, para poder recibir eventos de descubrimiento de

    dispositivos y servicios. La clase RemoteDevice, para representar los dispositivos Bluetooth.

    Labsqueda (o "descubrimiento") de dispositivos la realizars mediante un objeto de laclase DiscoveryAgent que puedes obtener a travs del mtodo getDiscoveryAgent del

    dispositivo local:DiscoveryAgent agente= dispositivoLocal.getDiscoveryAgent ();

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    10/29

    !+

    A continuacin utilizaremos el mtodo retrieveDevices del objeto DiscoveryAgent pararecuperar los dispositivos establecidos como conocidos o los descubiertos enbsquedas anteriores. Los dispositivos Bluetooth encontrados estarn representados porobjetos de la clase RemoteDevice establecidos como conocidos o los descubiertos enbsquedas anteriores. Para comenzar la bsqueda de nuevos dispositivos tendrs que utilizar elmtodo startInquiry. Para descubrir los nuevos dispositivos de la interfaz DiscoveryListener.

    6.4.- Descubrimiento de nuevos dispositivos. La interfazDiscoveryListener.

    Para descubrir los nuevos dispositivos en el rea de cobertura puedesimplementar los mtodos deviceDiscovered e inquiryCompleted de la interfaz

    DiscoveryListener. En el siguiente fragmento de cdigo tienes un ejemplo de cmoimplementar ambos mtodos:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    11/29

    !!

    6.5.- Bsqueda de servicios (I).

    Una vez que se haya obtenido informacin sobre los dispositivos Bluetoothdisponibles en lazona de cobertura del cliente ser necesario tambin realizar el descubrimiento obsqueda de los servicios proporcionados por esos dispositivos. Para ello, podrs usar lassiguientes herramientas:

    Clase DiscoveryAgent e interfaz DiscoveryListener, que ya has visto en apartadosanteriores.

    Interfaz ServiceRecord, que describe las caractersticas de un servicio Bluetooth. Clase DataElement, que encapsula los posibles tipos de datos mediante los cuales se

    pueden describir los servicios Bluetooth.

    Utilizars los mtodos servicesDiscovered y serviceSearchCompleted de la interfazDiscoveryListener para descubrir los servicios disponibles en los dispositivosencontrados, mientras que con los objetos de la clase ServiceRecord dispondrs de unadescripcin de cada servicio. Esta descripcin se realiza mediante atributos que seidentifican numricamente. Cada servicio tendr una lista de pares (identificador,valor) yesta lista ser almacenada por un objeto de tipo ServiceRecord. Cada uno de los serviciosdisponibles en un dispositivo se registra en una estructura conocida como SDDB (Service

    Directory DataBase).

    Cada uno de los identificadores de los atributos de un servicio Bluetooth es unnmero entero, mientras que los valores sern objetos de la clase DataElement. Estos objetosencapsulan los posibles tipos de datos mediante los que se pueden describir los servicios. Entrelos tipos disponibles puedes encontrar: valor nulo, nmeros enteros de diferente tamao,arrays de bytes, URL, UUID, valores lgicos (boolean), String o enumeraciones dealguno de estos tipos. La clase DataElement proporciona una constante para cada uno deestos tipos (NULL, INT_1, INT_2, BOOL, STRING, etc.).

    Para acceder a cada atributo de un ServiceRecord puedes utilizar el mtodogetAttributeValue, que devolver un objeto de tipo DataElement. Tambin puedesrecuperar todos los identificadores de atributo de un servicio en un array por medio del mtodo

    getAttributeIDs:nt[] identificadores= serviceRecord.getAttributeIDs ();for (int i=0; i< identificadores.length(); i++) {DataElement elemento= serviceRecord.getAttributeValue (identificadores[i]);System.out.println (ID: + Integer.toHextString(identificadores[i]);

    }

    Para saber el tipo de dato almacenado en un objeto DataElement puedes usar el mtodogetDataType:int tipoElemento= elemento.getDataType ();switch (tipoElemento) {

    case DataElement.NULL:...

    case DataElement.STRING:...

    6.5.1.- Bsqueda de servicios (II).

    Finalmente, para llevar a cabo el descubrimiento de servicios Bluetooth disponibles en elentorno, tendras que implementar los mtodos deviceDiscovered, servicesDiscovered yserviceSerarhCompleted de la interfaz DiscoveryListener.En el siguiente fragmento de cdigo tienes un ejemplo de cmo implementar estos mtodossuponiendo que se est buscando un servicio con UUID 0x0008 (OBEX) y contenido en unatributo con identificador 0x7777:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    12/29

    !#

    6.6.- Establecimiento de la conexin en el cliente.

    Una vez realizada la bsqueda de dispositivos y de servicios, ha llegado el momento deestablecer una conexin entre clientey servidor. La API de BluetoothJSR-82proporcionados mecanismos diferentes para realizar esa conexin: SPP, que trabajarn con un InputStream y un OutputStream. L2CAP, que trabajarn con arrays de bytes encapsulados en objetos de la clase

    L2CAPConnnection.

    Para abrir una conexin se utilizar la clase Connector de la GCF. A travs del mtodoesttico open le pasars como parmetro un Stringque contendr la URL necesaria para

    establecer la conexin. Esa URL tendr un esquema diferente en funcin de que se realice unaconexin de tipo SPPo L2CAP: Si se trata de una URLpara una conexin de tipo SPPtendr la siguiente estructura:

    ! btspp://hostname:[ PSM | UUID ];parametros. Si se trata de una URLpara una conexin de tipo L2CAP la estructura ser de la siguiente

    forma:! btl2cap://hostname:[ PSM | UUID ];parametros.

    Un cliente Bluetoothpuede obtener la URLnecesaria para realizar una conexin mediante elmtodo getConnectionURL de la clase ServiceRecord. Habr que pasar dos parmetrosque indican:1 Si se desea autenticaro cifrar(o ambos) la conexin. Los posibles valores seran:

    a) ServiceRecord.NOAUTHENTICATE_NOENCRYPT.b) ServiceRecord.AUTHENTICATE_NOENCRYPT.c)

    ServiceRecord.AUTHENTICATE_ENCRYPT.2Valor lgico (boolean) que indica si el dispositivo local debe actuar como maestro(true) o

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    13/29

    !$

    bien si es indiferenteser maestroo esclavo(false).Para abrir una conexin de tipo cliente utilizando el protocolo SPP podras hacer losiguiente:

    // Obtenemos la URLString url= registro.getConnectionURL (ServiceRecord.NOAUTHENTICATE_NOENCRYPT,

    false);// Abrimos la conexin (uso de la GCF)StreamConnection conexion= (StreamConnection) Connector.open ();// Abrimos los flujos de entrada y salida para la comunicacinOutputStream salida= conexion.openOutputStream ();InputStream entrada= conexion.openInputStream ();

    Para hacer lo mismo utilizando el protocolo L2CAP tendrs que crear una conexin con unaURLestilo L2CAP:// Obtenemos la URLString url= registro.getConnectionURL (ServiceRecord.NOAUTHENTICATE_NOENCRYPT,false);// Abrimos la conexin (uso de la GCF)

    L2CAPConnnection conexion= (L2CAPConnnection) Connector.open ();

    6.7.- Establecimiento de la conexin en el servidor.

    Para que un dispositivo Bluetooth pueda actuar como servidorhay que establecer su estadocomo "descubrible" o susceptible de ser descubierto(activo). Para ello puedes utilizar elmtodo setDiscoverabledel objeto que representa al dispositivo local:

    LocalDevice dispositivoLocal= LocalDevice.getLocalDevice ();boolean ok= dispositivoLocal.setDiscoverable(DiscoveryAgent.GIAC); // GIAC = ConectividadilimitadaUna vez que se ha establecido que el dispositivo puede ser descubierto, hay que crear unaconexin servidoracon una URL. Esta URLse construye de manera similar a como se haca

    para las conexiones cliente, teniendo en cuenta que debe contener: El valor localhost como hostname. UUID, que identifica el servicioque se desea ofrecer. Nombredel servicio. Otros parmetros adicionales.

    Por ejemplo:// Para SPPString url= btspp://localhost: + (new UUID(0x7777)).toString() +;name=ejemplo;authorize=true";

    // Para L2CAPString url= brl2cap://localhost:

    + (new UUID(0x7777)).toString() + ;name=ejemplo;ReceiveMTU=512;TrnasmitMTU=512";

    Para abrir la conexin con alguna de esas URLtendrs que utilizar el mtodo opende la claseConnector. Dependiendo del tipo de protocolo que se vaya a usar (SPPo L2CAP) se obtendrun tipo de notificador diferente (StreamConnectionNotifier oL2CAPConnectionNotifier). En ambos casos dispondrs de un mtodo acceptAndOpenque devolver un objeto de tipo conexin especfico (StreamConnection oL2CAPConnection).

    Por ejemplo:// Abrimos conexin para SPPStreamConnectionNotifier notificador= (StreamConnectionNotifier) Connector.open (url);StreamConnection conexion= notificador.acceptAndOpen ();

    // Abrimos conexin para L2CAPL2CAPConnectionNotifier notificador= (L2CAPConnectionNotifier) Connector.open (url);

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    14/29

    !%

    StreamConnection conexion= notificador.acceptAndOpen ();En cualquier caso, antes de abrir la conexin, tambin hay que especificar los atributos delservicio que se va a ofrecer (objetos de la clase DataElement). Esos atributos podrsobtenerlos a partir del ServiceRecord, que a su vez puedes recuperar a travs del mtodogetRecordde la clase LocalDevice. Una vez obtenido el ServiceRecordpuedes establecersus atributos mediante el mtodo setAttibuteValue.

    Por ejemplo:ServiceRecord registro= dispositivoLocal.getRecord (notificador);DataElement elemento= new DataElement (DataElement.URL, http://www.mec.es/);registro.setAttributeValue (0x1111, elemento);

    Una vez que tengas un objeto de la clase StreamConnection, el envo y recepcin de datostanto en clientecomo en servidorse realizar de la misma manera: mediante el uso de flujosde entrada y de salida.

    Por ejemplo:StreamConnection conexin= // Estilo SPP o L2CAP

    DataInputStream entrada= conexin.openDataInputStream ();DataOutputStream salida= conexion.openDataOutputStream ();...salida.writeUTF (Bienvenido);salida.flush ();

    7.- Mensajes de texto.

    El servicio de mensajes cortos, mensajes de textoo SMS (Short Message Service)permite a los dispositivos de telecomunicaciones el envo y recepcin de pequeosmensajes de texto.Estos mensajes son enviados a un centro de mensajes cortos SMSC (Short Message

    Service Center) que conecta con el resto de elementos de la red de comunicaciones y que seencargar de guardarlos, procesarlos y encaminarlos por la ruta adecuada para que puedanllegar correctamente a su destino.Los mensajes van encapsulados en un paquete que incluye, adems del propio texto delmensaje: Fecha de envodel mensaje. Perodo de validezdel mensaje. Nmeros de telfonodel origeny del destinodel mensaje. Nmero delcentro de mensajes cortos(SMSC) de donde proviene el mensaje.

    7.1.- La API de mensajera inalmbrica (WMA).

    La API de mensajera inalmbrica WMA (Wireless Messaging API) es una API

    opcional que proporciona a las aplicaciones del perfil MIDP la posibilidad de trabajar conmensajes de texto SMS, as como el procesamiento del servicio de difusin de celdasCBS (Cell Broadcast Service). Las ltimas versiones de esta API tambin incorporan elsoporte de mensajera multimedia.

    Mediante el uso de estas herramientas resulta relativamente sencillo utilizar el servicio demensajes cortos SMSdesde aplicaciones de tipo midlet.

    La API WMA funciona conjuntamente con el marco genrico de conexin o GCF(Generic Connection Framework) que se encuentra incluido en el paquetejavax.microedition.io. Las herramientas necesarias para trabajar con mensajes de textoSMS se encuentran en el paquetejavax.wireless.messaging.

    Del mismo modo que el paquete javax.microedition.io inclua las interfacesSocketConnection y DatagramConnection, el paquete javax.wireless.messagingcontiene la interfaz MessageConnection. A travs del mtodo esttico open de la clase

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    15/29

    !&

    Conectorpuedes obtener una nueva conexin para poder enviaro recibir tus mensajesde texto.

    Por tanto, para crear esa conexinbastara con hacer algo as:MessageConnector msgCon= (MessageConnector) Conector.open ();Donde sera una URLque indicara en este caso un nmero de telfono. El

    formato de la cadena de conexin es de la forma sms:// . Por ejemplo:"sms://+34666777444".De esa forma habras creado una conexin en modo cliente, que podra ser utilizada paraenviar mensajes.

    De una manera similar tambin podras crear una conexin en modo servidorindicando unnmero de puerto:MessageConnector msgCon= (MessageConnector) Conector.open (sms://:1234);

    Una vez que dispongas de una conexin abierta, sta puede ser usada para: Crear mensajes. Enviar mensajes. Recibir mensajes(modo servidor).

    Obtener informacin de segmentacinsobre un mensaje.

    7.2.- Creacin de mensajes.

    Para poder enviar mensajes, es necesario primero crear un mensaje y a continuacinrellenarlo con un contenido. Como ya has visto en el apartado anterior, la interfazMessageConnection proporciona los mtodos necesarios para crear nuevos mensajes ytambin para poder enviar y recibir mensajes. Para crear un mensaje vaco debes utilizar elmtodo newMessagede la interfaz MessageConnection.

    Dispones de dos versiones de este mtodo: Message newMessage(String tipoMensaje). Message newMessage(String tipoMensaje, String direccion).

    Existen varios tipos de mensajes, representados por interfaces que heredan de Message: TextMessage. BinaryMessage. MultipartMessage.

    Para indicar qu tipo de mensaje deseas crear con el mtodo newMessagepuedes utilizar lassiguientes constantes predefinidas: MessageConnection.TEXT_MESSAGE. MessageConnection.BINARY_MESSAGE. MessageConnection.MULTIPART_MESSAGE.

    Para crear un mensaje de texto bastara con hacer algo as:

    TextMessage mensaje= (TextMessage) msgCon.newMessage(MessageConnection.TEXT_MESSAGE);Para rellenar ese mensaje con algn contenido (payload) puedes utilizar el mtodosetPayLoadText, que establece el contenidodel mensaje de texto:mensaje.setPayLoadText ("Ejemplo de mensaje SMS.");

    Message.

    7.3.- Envo de mensajes.

    Para enviar un SMSuna vez creado un objeto de tipo TextMessagey relleno con el contenidoque se desea mandar tan solo queda utilizar el mtodo send de la interfazMessageConnection:

    msgCon.send (mensaje);Aqu tienes un ejemplo de de cdigo que realiza todas las tareas necesarias para enviar unmensaje:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    16/29

    !'

    Crear la conexin. Crear el mensaje. Establecer el contenido del mensaje. Enviar el mensaje. Cerrar la conexin.

    7.4.- Recepcin de mensajes.

    La interfaz MessageConnection tambin dispone de un mtodo para recibir mensajes(mtodo receive). Este mtodo hace que el hilo de ejecucinse quede detenidoen esperade la llegada de un mensaje.

    La forma ms sencilla de recibir un mensaje sera simplemente esperar a que llegue unmensaje y actuar cuando eso suceda. El nico inconveniente es que la aplicacin no podra hacerninguna otra cosa mientras tanto. Para hacer esto basta con utilizar el mtodo receive de lainterfaz MessageConnection:

    public Message receive() throw IOException, InterruptedIOException

    Se lanzar una IOException si se produce algn error durante el proceso de recepcin, si laconexin est cerrada o si el mtodo ha sido sendha sido llamado desde una conexin abiertaen modo cliente y no servidor (una conexin cliente solamente puede mandar, pero norecibir).

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    17/29

    !(

    Dado que una llamada al mtodo send se queda esperando la llegada de un mensaje (no sesiguen ejecutando otras instrucciones), sta debera realizarse siempre desde su propio hilo deejecucin (thread) para no detener la ejecucin de toda la aplicacin (dara la impresin deque se ha quedado bloqueada, pues no se harn ms cosas hasta que la llamada a sendreciba

    un mensaje, cosa que no se sabe cunto puede tardar en suceder). Lo ms habitual es crear unhilo especfico de recepcindentro de la aplicacin, como sucede en la programacin decualquier de aplicacin que implementa algn tipo de servicio.

    Ese hilo de ejecucin para recepcinpodra ser liberado posteriormente mediante el cierrede la conexin MessageConnection. En tal caso se lanzar la excepcinInterruptedIOException si la conexin es cerrada mientras la ejecucin estaba bloqueadapor una llamada a send(estaba a la espera de un mensaje y an no lo haba recibido).

    7.4.1.- Un oyente para la recepcin de mensajes. La interfazMessageListener.

    Existe una alternativa para recibir mensajes sin tener que estar comprobndolo continuamente

    (y por tanto bloqueando el hilo de ejecucinen espera de un mensaje). Para eso, el paquetejavax.wireless.messaing incorpora la interfaz MessageListener, que incluye el mtodonotifyIncomingMessage. Este mtodo ser llamado cada vez que el dispositivo reciba unmensaje.

    Podras tener un midlet que implementara la interfaz MessageListenery que en el mtodonotifyIncommingMessage actuar en consecuencia cada vez que se reciba unanotificacin de mensaje entrante. En realidad la comprobacin de llegada de mensajes seestar realizando desde algn otro hilo lanzado por la mquina virtual y cada vez que seproduzca una recepcin se notificar al oyente que se haya establecido (por ejemplo el midlet) atravs de la llamada al mtodo notifyIncommingMessage. De este modo se nos facilita latarea evitndonos tener que definir nosotros un nuevo hilo de ejecucin.Nuestro midlet(o el componente de la aplicacin que vaya a ser oyente y gestor de ese evento)

    tendr implementar la interfaz MessageListener.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    18/29

    !)

    Por ejemplo:public class midletOyenteSMS extends midlet implements MessageListener {Cuando el midlet se inicie, lo registramos como oyente de una conexin para recibir mensajes:public void startApp () {

    conexion= (MessageConnection) Connector.open ("sms://:5000"); // Abrimos la conexin

    conexion.setMessageListener(this); // Establecemos como oyente de esta conexin al propiomidlet

    ...Y finalmente se define el mtodo notifyIncomingMessage:public void notifyIncomingMessage (MessageConnection conexion) {

    if (conexion == this.conexion) {

    Message mensaje= conexion.receive ();// Recibimos el mensaje

    // Analizamos el mensaje recibido

    ...Aqu tienes un ejemplo de cmo podra quedar la implementacin de un ese mtodo en unmidlet simple sin interfaz grfica:

    7.4.2.- Activacin automtica por recepcin mensaje. Push Registry.

    En ocasiones es posible que la aplicacin que recoge los mensajes recibidos por el dispositivo noest en ejecucin. En esos casos existe la posibilidad de registrar para que cuando se produzcaun determinado evento de conexin se active automticamente el midlet. Se trata delmecanismo conocido como Push Registry.La API WMApermite lanzar una determinada aplicacin cuando se reciba un nuevo mensaje.El registro puede realizarse bien a travs del archivo JAD del midleto bien dinmicamente entiempo de ejecucin mediante la clase PushRegistry.Una entrada en el registro debe incluir: Una cadena de conexin(URL) que identifique las conexiones entrantes.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    19/29

    !*

    El nombre del midlet que debe ser lanzado cuando llegue una nueva conexin entrante. Un filtroque especifica los emisores que tendrn permiso para hacer que se lance el midlet

    al mandar un mensaje.

    Un ejemplo de entradas midlet-Pushen el archivo JAD podra ser:

    Si lo que deseas es registrar dinmicamenteel midlet desde el cdigo podras entonces queutilizar la clase PushRegistry:

    PushRegistry.registerConnection (sms://:5000, midletRecepcionSMS, *);

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    20/29

    #+

    7.5.- Seguridad y permisos.

    En el caso de MIDP dispones de un mecanismo para dar permisos a las aplicaciones para que

    tengan acceso a funciones privilegiadas del dispositivo. En el caso del envo demensajestendras los siguientes permisos relacionados: Permiso para acceder a la implementacin de la clase MessageConnection . Si no

    se tiene ese permiso, el mtodo Connector.open lanzara una excepcin de tipoSecurityException.

    Permiso para enviar mensajes. Si no se tiene se lanzara tambin una SecurityException. Permiso para recibir mensajes. Si no se tiene se lanzara nuevamente una

    SecurityException. Permiso para utilizar el mecanismo Push Registry.

    Si no se tiene alguno de esos permisos y se intentan realizar operaciones comoConnector.open, send, receive, etc. se lanzar una excepcin de tipoSecurityException.

    Los permisos necesarios para poder realizar estas operaciones sin dar lugar a una excepcinson: javax.microedition.io.Connector.sms. javax.wireless.messaging.sms.send. javax.wireless.messaging.sms.receive. javax.wireless.messaging.io.PushRegistry.

    La forma ms sencilla de conceder esos permisos a un midlet es a travs del panel depropiedadesdel proyecto, dentro de la opcin "Application Descriptor" en la pestaa "APIPermissions".

    Aunque tambin podras hacerlo mediante la entrada midlet-Permissions del archivo JADdel midlet:

    midlet-Permissions: javax.microedition.io.Connector.sms, javax.wireless.messaging.mms.send,javax.wireless.messaging.sms.receive, javax.microedition.io.PushRegistry

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    21/29

    #!

    7.6.- Difusin de celda.

    El servicio de difusin de celdao CBS(Cell Broadcast Service) permite a los operadoresde telefona mvil el envo simultneo de mensajesa todos los usuarios que se encuentrenen un rea especfica(una celdao un conjunto de celdas). Entre sus principales utilidadesse encuentran el envo de alertas de emergencia o de trfico, la prestacin servicios basados enla ubicacin, y el envo de informacin comercial o cultural por parte del operador.

    Una aplicacin que haga uso de la API WMA con Java ME puede recibir mensajes CBS,aunque no enviarlos. No se necesita para ello ninguna clase o interfaz adicional a las que ya hasvisto. Se puede emplear el mismo mecanismo utilizado para la recepcin de SMS. Ahora bien, laconexin de tipo MessageConnectionslo podr ser abierta en modo servidor, dado que noest permitido enviar mensajes de tipo CBS(tan solo recibirlos).

    Bastara entonces con abrir una conexin MessageConnection indicando una URL de tipoCBSy un identificador de canal CBS.conexion = (MessageConnection) Connector.open ("cbs://:12345");

    mensaje = conexion.receive();

    En este caso el nmero "12345" no representa un puertosino un identificador CBS.

    8.- Mensajera multimedia.

    El sistema de mensajera multimediao MMS (Multimedia Messaging System) es unestndar de mensajeraque permite a los dispositivos mviles enviar y recibir contenidos nosolo de texto como suceda con los mensajes SMS, sino todo un conjunto de elementosmultimedia(imgenes, texto, sonido,vdeo, etc.). El lmite en el tamao de los mensajespuede depender tanto del terminalcomo del operador.

    Con este sistema ser necesario tambin un nuevo centro de mensajes: el centro degestin de mensajes multimedia o MMSC (Multimedia Message Service Center),anlogo al SMSCde los mensajes de texto SMS).Los mensajes multimedia pueden incluir los siguientes tipos de formatos de contenido: Para imgenes: formatos GIFy JPEG. Para texto: texto normal y texto con formato basado en EMS. Para sonido: formatos de compresin AMR, WAV y MP3 para audio digitalizado y

    formatos MIDIe IMYpara melodas. Paravdeo: formatos 3GPy MPEG4.

    8.1.- Estructura de un mensaje MMS.

    Un mensaje MMSconsiste en un mensaje de tamao variable (normalmente bastante mayor

    que los mensajes de texto) formado por distintas partes. Cada una de esas partes puedecontener un texto, una imagen, un fragmento de vdeoo de audio, o en general cualquiercontenido multimediasoportado.La estructura general de un mensaje MMSconsiste en: Una cabecera. Un cuerpo multiparte.

    Cada parte del cuerpo est formado a su vez por: Una cabecerade la parte. El contenidoo cuerpode la parte.La cabecera de una parteestar formada por un conjunto de campos como por ejemplo: MIME-Type, que indica el tipo de contenido (texto, imagen, vdeo, etc.). Por ejemplo:

    text/plain, audio/mp3, image/jpeg.

    Content-Location, para hacer referencia al nombre del archivo. Content-Identifier, que identifica el contenido.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    22/29

    ##

    El cuerpo de la parteser finalmente el contenido en s mismo (un conjunto de bytes querepresentan un texto, un sonido, una imagen, etc.).

    8.2.- Creacin de un mensaje.

    Como ya has estudiado en apartados anteriores, el paquete javax.wirelesss.messaingproporciona tambin las herramientas necesarias para gestionar, enviar y recibir mensajes

    multimedia MMS. En concreto, la API WMA2.0 incorpora dos elementos para trabajar conmensajes multimedia: La claseMessagePart,utilizada para representar cada una de las partes de un mensaje. La interfaz MultipartMessage, que nuevamente hereda de Message y que representa al

    mensaje completo (de manera similar a como suceda con TextMessage para el caso de losSMS).

    8.2.1.- Las partes de un mensaje.

    Cada objeto MessagePartser un elemento de contenido que se podr incluir en un mensaje yestar formado por los siguientes componentes: El tipo MIMEdel elemento. El identificador de contenido.

    El contenidopropiamente dicho (texto, audio, imagen, etc.). Alguna otra informacin opcional (ubicacindel contenido, esquema de codificacin

    utilizado, etc.).

    Para crear un nuevo objeto MessagePartpuedes utilizar alguno de sus constructores y pasarlelas cabeceras a travs de sus parmetros. Por ejemplo, para objeto de tipo texto tendras lossiguientes parmetros: Tipo MIME(por ejemplo "text/plain"). Identificador de contenido(por ejemplo "id-0"). Ubicacin(por ejemplo: "prueba.txt"). Codificacin(por ejemplo: "UTF-8").

    El cdigo de creacin podra quedar as:

    Aqu tienes otro ejemplo, en este caso para una imagen JPEG:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    23/29

    #$

    8.2.2.- El mensaje completo.

    Para representar el mensaje MMS completo se utiliza una nueva interfaz que hereda deMessage. En este caso se trata de MultipartMessage.

    Para crear objetos que implementen la interfaz habr que hacer algo similar a como se haca conlos mensajes de texto: utilizar el mtodo factora newMessage de la interfazMessageConnection.

    Por ejemplo:String direccion= mms://+34666123456;MessageConnector conexion= (MessageConnector) Conector.open (direccion);MultipartMessage mensaje=(MultipartMessage) conexion.newMessage (MessageConnection.MULTIPART_MESAGE);

    En este caso utilizaremos la constante MessageConnection.MULTIPART_MESSAGE paraindicar que se trata de un MMS. Para ir incluyendo partes en el mensaje puedes utilizar elmtodo addMessagePart:

    MessagePart textoMsgPart= new MessagePart ();MessagePart imagenMsgPart= new MessagePart ();MessagePart audioMsgPart= new MessagePart ();...MultipartMessage mensaje=(MultipartMessage) conexion.newMessage (MessageConnection.MULTIPART_MESAGE);

    ...mensaje.addMessagePart (textoMsgPart);mensaje.addMessagePart (imagenMsgPart);...La interfaz MultipartMessagedispone de una larga lista de mtodos que te permitirn, entreotras cosas:

    Gestionar las cabecerasdel mensaje: getHeader, setHeader. Gestionar la direccin: getAddress, setAddress, removeAddress. Gestionar cada una de las partes que contiene el mensaje: addMessagePart,

    getMessagePart, removeMessagePart, removeMessagePartId, removeMessagePartLocation.

    8.3.- Envo y recepcin de mensajes.

    El mecanismo de envo y recepcin de mensajes(interfaz Message) es comn para los trestipos de mensajes que la API WMA es capaz de gestionar (interfaces TextMessage,BinaryMessage y MultipartMessage). Recuerda que disponas de las siguientesherramientas: Mtodo sendpara enviar mensajes. Mtodo receivepara recibirlos, teniendo en cuenta que se quedar en espera de la llegada de

    un mensaje (es fundamental hacerlo en un hilo de ejecucin independiente), o bienutilizar la interfaz MessageListner.

    Mecanismo de activacin Push Registry.

    Nuevamente, al igual que suceda con los mensajes SMS, tendrs que conceder permisosparapoder trabajar con mensajes multimedia. En este caso se trata de: javax.microedition.io.Connector.mms. javax.wireless.messaging.mms.send. javax.wireless.messaging.mms.receive. javax.wireless.messaging.io.PushRegistry.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    24/29

    #%

    9.- Conexiones web.

    El protocolo utilizado para las comunicaciones por laWWW(World Wide Web) es conocido

    como HTTP. Este estndar se encarga de establecer las normas que utilizan los elementos desoftware de la arquitectura web(esencialmente clientes y servidores, aunque tambin losservidores proxy) para comunicarse. Se trata de un protocolo orientado a transacciones quesigue el esquema peticin-respuesta entre un cliente y un servidor (el cliente realizauna peticinal servidory espera a que ste le enve una respuesta).

    Al cliente que efecta la peticin (un navegador web) se lo conoce como "user agent"(agente del usuario). A la informacin transmitida se la llama recurso y se la identificamediante un localizador uniforme de recursos(URL). Los recursos pueden ser archivos,el resultado de la ejecucin de un programa, una consulta a una base de datos, la traduccinautomtica de un documento, etc.

    9.1.- Conexiones HTTP.

    Una conexin HTTPpuede encontrarse en uno de estos tres estados: Estado de establecimiento de la conexin (setup), donde se indican los parmetros

    de comunicacin. El cliente prepara la peticin que se va a realizar al servidor, adems denegociar algunos parmetros como el formato, el idioma, etc.

    Estado de conexin(Connected), en el que se realiza el intercambio de informacinentre el clientey el servidor.

    Estado de cierre de la conexin (closed), cuando finaliza la comunicacin entreclientey servidor.

    La estructura de conexiones genrica GCFproporciona la interfaz HttpConnectionparatrabajar con las conexiones HTTP. Dispone de todos los mtodos y constantes necesarias parapoder establecer una conexin HTTP, realizar una comunicacin a travs de ella y

    finalmente cerrar la conexin.Los principales mtodos de la interfaz HttpConnection los puedes consultar en la API delGCF.

    Los tipos de peticiones HTTP (comandos o mtodos HTTP)que se pueden enviar son: GET, donde toda la informacin que se enva al servidor va en la URL. POST, donde la informacin que se enva al servidor va aparte en un stream(adems de lo

    que se enve por la URL). HEAD, donde se pide metainformacin.

    Una peticin HTTP estar formada por: La peticinpropiamente dicha (comando HTTP). Cabecerasde peticin.

    Cierta informacin adicional(en el caso de peticiones POST). Formara el cuerpode lapeticin (no siempre existe, slo si se trata de una peticin de tipo POST).

    Ejemplos de posibles cabeceras HTTPNombre cabecera Descripcin

    User-Agent Identificacin del cliente (agente).Date Fecha y hora de envo del mensaje.

    Content-Length Longitud del cuerpo de la peticin.Accept Formatos que acepta el cliente.

    Connection Indica al servidor si se quiere dejar abierta la conexin tras la peticin o se quiere cerrar.

    9.2.- Manejo de las conexiones HTTP con la GCF.

    Para establecer una conexin HTTPcon un servidor utilizaremos una vez ms el mecanismogenrico que el marco GCF nos proporciona para abrir conexiones: el uso del mtodoesttico opende la clase Connectorindicando una URLde tipo HTTP.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    25/29

    #&

    Por ejemplo:HttpConnection conexion= (HttpConnection) Connector.open ("http://www.mec.es/");Una vez creada la conexin, falta indicar: El tipo de peticin (GET, POST, HEAD). MtodosetRequestMethod. Las cabeceras que se van a enviar (User-Agent, Connection, Accept, Content-Language,

    etc.). Mtodo setRequestProperty.

    Por ejemplo:conexion.setRequestMethod (HttpConnection.GET);

    conexion.setRequestProperty ("User-Agent", "Profile/MIDP-20.0 Configuration/CLDC-1.0");

    conexion.setRequestProperty ("Content-Language", "es-ES");

    En este momento an estamos en el estado de establecimiento de conexin. Pasaramos alestado conectadoen cuanto se comiencen a enviaro recibirdatos.Mientras la conexin permanezca abierta, podrs utilizar los siguientes mtodos: getURL,getProtocol, getHosty getPort, que proporcionan informacin acerca de la conexin.

    9.3.- Establecimiento de la conexin HTTP.

    Para enviar o recibir informacin a travs de la conexin HTTP puedes utilizar los mtodosopenOutputStream y openInputStream, heredados de InputConnection yOutputConnection. A partir de ese momento, si todo ha ido bien, la conexin pasara a estadoconectada. Por ejemplo:OutputStream salida= conexion.openOutputStream (); // Flujo abierto: conexin realizada

    InputStream entrada= conexion.openInputStream ();En el siguiente fragmento de cdigo tienes un ejemplo de cmo establecer una conexin HTTPcon un servidor para descargar un archivo de tipo imagen GIF y almacenarlo en un objeto detipo Image:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    26/29

    #'

    9.4.- Conexiones HTTPS.

    HTTPS es la versin segura del protocolo HTTP. Se basa en el establecimiento deconexiones HTTP sobre SSL (Secure Sockets Layer). Para poder establecer este tipo deconexiones dispones del interfaz HttpsConnection, que hereda de HttpConnection.La forma de trabajar con esta interfaz es idntica a la que has utilizado para las conexionesHTTP convencionales. La nica diferencia es que en este caso hars uso de un objetoHttpsConnection.

    Por ejemplo:HttpsConnection conexionSeg (HttpsConnnection) Connector.open ("https://......");

    conexionSeg.setRequestMethod (HttpConnection.GET);

    conexionSeg.setRequestProperty ("User-Agent", "Profile/MIDP-2.1 Configuration/CLDC-1.1");

    ...

    Los mtodos adicionales que aporta esta interfaz son: getPort, que devuelve el puertoutilizado para la conexin HTTPS(funcin sobrescrita). getSecurityInfo, que devuelve la informacin de seguridad asociada a la conexin (objeto

    SecurityInfo).

    Las conexiones HTTPseguras pueden lanzar la excepcin CertificateException(subclase deIOException), relacionada especficamente con errores ocurridos en el establecimientode conexiones seguras.

    La interfaz SecurityInfo proporciona mtodos que permiten acceder a la informacinasociada a conexiones seguras. Cualquiera de los protocolos que implementa MIDP 2.0para establecer estas conexiones seguras (HTTPo socketsseguros sobre SSL) pueden utilizarestos mtodos para conocer los parmetros de seguridad de estas conexiones. En la

    siguiente tabla tienes una breve descripcin de estos mtodos:

    Mtodo Descripcin

    String getCipherSuite ()Obtiene una cadena con el nombre del sistema de cifrado(suite de cifrado) que se est utilizando.

    getProtocolName() Obtiene el nombre del protocolo seguro al que pertenece la conexin.getProtocolVersion Obtiene la versin del protocolo seguro utilizado.

    Certificate getServerCertificate()Obtiene el certificado (objeto Certificate) utilizado para establecerla conexin segura con el servidor.

    9.4.1.- Certificados digitales.

    La interfaz Certificate, incluida en el paquete javax.microedition.pki, sirve pararepresentar y manejar certificados digitales en la plataforma Java ME. Proporciona losmtodos necesarios para consultar las caractersticas de un certificado: Nombre del emisor del certificado(mtodo getIssuer). Fecha de caducidaddel certificado (mtodo getNotAfter). Fecha de inicio de validezdel certificado (mtodo getNotBefore). Nmero de seriedel certificado (mtodo getSerialNumber). Algoritmoutilizado para firmar el certificado (mtodo getSigAlgName). Asuntodel certificado (mtodo getSubject). Tipode certificado (mtodo getType). Versindel certificado (mtodo getVersion).

    Aqu tienes un ejemplo que obtiene la informacin de seguridad relacionada con una conexinHTTPS:

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    27/29

    #(

    Anexo II.- La plataforma Wireless Toolkit para CLDC. (leer interesante)

    Plataforma Sun Java Wireless Toolkit.La plataforma Sun Java Wireless Tookit consiste en un conjunto de herramientas quepermite la creacin de aplicaciones Java compatibles con tecnologas de dispositivos mvilesque implementan los estndares de Java ME. Est compuesta por herramientas degeneracin de cdigo, utilidades, emuladoresde dispositivos y otras herramientas.Este conjunto de herramientas implementan la mayora de las APIs definidas por la JCP(JavaCommunity Process.): Mobile Service Architecture (JSR 248). Java Technology for the Wireless Industry (JTWI) (JSR 185). Connected Limited Device Configuration (CLDC) 1.1 (JSR 139). Mobile Information Device Profile (MIDP) 2.0 (JSR 118). PDA Optional Packages for the J2ME Platform (JSR 75).

    Java APIs for Bluetooth (JSR 82). Mobile Media API (MMAPI) (JSR 135). J2ME Web Services Specification (JSR 172). Security and Trust Services API for J2ME (JSR 177). Location API for J2ME (JSR 179). SIP API for J2ME (JSR 180). Mobile 3D Graphics API for J2ME (JSR 184). Wireless Messaging API (WMA) 2.0 (JSR 205). Content Handler API (JSR 211). Scalable 2D Vector Graphics API for J2ME (JSR 226). Payment API (JSR 229). Advanced Multimedia Supplements (JSR 234). Mobile Internationalization API (JSR 238).

    Java Binding for the OpenGL(R) ES API (JSR 239).

    Si por alguna razn no tuvieras instalada esta plataforma puedes descargarla de:Sun Java Wireless Toolkit 2.5.2_01 for CLDC Download (en ingls).

    Entre las herramientas incluidas en este paquete tienes por ejemplo la consola WMA, que teva a proporcionar muchas facilidades a la hora de probar tus midlets que utilizan lasfuncionalidades de envo y recepcin de mensajes. Si lo deseas puedes seguir trabajando con laplataforma incluida por Netbeans como es probable que hayas estado haciendo hasta ahora,pero es posible que para este tipo de aplicaciones la consola WMA que incorpora esta otraplataforma te sea de gran ayuda.

    Si an no tienes integrada esta plataforma en el IDE de Netbeans puedes hacerlo de lasiguiente manera: Si no tienes disponible en tu sistema esta plataforma, descrgala del enlace anterior e

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    28/29

    #)

    instlala. Abre la caja de dilogo "Administrador de Java Platform". Puedes llegar hasta ella a

    travs de la opcin de men "Herramientas-> Plataformas Java". Una vez abierta la caja de dilogo, comprueba si dentro de la categora J2MEtienes instalada

    la plataforma "Sun Java(TM) Wireless Toolkit 2.5.2 for CLDCadems de "JavaPlatform Micro Edition SDK 3.0", que es la que incorpora inicialmente Netbeans.

    Si no est instalada esa plataforma, pulsa el botn "Aadir plataforma". Se te abrir una nueva caja de dilogo "Aadir plataforma Java". Escoge como tipo deplataforma "Java MIDP Platform Emulator".

    En el segundo paso, "Platform Folders", debera aparecer la opcin de instalar Seleccionaesa opcin marcando su casilla de verificacin.

    Si todo ha funcionado correctamente, debera indicar que se ha instalado la plataforma "SunJava(TM) Wireless Toolkit 2.5.2 for CLDC" as como algunos detalles como losemuladores de dispositivo que incorpora o las APIs opcionales que incluye.

    A partir de este momento, deberas de tener al menos dos plataformas (si no las tenas ya)dentro de la categora J2ME: Java Platform Micro Edition SDK 3.0. Sun Java(TM) Wireless Toolkit 2.5.2 for CLDC.

    Desde de ahora, para cada midlet que vayas a generar, podrs elegir la plataforma con la quedesees trabajar. Eso podrs hacerlo dentro de las propiedades del proyecto, en la seccin"Platform", en la opcin "Emulator Platform".

    Si dentro del administrador de plataformas eliges la opcin "Sun Java(TM) WirelessToolkit 2.5.2 for CLDC", y a continuacin, en la pestaa "Tools & Extensions", pulsas elbotn "Open Utilities", obtendrs una ventana con una serie herramientas que te podrn serde gran utilidad. Entre ellas se encuentra la "WMA Console" que te permitir, entre otrascosas, enviar mensajes a los nmeros de telfono que quieras para poder probar la recepcin demensajes en los dispositivos que ests emulando en ese momento.

    Anexo II.- Herramientas para el envo de mensajes de texto SMS.

    El paquetejavax.wireless.messagingproporciona las herramientas necesarias para el envode mensajes de texto: Interfaz Message, que incluye los mtodos necesarios para manipular los mensajes. Interfaz MessageConnection, con los mtodos necesarios para gestionar una conexinque

    te va a permitir enviary recibirmensajes. Interfaz TextMessage, que representa a los mensajes de texto SMS.Un mensaje genrico se representa mediante un objeto de una clase que implemente lainterfaz Message. Los mtodos proporcionados por esta interfaz los tienes en la siguiente

    tabla:

    Mtodo DescripcinString getAddress (). Obtiene la direccin del mensaje.

    Date getTimeStamp (). Obtiene la fecha y hora de envo del mensaje (marca de tiempo "Unix").

    void setAddress (String direccion). Establece la direccin del mensaje.

    Para mantener la compatibilidad con el estndar definido en la GCF, la funcionalidad de envo yrecepcin de mensajes es implementada mediante una interfaz que hereda de Connection: lainterfaz MessageConnection. Los mtodos proporcionados por esta interfazlos tienes en lasiguiente tabla:

    Mtodo DescripcinMessage newMessage (String tipo). Crea un nuevo mensaje del tipo indicado.

    Message newMessage (String tipo, String direccion).Crea un nuevo mensaje con el tipo y la direccin de destin

    indicados.int numberOfSegments (Message msg).

    Devuelve el nmero de segmentos necesarios para enviarun determinado mensaje.

  • 7/24/2019 UT 3 PROGRAMACIN DE APLICACIONES PARA DISPOSITIVOS MVILES (II).pdf

    29/29

    Message receive ().Recibe un mensaje (este mtodo detiene el hilo deejecucin mientras no se reciba un mensaje).

    void send (Message msg). Enva un mensaje.

    void setMessageListener (MessageListener oyente).Registra el oyente que ser notificado cada vez que seproduzca la recepcin de un mensaje por esa conexin.

    La interfaz que hereda de Message y que representa los mensajes de texto esTextMessage. Sus mtodos los tienes en la siguiente tabla:

    Mtodo DescripcingetPayLoadText (). Devuelve el contenido de un mensaje de texto.

    void setPayLoadText (String contenido). Establece el contenido de un mensaje de texto.