Top Banner
BlackBerry Java SDK Network Communication Versión: 6.0 Guía de desarrollo
61

Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Nov 28, 2014

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

BlackBerry Java SDKNetwork CommunicationVersión: 6.0

Guía de desarrollo

Page 2: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Publicado: 2011-02-16SWD-1327377-0217050809-005

Page 3: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Contenido1 Descripción general de comunicación de red................................................................................................... 3

2 API de comunicación......................................................................................................................................... 4Comunicar con servidores HTTP....................................................................................................................... 5

Solicitar datos mediante un objeto BlockingSenderDestination............................................................... 6Solicitar datos mediante un objeto NonBlockingSenderDestination........................................................ 7Enviar datos mediante un objeto FireAndForgetDestination.................................................................... 10Analizar un formato de datos común de Internet..................................................................................... 11

Suscribirse a un iniciador push......................................................................................................................... 11Suscribirse a un iniciador push.................................................................................................................. 12

Enviar información de inicio de sesión a un servidor HTTP.............................................................................. 13

3 Transportes de red............................................................................................................................................ 15Arquitectura: transportes de red...................................................................................................................... 15Utilizar BlackBerry Enterprise Server como gateway de intranet..................................................................... 17Utilizar el gateway de Internet de un proveedor de servicios inalámbricos..................................................... 18

4 Conexiones de red............................................................................................................................................ 19API de red......................................................................................................................................................... 20

Elegir transportes de red mediante la API de red...................................................................................... 20Abrir una conexión de red mediante la API de red.................................................................................... 21

Marco genérico de conexión (GCF)................................................................................................................... 23Abrir una conexión de red mediante el GCF.............................................................................................. 23

Enviar y recibir datos mediante una conexión de red...................................................................................... 25Opciones de transporte de red......................................................................................................................... 28

5 Trabajar con radios........................................................................................................................................... 30Consultar la disponibilidad de la radio y cambiar su estado............................................................................. 30

6 Ejemplos de código........................................................................................................................................... 32Muestra de código: solicitar datos mediante un objeto BlockingSenderDestination...................................... 32Muestra de código: solicitar datos mediante un objeto NonBlockingSenderDestination................................ 34Muestra de código: análisis de una estructura de datos de JSON.................................................................... 36Muestra de código: recuperar una página Web mediante el API de red.......................................................... 40Muestra de código: recuperar una página Web mediante el GCF.................................................................... 43Muestra de código: determinar los transportes de red con cobertura suficiente mediante la API de red...... 46Muestra de código: control de radios............................................................................................................... 47Muestra de código: determinar el estado de un transporte de red mediante la API de red........................... 50

Page 4: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

7 Glosario............................................................................................................................................................. 52

8 Comentarios..................................................................................................................................................... 55

9 Historial de revisión del documento................................................................................................................. 56

10 Aviso legal......................................................................................................................................................... 57

Page 5: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Descripción general de comunicación de red 1Los dispositivos BlackBerry® utilizan tecnologías de comunicación de radio como Wi-Fi®, CDMA,o GPRS paracomunicarse mediante conexiones inalámbricas. Los dispositivos BlackBerry operan con transportes de red diferentesa través de esas tecnologías de radio para conectarse con Internet o una red privada. Cada transporte ofrece ventajasdiferentes. Como desarrollador, debe elegir el transporte más apropiado para sus requisitos.

Cuando elija un transporte para su aplicación, debe tener en cuenta varios factores diferentes, incluidos:• El tipo de usuario• La importancia de la seguridad y la fiabilidad• Las redes que la aplicación debe utilizar y admitir para los usuarios en itinerancia• La cantidad de datos que espera enviar y recibir• La necesidad de insertar datos por push de forma proactiva para actualizaciones y alertas• La ubicación del servidor de destino (Internet o la intranet)

BlackBerry® Java® SDK 6.0 incluye tres API que puede utilizar para abrir una conexión de red.

API DescripciónVersión deBlackBerryDevice Software

API de comunicación La API de comunicación encapsula todas las operacionesrequeridas para conectarse a un servidor HTTP situado enInternet o detrás de un firewall de la empresa.

6.0 y posterior

API de red La API de red ofrece una interfaz sencilla para acceder amuchas opciones relacionadas con la conexión y lostransportes de red.

5.0 y posterior

Marco genérico de conexión(GCF)

El GCF ofrece una manera flexible de crear conexiones a lared mediante el transporte de su elección.

4.0 y posterior

Además de la funcionalidad que cada API ofrece, debe tener en cuenta si la API existe en la versión de BlackBerry®Device Software que probablemente ejecuten sus dispositivos de destino. Por ejemplo, la API de comunicaciónrequiere BlackBerry Device Software 6.0. Debería escribir su propio código para realizar tareas similares en losdispositivos que ejecuten BlackBerry Device Software 5.0 y anterior.

La solución BlackBerry también activa aplicaciones de servidor para insertar datos por push de forma proactiva endispositivos BlackBerry de un modo sumamente seguro y fiable.

Guía de desarrollo Descripción general de comunicación de red

3

Page 6: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

API de comunicación 2La API de Comunicación simplifica el proceso de interactuación con servicios Web y otras aplicaciones. Los objetosque crea mediante esta API automatizan el proceso de búsqueda de un transporte de red disponible, creación deuna conexión segura para subprocesos y negociación de un intercambio de datos con el punto final del URI o ladirección URL que especifique. La API se implementa en el paquete net.rim.device.api.io.messaging.

Dentro de la API de comunicación, los puntos finales del URI y la dirección URL se denominan destinos. Puede utilizarobjetos que implementen la interfaz de SenderDestination para enviar los datos a un servicio Web y acceder ala respuesta. De forma similar, puede utilizar objetos que implementen la interfaz de ReceiverDestination parasuscribirse a un servicio push y ofrecer el acceso a mensajes nuevos de ese servicio. Debe utilizar la clase deDestinationFactory para crear un objeto que implemente una de las subinterfaces de Destination que mejorsatisfaga sus requisitos.

Interfaz Descripción

BlockingSenderDestination Puede utilizar esta interfaz para enviar un mensaje a un servicioWeb, pero este objeto bloquea la ejecución de subprocesosmientras espera una respuesta del servicio Web.

Alternativamente, BlockingSenderDestination puededevolver un objeto de MessageFuture. Esto permite la ejecucióndel subproceso para continuar hasta que invoque uno de losmétodos de get() del MessageFuture.

Cuando invoca sendReceive() enBlockingSenderDestination para enviar un mensaje y esperauna respuesta, no lo debe invocar desde el subproceso de eventoprincipal.

NonBlockingSenderDestination Puede utilizar esta interfaz para enviar un mensaje a un servicioweb. En la lista de parámetros, pase su implementación de lainterfaz de MessageListener para recibir la respuesta delservicio Web.

BlockingReceiverDestination Puede utilizar esta interfaz para suscribirse a un servicio push ybloquear la ejecución de subprocesos hasta que reciba laconfirmación de su solicitud de suscripción.

NonBlockingReceiverDestination Puede utilizar esta interfaz para suscribirse a un servicio push. Enla lista de parámetros, pase su implementación deMessageListener para recibir mensajes push.

FireAndForgetDestination Puede utilizar esta interfaz para enviar los datos a un servicio Webcuando no espere una respuesta.

Guía de desarrollo API de comunicación

4

Page 7: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Los datos que envía a y recibe de un servicio Web se ajustan en un objeto de Message. Puede establecer losencabezados y el contenido de los datos que envía a un servicio Web en el objeto Message. Alternativamente, puedepermitir que la API de comunicación elija valores predeterminados razonables para su solicitud. Por ejemplo, puedesolicitar una página Web invocando SenderDestination.send() sin especificar un comando HTTP GET.

También puede indicar a la API que analice automáticamente los datos de la respuesta de un servicio Web. Siimplementa la interfaz de MessageProcessor con su clase de analizador, puede suministrar su objeto analizadoral método en DestinationFactory que crea su objeto de Destination. A continuación puede recuperar larespuesta analizada mediante Message.getObjectPayload().

Los paquetes de net.rim.device.api.io.parser contienen procesadores de mensajes para una gran variedadde formatos de datos estándar utilizados en el Internet. Los paquetes incluyen analizadores para:• JSON• RSS (RDF, Atom)• SOAP• XML

Para mejorar la eficiencia, la API de Comunicación ofrece respuestas largas desde servicios Web en un objeto deInputStream. Una aplicación puede solicitar datos adicionales según sea necesario en lugar de descargar una grancantidad de datos de una sola vez y almacenarla en la memoria del dispositivo. Este enfoque le permite hacer unmejor uso tanto del banda de la red como de la memoria.

Comunicar con servidores HTTPPara enviar un comando a un servidor HTTP, necesita un objeto de SenderDestination para comunicarse con unpunto final. El objeto de SenderDestination es responsable de poner en cola los mensajes para la entrega y deobtener los mensajes entrantes para la entrega. La clase de DestinationFactory crea y mantiene una lista deobjetos de Destination que puede utilizar para comunicarse con un punto final.

Antes de crear un SenderDestination, debe comprobar si existe uno invocando getSenderDestination().Puede acceder a un destino existente proporcionando el nombre del objeto de Context que suministró cuandoinvocó cualquiera de los métodos de DestinationFactory.create...().

Cuando termine de intercambiar datos con un punto final, debe invocar DestinationFactory.release() oDestinationFactory.destory(). El método release() elimina la asociación entre un Destination y las colasde mensajes entrantes y salientes. Después de invocar release(), la API sigue intentando entregar los mensajesde la cola. Puede utilizar release() cuando su aplicación no esté en estado de envío y recepción de mensajes.Además de eliminar la asociación entre un Destination y una cola del mensaje, destroy() también destruye lacola del mensaje. Después de invocar destory(), se eliminará cualquier mensaje de la cola.

Un mensaje contiene los detalles de su comando, incluido el método de solicitud HTTP y cualquier dato adicionalque requiera. Si no especifica todos los parámetros para su mensaje, la API de comunicación proporciona valorespredeterminados.

Guía de desarrollo Comunicar con servidores HTTP

5

Page 8: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Después de enviar su mensaje, puede que necesite escuchar una respuesta. Para objetos deBlockingSenderDestination, debe crear un objeto de Thread cuando invoca uno de los métodos desendReceive(). Para objetos de NonBlockingSenderDestination, debe crear un objeto deMessageListener para recibir la respuesta.

En cualquier caso, debe procesar un objeto de Message que contenga la respuesta. De forma predeterminada, elcuerpo del Message contiene los datos sin procesar de respuesta. Puede elegir especificar un procesador de mensajesdel paquete de net.rim.device.api.io.parser o crear el suyo propio mediante la interfaz deMessageProcessor.

Si es necesario, puede conectar múltiples procesadores de mensajes. La clase de MessageProcessorChaincomparte la memoria entre los objetos de MessageProcessor para mejorar la eficiencia. Por ejemplo, si recibedatos de vídeo que utilizan codificación y compresión personalizadas, puede separar la lógica de codificación ycompresión en procesadores de mensajes distintos y, a continuación, usar MessageProcessorChain paraagruparlos.

Solicitar datos mediante un objeto BlockingSenderDestination

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.io.messaging.*;import net.rim.device.api.io.URI;

2. Cree un subproceso desde el cual llamar a BlockingSenderDestination.sendReceive().

Thread t = new Thread( new Runnable(){ public void run() {

3. Cree un objeto de Message que contenga la respuesta de la dirección URL.

Message response = null;

4. Cree un objeto de URI para pasarlo a la clase de DestinationFactory.

URI uri = new URI("http://www.blackberry.com");

5. Cree un objeto de BlockingSenderDestination.

BlockingSenderDestination bsd = null;

6. Recupere el objeto de BlockingSenderDestination para su contexto, si existe.

try { bsd = (BlockingSenderDestination) DestinationFactory.getSenderDestination ("MyContext", uri);

7. Si no existe un BlockingSenderDestination, cree uno.

Guía de desarrollo Comunicar con servidores HTTP

6

Page 9: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

if(bsd == null) { bsd = DestinationFactory.createBlockingSenderDestination (new Context("MyContext"), uri); }

8. Envíe un mensaje y espere la respuesta.

response = bsd.sendReceive();

9. Si el servicio Web envía una respuesta, procésela.

if(response != null) { processResponse(response); } }

10. Revise cualquier error que se produzca si el mensaje no se pudo enviar por alguna razón.

catch (Exception e) { // Process the error }

11. Publique el BlockingSenderDestination.

finally { if(bsd != null) { bsd.release(); } } }});

12. Inicie el subproceso.

t.start();

Después de terminar: Si su processResponse() actualiza la IU, debe hacer lo mismo en el subproceso de eventoprincipal, no en el subproceso que usted creó en esta tarea. Para obtener más información, lea el artículo de la basede conocimientos en http://supportforums.blackberry.com/t5/Java-Development/Manage-UI-interactions/ta-p/502378.

Puede ver una muestra de código completo, en "Muestra de código: solicitar datos mediante un objetoBlockingSenderDestination"

Solicitar datos mediante un objeto NonBlockingSenderDestinationAntes de comenzar: Para solicitar datos mediante la clase de NonBlockingSenderDestination, cree un objetoque implementa la interfaz de MessageListener. Para obtener más información, consulte "Implementar la interfazMessageListener".

Guía de desarrollo Comunicar con servidores HTTP

7

Page 10: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.io.messaging.*;import net.rim.device.api.io.URI;

2. Cree un objeto de Message que contenga la respuesta de la dirección URL.

Message response = null;

3. Cree un objeto de URI para pasarlo a la clase de DestinationFactory.

URI uri = new URI("http://www.blackberry.com");

4. Cree un objeto de NonBlockingSenderDestination.

NonBlockingSenderDestination nbsd = null;

5. Cree una referencia a su MessageListener.

MyMessageListener msgListener = new MyMessageListener();

6. Recupere el objeto de NonBlockingSenderDestination para su contexto, si existe.

try{ nbsd = (BlockingSenderDestination) DestinationFactory.getSenderDestination ("MyContext", uri);

7. Si no existe un NonBlockingSenderDestination, cree uno.

if(nbsd == null) { nbsd = DestinationFactory.createNonBlockingSenderDestination (new Context("MyContext"), uri, msgListener); }

8. Envíe un mensaje al servicio Web.

nbsd.send();

9. Revise cualquier error que se produzca si el mensaje no se pudo enviar por alguna razón.

catch (Exception e) { // Process the error }

Después de terminar: Publique NonBlockingSenderDestination cuando acabe de procesar la respuesta.

Puede ver una muestra de código completo, en "Muestra de código: solicitar datos mediante un objetoNonBlockingSenderDestination"

Guía de desarrollo Comunicar con servidores HTTP

8

Page 11: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Implementar la interfaz MessageListener

Puede utilizar la interfaz de MessageListener para recibir los mensajes enviados por un objeto deNonBlockingSenderDestination o los mensajes push enviados desde un iniciador push.

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.io.messaging.*;import java.io.IOException;import java.io.InputStream;

2. Defina una clase que implemente la interfaz de MessageListener.

public class MyMessageListener implements MessageListener {

3. Implemente onMessage().

public void onMessage(Destination dest, Message incomingMessage) {

4. Inicialice una variable de String que contenga los datos de la respuesta.

String payload = null;

5. Si la respuesta es un objeto de ByteMessage, recupere la respuesta como String y asígnelo a payload.

if (incomingMessage instanceof ByteMessage) { ByteMessage reply = (ByteMessage) incomingMessage; payload = (String) reply.getStringPayload(); }

6. Si la respuesta es un StreamMessage, recupera la respuesta como un objeto de InputStream.

else if(incomingMessage instanceof StreamMessage) { StreamMessage reply = (StreamMessage) incomingMessage; InputStream is = reply.getStreamPayload();

a. Si la respuesta es pequeña, convierta los contenidos de la transmisión en una matriz de byte.

byte[] data = null; try { data = net.rim.device.api.io.IOUtilities.streamToBytes(is); } catch (IOException e) { // process the error }

b. Si la conversión fue correcta, convierta la matriz de byte a un String y asígnelo a payload.

if(data != null) { payload = new String(data); } }

Guía de desarrollo Comunicar con servidores HTTP

9

Page 12: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

7. Si payload contiene datos, muéstrelo.

if(payload!=null) { synchronized(Application.getEventLock()) { UiApplication.getUiApplication().pushScreen (new HTTPOutputScreen(payload)); } }

Después de terminar: Implemente onMessageCancelled() y onMessageFailed() para procesar otrasnotificaciones.

Puede ver una muestra de código completo, en "Muestra de código: solicitar datos mediante un objetoNonBlockingSenderDestination"

Enviar datos mediante un objeto FireAndForgetDestination

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.io.messaging.*;import net.rim.device.api.io.URI;

2. Cree un objeto de URI para pasarlo a la clase de DestinationFactory.

URI uri = new URI("http://www.example.com");

3. Cree un objeto de FireAndForgetDestination.

FireAndForgetDestination ffd = null;

4. Recupere el objeto de FireAndForgetDestination para su contexto, si existe.

try{ ffd = (FireAndForgetDestination) DestinationFactory.getSenderDestination ("MyContext", uri);

5. Si no existe un FireAndForgetDestination, cree uno.

if(ffd == null) { ffd = DestinationFactory.createFireAndForgetDestination (new Context("MyContext"), uri); }

6. Cree un objeto de ByteMessage y complételo con información para enviar a un servicio Web.

ByteMessage myMsg = ffd.createByteMessage(); myMsg.setStringPayload("I love my BlackBerry device!");

7. Lance su mensaje como un HTTPMessage para configurar el método HTTP que quiera utilizar.

((HttpMessage) myMsg).setMethod(HttpMessage.POST);

Guía de desarrollo Comunicar con servidores HTTP

10

Page 13: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

8. Envíe el mensaje al servicio Web.

ffd.sendNoResponse(myMsg);

9. Revise cualquier error que se produzca si el mensaje no se pudo enviar por alguna razón.

catch (Exception e) { // Process the error }

Analizar un formato de datos común de InternetPuede configurar un objeto de Destination para que devuelva un objeto de Java® que contenga datos analizadosdesde un formato estándar, como JSON. Para recuperar la estructura de datos en un objeto de Java, debe:

1. Especificar un objeto de MessageProcessor cuando invoque DestinationFactory.create...().

2. Recuperar la respuesta de su Destination.

3. Extraer los datos del objeto de Message devuelto en la respuesta.

Ejemplo de código

La muestra de código siguiente demuestra las tres acciones requeridas para recuperar un objeto de Java que contengauna estructura de datos JSON.

import net.rim.device.api.io.messaging.*import net.rim.device.api.io.parser.json.*// Specify a MessageProcessor when you create your DestinationBlockingSenderDestination bsd = DestinationFactory(myContext, myURI, new JSONMessageProcessor());// Retrieve the responseMessage response = bsd.sendReceive();// Extract the Java object that contains the JSON data structureObject payload = response.getObjectPayload();

Suscribirse a un iniciador pushPuede utilizar la API de comunicación para enviar una solicitud de suscripción al URI de un proveedor de contenido.Además del objeto de SenderDestination que envía la solicitud de la suscripción, debe crear un objeto deReceiverDestination que defina el objeto de MessageListeneral que el dispositivo BlackBerry® debe entregarlos mensajes push entrantes de un URI dado.

La tabla siguiente describe los componentes que participan en una solicitud de suscripción.

Guía de desarrollo Suscribirse a un iniciador push

11

Page 14: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Componente Descripción

SenderDestination Este componente envía el mensaje de suscripciónal proveedor del contenido. Este componente esopcional. Puede enviar un mensaje de suscripciónmediante cualquier tipo de conexión de red. Porejemplo, puede utilizar la API de red para crear unHTTPConnection y enviar los parámetros desuscripción manualmente.

Mensaje de suscripción La API de comunicación puede crear un mensaje desuscripción con el formato adecuado por usted.Puede invocarBpsSubscriptionMessageBuilder.createByteSubscriptionMessage() para recuperar unobjeto de ByteMessage configurado para suSenderDestination,NonBlockingReceiverDestination y elMessageListener donde quiere recibir losmensajes push entrantes.

NonBlockingReceiverDestination Este componente asocia un URI particular con elMessageListener donde quiere recibir losmensajes push entrantes y un objeto deInboundDestinationConfiguration.

InboundDestinationConfiguration Este componente especifica diversos parámetrosde servicios de push, como un indicador queespecifica si su aplicación debe iniciarse cuandollega un mensaje de push nuevo. Puede crear unInboundDestinationConfigurationmediante la clase deInboundDestinationConfigurationFactory.

MessageListener Este componente procesa los mensajes pushentrantes.

Suscribirse a un iniciador pushEsta tarea se centra en crear un mensaje de suscripción y el objeto de NonBlockingReceiverDestination parauna suscripción de BlackBerry® Push Service. Debe enviar su mensaje de suscripción mediante un objeto deSenderDestination o creando una conexión de red manualmente.

Antes de comenzar: Obtenga un identificador de aplicación y el número de puerto local que su aplicación debe utilizarpara buscar mensajes entrantes. Proporcione estos detalles al proveedor de contenido que crea la aplicación pushde servidor.

Guía de desarrollo Suscribirse a un iniciador push

12

Page 15: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.io.messaging.*;

2. Inicialice una variable de NonBlockingReceiverDestination para administrar la suscripción.

NonBlockingReceiverDestination nbrd = null;

3. Cree un objeto de MessageListener para procesar los mensajes push entrantes.

try{ MyMessageListener pushListener = new MyMessageListener();

4. Cree un objeto de URI con la información del puerto que el proveedor de contenido le asigna a usted.

URI pushURI = URI.create("http://:101");

5. Cree un objeto de InboundDestinationConfiguration para establecer los parámetros para la suscripciónpush.

InboundDestinationConfiguration config = InboundDestinationConfigurationFactory.createBPSConfiguration (true, // start this application when a push message arrives false, // allow other applications to receive these push messages false, // do not store these messages (persistence not supported) "12-Ab234cD5eF67h890", // application ID, BPSuri); // BlackBerry Push Service URI

6. Cree un NonBlockingReceiverDestination.

nbrd = DestinationFactory.createNonBlockingReceiverDestination (config, pushURI, pushListener);

7. Cree un SenderDestination para enviar un mensaje de suscripción.

NonBlockingSenderDestination bpsDestination = DestinationFactory.createNonBlockingSenderDestination (myContext, uri, responseListener);

8. Configure un mensaje de suscripción.

ByteMessage subMsg = BpsSubscriptionMessageBuilder.createByteSubscriptionMessage (bpsDestination, nbrd, "user", "pwd");

9. Envíe el mensaje de suscripción.

bpsDestination.send(subMsg);

Enviar información de inicio de sesión a un servidor HTTPUn objeto de Destination puede suministrar información de inicio de sesión, como el nombre de usuario y lacontraseña, cuando un servidor Web lo solicite. La información de inicio de sesión se almacena en el objeto deContext que proporciona cuando crea un Destination mediante la clase de DestinationFactory.

Guía de desarrollo Enviar información de inicio de sesión a un servidor HTTP

13

Page 16: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Ejemplo de código

context = new Context("DemoContext", new CredentialsCollector() { public UsernamePasswordCredentials getBasicAuthenticationCredentials (String aeID, Hashtable properties) { // Provide or retrieve authentication credentials here. // For example, you could display a dialog box to ask your user // to enter a username and password, then return them from // this method. return new UsernamePasswordCredentials("username", "password"); }});

Guía de desarrollo Enviar información de inicio de sesión a un servidor HTTP

14

Page 17: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Transportes de red 3

Arquitectura: transportes de redUn dispositivo BlackBerry® puede conectarse a una red inalámbrica mediante transportes diferentes. No todos losdispositivos tienen acceso a todos los transportes. Por ejemplo, el transporte BlackBerry® Mobile Data Systemestásólo disponible para dispositivos registrados con un BlackBerry® Enterprise Server.

Guía de desarrollo Transportes de red

15

Page 18: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Transporte de red Descripción

TCP Wi-Fi® El transporte Wi-Fi crea una conexión a Internet o a redes privadas comouna doméstica o la de una empresa. Cuando la radio Wi-Fi se enciende, unusuario de dispositivo BlackBerry o una aplicación pueden configurar eldispositivo para que se conecte a Internet mediante este transporte.

Si procede, el dispositivo puede enviar automáticamente los datos aBlackBerry Enterprise Server o BlackBerry® Internet Service Internet Servicepor una conexión Wi-Fi. Por ejemplo, si el dispositivo se conecta a una redWi-Fi y se configura un perfil VPN para la empresa del usuario, el dispositivointenta conectarse a BlackBerry Enterprise Server por VPN mediante laconexión Wi-Fi porque transmitir datos por Wi-Fi es generalmente menoscaro que otros transportes. Este comportamiento se conoce comoenrutamiento al menor coste.

TCP móvil El transporte TCP móvil crea una conexión a Internet a través del gatewayde Internet de un proveedor de servicios inalámbricos. Este método crea eltipo más directo de conexión que a través de la radio móvil.

La mayoría de los proveedores de servicios inalámbricos configuran eldispositivo BlackBerry de un usuario para utilizar el gateway de Internet delproveedor. Sin embargo, cuando el usuario esta en itinerancia en una reddiferente, debe configurar el dispositivo para utilizar manualmente elgateway de Internet de la red de itinerancia.

Si su aplicación utiliza este transporte, lo debe probar para cada proveedorde servicios inalámbricos que su aplicación podría utilizar.

BlackBerry Internet Service El transporte de BlackBerry Internet Service crea una conexión al Interneta través de BlackBerry® Infrastructure. Los datos que envía y recibemediante este transporte se comprimen y optimizan para la transmisiónpor conexiones inalámbricas.

Las aplicaciones que utilizan el transporte BlackBerry Internet Serviceautomáticamente se benefician de enrutamiento al menor coste. Eldispositivo se conecta con una red Wi-Fi automáticamente, si hay unadisponible.

Nota: Para utilizar el transporte de BlackBerry Internet Service, debesuscribirse a BlackBerry® Push Service. Para obtener más información, visitehttp://na.blackberry.com/eng/developers/javaappdev/pushapi.jsp

BlackBerry MDS El transporte de BlackBerry MDS permite a un dispositivo BlackBerryconectarse al BlackBerry Enterprise Server asociado mediante BlackBerryInfrastructure o una conexión Wi-Fi.

Guía de desarrollo Arquitectura: transportes de red

16

Page 19: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Transporte de red Descripción

Para obtener más información, consulte "Utilizar BlackBerry EnterpriseServer como gateway de intranet".

WAP El transporte WAP crea una conexión a través del gateway AP de unproveedor de servicios inalámbricos. Son compatibles WAP 1.0, 1.2 y 2.0.

Para admitir este transporte, un usuario o el proveedor de serviciosinalámbricos deben configurar los parámetros de la conexión WAP en eldispositivo. Como resultado, puede que este transporte no lo admitan todaslas redes inalámbricas ni todos los planes de datos.

Si su aplicación utiliza este transporte, lo debe probar para cada proveedorde servicios inalámbricos que su aplicación podría utilizar. Para obtener másinformación, consulte "Uso de la gateway a Internet del proveedor deservicios inalámbricos".

Para utilizar WAP 2.0, deberá recuperar el identificador de conexión dellibro de servicios. Para obtener más información acerca de la recuperaciónde un identificador de conexión, consulte el artículo de la base deconocimientos en http://supportforums.blackberry.com/t5/Java-Development/What-Is-Network-API-alternative-for-legacy-OS/ta-p/614822

Utilizar BlackBerry Enterprise Server como gateway deintranetLas empresas alojan BlackBerry® Enterprise Server trás sus firewall para permitir que los usuarios de dispositivosBlackBerry accedan a la intranet de la empresa. El componente BlackBerry® Mobile Data System de BlackBerryEnterprise Server incluye BlackBerry® MDS Services, que proporciona un servicio de proxy HTTP y TCP/IP para permitirque las aplicaciones Java® de terceros lo utilicen como gateway altamente seguro para administrar conexiones HTTPy TCP/IP a la intranet. Si utiliza BlackBerry Enterprise Server como gateway de intranet, todo el tráfico entre laaplicación y BlackBerry Enterprise Server se cifra automáticamente utilizando el cifrado AES o Triple DES. Puesto queBlackBerry Enterprise Server se encuentra tras el firewall de la empresa y ofrece un cifrado de datos inherente, lasaplicaciones se pueden comunicar con servidores de la aplicación y con servidores Web que se ubican en la intranetde la empresa.

Si su aplicación se conecta a Internet y no a la intranet de la empresa, quizás pueda utilizar el BlackBerry EnterpriseServer al que se asocia el dispositivo como gateway. En este caso, las solicitudes de red viajan tras el firewall de laempresa hacia BlackBerry Enterprise Server, que realiza la solicitud de red a Internet a través del firewall de laempresa. Las empresas pueden establecer una política de TI para imponer que BlackBerry Enterprise Server sea elgateway para todo el tráfico de red inalámbrica, incluido el tráfico destinado a Internet.

Guía de desarrollo Utilizar BlackBerry Enterprise Server como gateway de intranet

17

Page 20: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Utilizar el gateway de Internet de un proveedor de serviciosinalámbricosMuchos proveedores de servicios inalámbricos facilitan una gateway a Internet que ofrece conectividad TCP/IPdirecta a Internet. Algunos proveedores de servicios inalámbricos también proporcionan una gateway WAP quepermite que las conexiones HTTP usen el protocolo WAP. BlackBerry® Java® Application puede utilizar cualquiera deestas gateways para conectarse a Internet. Una aplicación BlackBerry® WebWorks™ puede utilizar cualquiera deestas gateways para conectarse a Internet. Si la aplicación es para usuarios de dispositivos BlackBerry que están enuna red inalámbrica específica, la utilización de la gateway a Internet del proveedor de servicios inalámbricos, amenudo, puede ofrecer conexiones rápidas y fiables. Si su aplicación es para usuarios en redes móviles diversas,probar su aplicación con los diferentes gateway de Internet puede resultar complicado. En este caso, debería utilizarel transporte de BlackBerry® Internet Service y utilizar el gateway de Internet del proveedor de servicios inalámbricoscomo una conexión de respaldo para cuando el transporte de BlackBerry Internet Service no esté disponible.

Guía de desarrollo Utilizar el gateway de Internet de un proveedor de servicios inalámbricos

18

Page 21: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Conexiones de red 4BlackBerry® Application Platform ofrece dos API que puede utilizar para crear conexiones a la red manualmente: laAPI de red y el GCF. Las aplicaciones enfocadas a dispositivos BlackBerry® con BlackBerry® Device Software 5.0 yposterior pueden utlizar la API de red. La API de red ofrece una interfaz sencilla para trabajar con los transportes dered y para configurar una amplia gama de parámetros de conexión. Puede utilizar el GCF para crear conexiones a lared en dispositivos que ejecuten versiones anteriores de BlackBerry Device Software. Sin embargo, usar el GCFrequiere conocer más API de BlackBerry® para descubrir los transportes disponibles y cómo configurarlos.

Sea cual sea la API elegida, el proceso de crear una conexión de red es semejante. Primero, abra una conexión dered, a continuación, lea y escriba datos medainte esa conexión y, por último, cierre la conexión. Antes de abrir unaconexión, normalmente especificará un transporte, un protocolo y un punto final. Puede conectarse a recursos dered mediante una gran variedad de protocolos. Sin embargo, sepa que no todos los transportes admiten todos losprotocolos. Por ejemplo, WAP 1.0 y 1.1 sólo admiten HTTP sobre WAP y HTTPS sobre WAP o WTLS. BlackBerryApplication Platform admite los protocolos siguientes:

• HTTP• HTTPS• socket• TLS• SSL• UDP (Datagrama)

El protocolo y el punto final los determina su aplicación, pero el transporte lo determina el entorno operativo de sususuarios. Puede que necesite probar más de un transporte antes de poder hacer una conexión correcta. La tablasiguiente sugiere las órdenes de la preferencia para aplicaciones de empresa y de consumo.

Tipo de usuario Orden de transportes preferidos

Empresa 1. BlackBerry® Mobile Data System

2. TCP Wi-Fi®

3. WAP 2.0

4. BlackBerry® Internet Service

5. TCP móvil

6. WAP 1.0 o 1.1Consumidor 1. TCP Wi-Fi

2. WAP 2.0

3. BlackBerry Internet Service

4. BlackBerry MDS

5. TCP móvil

6. WAP 1.0 o 1.1

Guía de desarrollo Conexiones de red

19

Page 22: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Después de abrir una conexión, recibe un objeto de Connection que representa su conexión. El paquete dejavax.microedition.io contiene varias interfaces que puede utilizar para manipular un objeto de Connection.

Interfaz Descripción

HttpConnection Esta interfaz ofrece métodos para establecer el método de solicitud HTTP(GET, POST, etcétera) y los encabezados, y enviar y recibir datos por laconexión.

HttpsConnection Esta interfaz incluye todos los métodos en la interfaz de HttpConnectiony añade getSecurityInfo(), que devuelve el certificado suministradopor el servidor Web.

SocketConnection Esta interfaz expone los métodos de envío de datos a y recibe los datos deun host de la red mediante una conexión de socket.

SecureConnection Esta interfaz ofrece métodos para crear conexiones de socket TLS y SSL. Estainterfaz incluye todos los métodos en la interfaz de SocketConnection yañade getSecurityInfo(), que devuelve información de seguridadsobre la conexión.

UDPDatagramConnection Esta interfaz ofrece métodos para recuperar información sobre la conexióny crear objetos de datagrama nuevos.

InputConnection,OutputConnection

Estas interfaces ofrecen acceso a las secuencias de datos de entrada y desalida de una conexión.

Cuando esté listo para utilizar su conexión, lance el objeto de Connection según el protocolo que usó para abrir laconexión. Necesitará las interfaces del InputConnection y el OutputConnection del paquetejavax.microedition.io para acceder a las funciones de envío y recepción del objeto de Connection. Esasinterfaces exponen las secuencias de datos de entrada y de salida del objeto de Connection. Para obtener másinformación acerca de cómo enviar los datos mediante la conexión, consulte las clases de InputStream yOutputStream en la referencia de API para BlackBerry® Java® SDK.

API de redLa API de red se implementa en el net.rim.device.api.io.transport y en los paquetes denet.rim.device.api.io.transport.options . La mayoría de las funciones la proporciona elConnectionFactory y las clases de TransportInfo . Un objeto de ConnectionFactory devuelve un objetode ConnectionDescriptor que contiene un objeto de Connection y la información sobre el transporte a travésdel cual se abrió la conexión.

Elegir transportes de red mediante la API de redEn la API de red, la clase de TransportInfo ofrece información sobre los transportes de red disponibles en undispositivo BlackBerry®. Puede obtener una lista de los transportes que tienen actualmente cobertura, o utilizar laAPI para determinar si un transporte particular está disponible y tiene cobertura.

Guía de desarrollo API de red

20

Page 23: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Si no proporciona una lista ordenada de transportes preferidos cuando abre una conexión, la API de red elige untransporte por usted. Sin embargo, debe priorizar los transportes que su aplicación utilice según el tipo de usuarioobjetivo de la misma. La API recorre una serie de tipos de transporte que establezca usted medianteConnectionFactory.setPreferredTransportTypes().

Después que enumere sus transportes preferidos, debe establecer las opciones para cualquier transporte querequiere unas específicas. Por ejemplo, los transportes WAP 1.0 y 1.1 requieren información sobre un APN, laautenticación de gateway, etcétera. Para obtener más información, consulte "Opciones de transporte de red".

También debe crear un objeto de CoverageStatusListener (en el paquete denet.rim.device.api.io.transport), y registrarlo mediante TransportInfo.addListener(). El dispositivoenvía notificaciones a su aplicación acerca de los cambios en el estado de la cobertura para que su aplicación puedaresponder de forma adecuada.

Abrir una conexión de red mediante la API de redDespués de decidir qué transportes de red utilizar, puede abrir una conexión y utilizarla para enviar y recibir datos.El objeto de ConnectionFactory es el responsable de abrir conexiones. Además de sus transportes preferidos,puede utilizar el ConnectionFactory para configurar opciones de conexión como:• Número máximo de intentos de conexión.• Tiempo máximo invertido en intentos de conexión.• Demora entre intentos de conexión.• Tener en cuenta o no si se requiere cifrado entre los puntos de fin de la conexión.

Cuando estés listo para abrir una conexión, debe invocar uno de los métodos deConnectionFactory.getConnection(). Asegúrese de que llama a getConnection() en un subprocesodistinto del de evento principal. Para obtener más información acerca de cómo crear un subproceso, consulte la clasede Thread en la referencia de la API para BlackBerry® Java® SDK.

Cuando abra una conexión correctamente, ConnectionFactory devuelve un objeto deConnectionDescriptor. El ConnectionDescriptor contiene un objeto de Connection y la información sobreel transporte que se utilizó para abrir la conexión.

Para obtener más información, consulte "Abrir una conexión de red mediante la API de red" y "Enviar y recibir datosmediante una conexión de red".

Abrir una conexión de red mediante la API de red

PRECAUCIÓN: El método de ConnectionFactory.getConnection() bloquea la ejecución del subproceso. Debecrear un subproceso separado para llamar a getConnection().

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.io.transport.*;import net.rim.device.api.io.transport.options.*;import net.rim.device.api.io.transport.TransportInfo;import net.rim.device.api.ui.UiApplication;

2. Cree una lista ordenada de transportes preferidos.

Guía de desarrollo API de red

21

Page 24: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

int[] intTransports ={ TransportInfo.TRANSPORT_TCP_WIFI, TransportInfo.TRANSPORT_WAP2, TransportInfo.TRANSPORT_TCP_CELLULAR}

3. Configure las opciones para el transporte TCP móvil si se aplica.

TcpCellularOptions tcpOptions = new TcpCellularOptions();if(!TcpCellularOptions.isDefaultAPNSet()){ tcpOptions.setApn("My APN"); tcpOptions.setTunnelAuthUsername("user"); tcpOptions.setTunnelAuthPassword("password");}

4. Cree un objeto de ConnectionFactory.

ConnectionFactory factory = new ConnectionFactory();

5. Configure cualquier otra opción de ConnectionFactory aplicable a su aplicación. En este caso, TCP móvil esuno de los transportes preferidos, así que configrue las opciones de transporte TCP móvil.

factory.setTransportTypeOptions(TransportInfo.TRANSPORT_TCP_CELLULAR, tcpOptions);factory.setAttemptsLimit(5);

6. Cree un subproceso para recuperar la conexión. Si logró establecer la conexión, a continuaciónConnectionFactory devuelve un objeto de ConnectionDescriptor que puede utilizar. En este paso, paseel objeto de ConnectionDescriptor método (displayContent()) que será responsable de mostrar elcontenido.

Thread t = new Thread(new Runnable(){ public void run() { ConnectionDescriptor cd = _factory.getConnection ("http://www.blackberry.com"); if(cd != null) { Connection c = cd.getConnection(); displayContent(c); } }});t.start();

7. Implemente displayContent(). En este caso, envíe una pantalla que utilice un parámetro de Connectionpara recuperar y mostrar el contenido, después de que el subproceso de recuperación de la conexión finalice.

private void displayContent(final Connection conn) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(conn));

Guía de desarrollo API de red

22

Page 25: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

} });}

Después de terminar: Para obtener más información acerca cómo usar una conexión e implementar la clase deHTTPOutputScreen, consulte "Enviar y recibir datos mediante una conexión de red".

Para ver una muestra de código completo, consulte "Muestra de código: recuperar una página Web mediante la APIde red".

Marco genérico de conexión (GCF)Si desarrolla aplicaciones para usuarios de dispositivos BlackBerry® que ejecutan BlackBerry® Device Software 4.7 oanterior, debe utilizar el GCF para abrir una conexión de red. Sin embargo, cualquier código que escriba y use el GCFtambién funciona en versiones posteriores de BlackBerry® Device Software. El GCF se implementado en la clase dejavax.microedition.io.Connector. Puede llamar a Connector.open() para crear cualquier tipo de conexiónadmitido. El método de open() acepta cadenas de conexión que especifiquen el tipo de conexión que quiere realizar,el punto final y los detalles opcionales de configuración para la conexión.

La cadena de conexión que usa el GCF se compone de partes:

<scheme> : <hierarchical location information> ; <additional information>

<scheme> indica el protocolo que se utilizará para establecer la conexión. <hierarchical location information> describeel punto final para la conexión. Por último, <additional information> controla el transporte utilizado y proporcionalos detalles de autenticación para un servidor proxy si son necesarios. Para obtener más información acerca de lasopciones de transporte, consulte "Opciones de transporte de red".

Por ejemplo, en la muestra de código siguiente, la cadena de conexión especifica el protocolo HTTP y utiliza unnombre de host para indicar el punto final de la conexión. El parámetro interface=wifi se incluye para especificarque la radio Wi-Fi® debe utilizarse para establecer la conexión.

HTTPConnection c = (HTTPConnection)Connector.open("http://example.com;interface=wifi");

Abrir una conexión de red mediante el GCFLa tarea siguiente le muestra cómo abrir una conexión HTTP mediante el transporte BlackBerry® Mobile Data System.Puede utilizar un proceso semejante para abrir una conexión mediante otros protocolos y transportes.PRECAUCIÓN: El método de Connector.open() no es seguro en subprocesos. Asegúrese de que llama a open()en un subproceso distinto del de evento principal.

Antes de comenzar: Aségurese de que el transporte que quiere utilizar está disponible y tiene cobertura.

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.ui.UiApplication;import java.io.IOException;import javax.microedition.io.*;

Guía de desarrollo Marco genérico de conexión (GCF)

23

Page 26: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

2. Cree un subproceso nuevo para abrir la conexión.

Thread t = new Thread(new Runnable(){ public void run() {

3. Cree una variable local para su objeto de Connection.

Connection conn = null;

4. Invoque open(). Especifique la cadena de conexión.

try { conn = Connector.open("http://www.blackberry.com;deviceside=false"); } catch (IOException e) { // Process your error condition }

5. Si logró establecer la conexión, a continuación open() devuelve un objeto de Connection que puede utilizar.Pase el objeto de conexión a otro método (displayContent()) que será responsable de mostrar el contenido.

if (conn != null) { displayContent(conn); } }});

6. Inicie su subproceso.

t.start();

7. Implemente displayContent(). En este caso, envíe una pantalla que utilice un parámetro de Connectionpara recuperar y mostrar el contenido, después de que el subproceso de recuperación de la conexión finalice.

private void displayContent(final Connection conn) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(conn)); } });}

Después de terminar: Para obtener más información acerca cómo usar una conexión e implementar la clase deHTTPOutputScreen, consulte "Enviar y recibir datos mediante una conexión de red".

Para ver una muestra de código completo, consulte "Muestra de código: recuperar una página Web mediante el GCF".

Guía de desarrollo Marco genérico de conexión (GCF)

24

Page 27: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Enviar y recibir datos mediante una conexión de redLa tarea siguiente le muestra cómo enviar y recibir datos mediante una conexión HTTP con un sitio Web. Los datosdevueltos del sitio Web se muestran en la pantalla. Puede utilizar un proceso semejante para enviar y recibir losdatos mediante otros protocolos de red. Para hacer esta tarea tan general como sea posible, el código siguienteenvía un comando HTTP GET manualmente a un servidor. Normalmente, utilizaría una interfaz deHttpConnection, que construye la cadena del comando HTTP según las opciones que configure.PRECAUCIÓN: Las operaciones de entrada y salida de red no son seguras para subprocesos. Aségurese de que creaun subproceso separado cuando utilice un objeto de Connection.

Antes de comenzar: Abra una conexión de red y pase un objeto de Connection al constructor de la clase desarrolladaen esta tarea. Para obtener más información acerca de cómo abrir conexiones a la red, consulte "Abrir una conexiónde red mediante la API de red" o "Abrir una conexión de red mediante el GCF".

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.ui.container.MainScreen;import net.rim.device.api.ui.component.RichTextField;import net.rim.device.api.ui.UiApplication;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import javax.microedition.io.*;

2. Cree una clase que amplíe la clase MainScreen.

public class HTTPOutputScreen extends MainScreen {

3. Cree una variable de la instancia para un objeto de RichTextField para mostrar los resultados.

RichTextField _rtfOutput = new RichTextField();

4. Cree a un constructor que acepte un objeto de Connection como argumento.

public HTTPOutputScreen(Connection conn){

5. Añada el RichTextField a su pantalla, e inicie un subproceso para acceder a la conexión de red.

_rtfOutput.setText("Retrieving data. Please wait...");add(_rtfOutput);ContentReaderThread t = new ContentReaderThread(conn);t.start();

6. Cree un método para rellenar su RichTextField con los datos que devuelve el sitio Web, después de queContentReaderThread se complete. Se invoca este método en el paso 20.

public void showContents(final String result) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { _rtfOutput.setText(result);

Guía de desarrollo Enviar y recibir datos mediante una conexión de red

25

Page 28: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

} });}

7. En una clase interna, cree un subproceso para que se comunique con el servidor Web. Acepte un objeto deConnectionDescriptor como argumento.

private final class ContentReaderThread extends Thread{ private Connection _connection; ContentReaderThread(Connection conn) { _connection = conn; } public void run() {

8. Inicialice un objeto de OutputStream y un objeto de InputStream para intercambiar los datos con el sitioWeb.

OutputStream os = null; InputStream is = null;

9. Inicialice un objeto de String para almacenar la respuesta del sitio Web.

String result = "";

10. Cree un objeto de OutputConnection para enviar los datos por su conexión.

try { OutputConnection outputConn = (OutputConnection) connection;

11. Recupere un OutputStream de su OutputConnection.

os = outputConn.openOutputStream(); String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n"; os.write(getCommand.getBytes()); os.flush();

12. Envíe un comando HTTP GET al servidor Web sobre su OutputStream. Convierta el comando GET en una matrizde byte.

String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n"; os.write(getCommand.getBytes()); os.flush();

13. Cree un objeto de InputConnection para recibir los datos de su conexión.

InputConnection inputConn = (InputConnection) connection;

14. Recupere un InputStream de su InputConnection.

is = inputConn.openInputStream();

15. Recupere los datos transferidos y almacénelos en una matriz de byte.

Guía de desarrollo Enviar y recibir datos mediante una conexión de red

26

Page 29: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is); result = new String(data);

16. Revise cualquier error que pueda generar su procedimiento.

catch(Exception e) { result = "ERROR fetching content: " + e.toString(); }

17. Cierre su OutputStream.

if(os != null) { try { os.close(); } catch(IOException e) { // process the error condition } }

18. Cierre su InputStream.

if(is != null) { try { is.close(); } catch(IOException e) { } }

19. Cierre su Connection.

{ connection.close(); } catch(IOException ioe) { } }

20. Llame al showContents() que creó en el paso 6.

showContents(result);}}

Guía de desarrollo Enviar y recibir datos mediante una conexión de red

27

Page 30: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Opciones de transporte de red

Transporte Información adicional

TCP móvil Cuando crea una conexión mediante transporte TCP móvil, puede que necesiteespecificar los parámetros siguientes:

• APN• Nombre de usuario de autorización de túnel• Contraseña de autorización de túnel

Si es mediante la API de red, puede utilizar la clase de TCPCellularOptionspara configurar estas opciones. Para dispositivos BlackBerry® ® que ejecutanBlackBerry® 6 y posterior, puede determinar si estas opciones ya estánestablecidas invocando TCPCellularOptions.isDefaultAPNSet().

Si está usando el GCF, podría utilizar una cadena de conexión semejante a lasiguiente:

"http://www.blackberry.com;deviceside=true;apn=carriergateway;[email protected];TunnelAuthPassword=CARRIER"

TCP Wi-Fi® Si está usando el GCF, puede utilizar el transporte Wi-Fi® con una cadena deconexión semejante a la siguiente:

"http://www.blackberry.com;interface=wifi"WAP 2.0 Si WAP 2.0 está configurado en un dispositivo, necesita obtener un identificador

de conexión del libro de servicios. Si está usando el GCF, podría utilizar una cadenade conexión semejante a la siguiente:

"http://www.blackberry.com;deviceside=true;ConnectionUID=H6Q1234"

Para obtener más información acerca de cómo recuperar un identificador deconexión, consulte el artículo de la base de conocimientos en http://supportforums.blackberry.com/t5/Java-Development/What-Is-Network-API-alternative-for-legacy-OS/ta-p/614822

WAP 1.0 y 1.1 Como con TCP móvil, puede que necesite especificar parámetros adicionales parautilizar el gateway de WAP 1.0 o 1.1:

• Gateway APN• Dirección IP de gateway• Puerto de gateway• Dirección IP de origen• Puerto de origen• Nombre de usuario de autorización de túnel

Guía de desarrollo Opciones de transporte de red

28

Page 31: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Transporte Información adicional

• Contraseña de autorización de túnel• Activar WTLS

Si está usando la API de red, puede utilizar la clase de WapOptions para configurarestas opciones.

Si está usando el GCF, podría utilizar una cadena de conexión semejante a lasiguiente:

“http://www.blackberry.com;deviceside=true;WapGatewayIP=127.0.0.1;WapGatewayPort:9201; WapGatewayAPN =carriergateway"

BlackBerry® Mobile DataSystem

Si está usando el GCF, puede utilizar el transporte de BlackBerry MDS con unacadena de conexión semejante a la siguiente:

"http://www.blackberry.com;deviceside=false"BlackBerry® Internet Service Para utilizar el transporte de BlackBerry Internet Service, debe suscribirse a

BlackBerry® Push Service. Para obtener más información, visite http://na.blackberry.com/eng/developers/javaappdev/pushapi.jsp

Guía de desarrollo Opciones de transporte de red

29

Page 32: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Trabajar con radios 5Es posible que haya los casos en los que deba encender una radio en un dispositivo BlackBerry® para utilizar untransporte de red específico. Por ejemplo, puede que quiera que su aplicación para dispositivos BlackBerry se conectea través de Wi-Fi® hacer un uso eficaz del ancho de banda. O puede que quiera comparar el rendimiento de suaplicación cuando utilice tecnologías inalámbricas diferentes.

Puede utilizar la clase de net.rim.device.api.system.RadioInfo para reunir información sobre lastecnologías inalámbricas disponibles en un dispositivo. Mediante la clase de rim.device.api.system.Radio,puede administrar las radios del dispositivo. También debe implementar la interfaz denet.rim.device.api.system.RadioStatusListener para recibir notificaciones acerca de cambios en elestado de la radio.

Las tecnologías inalámbricas disponibles en los dispositivos BlackBerry se agrupan en tres familias de accesoinalámbrico.

Familia de acceso inalámbrico Descripción

3GPP® Esta familia incluye GPRS, EDGE, UMTS®, GERAN, UTRAN y GAN.CDMA Esta familia incluye CDMA2000® y EVDO.WLAN Esta familia incluye IEEE® 802.11 ™, 802.11a, 802.11b y 802.11g.

Consultar la disponibilidad de la radio y cambiar su estadoPuede utilizar el RadioInfo y las clases de Radio para determinar si se admite una tecnología particular de radioen un dispositivo BlackBerry® y para encender o apagar la radio. Para obtener más información, consulte ladocumentación sobre API para BlackBerry® Java® SDK.

1. Importe las clases y las interfaces necesarias.

import net.rim.device.api.system.Radio;import net.rim.device.api.system.RadioInfo;

2. Recupere un campo de bits de familias de acceso inalámbrico admitidas.

int intSupportedWAFs = RadioInfo.getSupportedWAFs();

3. Compruebe si la familia de acceso inalámbrico que quiere utilizar está disponible en el dispositivo. Realice unorden de bits Y una operación que combine el campo de bits de intSupportedWAFs y la constante para lafamilia de acceso inalámbrico que quiere utilizar. Si la familia está disponible, el resultado será distinto a cero.

if ((intSupportedWAFs & RadioInfo.WAF_WLAN) !=0 ){

4. Recupere un campo de bits de radios disponibles.

int intSupportedWAFs = RadioInfo.getSupportedWAFs();

int intActiveWAFs = RadioInfo.getActiveWAFs();

Guía de desarrollo Trabajar con radios

30

Page 33: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

5. Compruebe si la radio que quiere utilizar está desactivada. Si lo está, se aplican un orden de bits Y una operacióna intActiveWAFs y la constante para la radio devuelve 0.

if ((intActiveWAFs & RadioInfo.WAF_WLAN) = 0) {

6. Si la radio está desactivada, actívela.

Radio.activateWAFs(RadioInfo.WAF_WLAN); }}

Guía de desarrollo Consultar la disponibilidad de la radio y cambiar su estado

31

Page 34: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Ejemplos de código 6

Muestra de código: solicitar datos mediante un objetoBlockingSenderDestinationimport net.rim.device.api.io.messaging.*;import net.rim.device.api.io.URI;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;import java.io.*;public class NetworkSample extends UiApplication { public static void main(String[] args) { NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { pushScreen(new BlockingSenderSample()); }}class BlockingSenderSample extends MainScreen implements FieldChangeListener{ ButtonField _btnBlock = new ButtonField(Field.FIELD_HCENTER); private static UiApplication _app = UiApplication.getUiApplication(); private String _result; public BlockingSenderSample() { _btnBlock.setChangeListener(this); _btnBlock.setLabel("Fetch page"); add(_btnBlock); } public void fieldChanged(Field button, int unused) { if(button == _btnBlock) { Thread t = new Thread(new Runnable() { public void run() { Message response = null; String uriStr = "http://www.blackberry.com"; BlockingSenderDestination bsd = null; try { bsd = (BlockingSenderDestination) DestinationFactory.getSenderDestination ("CommAPISample", URI.create(uriStr)); if(bsd == null) { bsd =

Guía de desarrollo Ejemplos de código

32

Page 35: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

DestinationFactory.createBlockingSenderDestination (new Context("CommAPISample"), URI.create(uriStr) ); } // Send message and wait for response response = bsd.sendReceive(); if(response != null) { BSDResponse(response); } } catch(Exception e) { // process the error } finally { if(bsd != null) { bsd.release(); } } } }); t.start(); } } private void BSDResponse(Message msg) { if (msg instanceof ByteMessage) { ByteMessage reply = (ByteMessage) msg; _result = (String) reply.getStringPayload(); } else if(msg instanceof StreamMessage) { StreamMessage reply = (StreamMessage) msg; InputStream is = reply.getStreamPayload(); byte[] data = null; try { data = net.rim.device.api.io.IOUtilities.streamToBytes(is); } catch (IOException e) { // process the error } if(data != null) { _result = new String(data); } } _app.invokeLater(new Runnable() { public void run() { _app.pushScreen(new HTTPOutputScreen(_result)); } }); }}

Guía de desarrollo Muestra de código: solicitar datos mediante un objeto BlockingSenderDestination

33

Page 36: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

class HTTPOutputScreen extends MainScreen { RichTextField _rtfOutput = new RichTextField(); public HTTPOutputScreen(String message) { _rtfOutput.setText("Retrieving data. Please wait..."); add(_rtfOutput); showContents(message); } // After the data has been retrieved, display it public void showContents(final String result) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { _rtfOutput.setText(result); } }); }}

Muestra de código: solicitar datos mediante un objetoNonBlockingSenderDestinationimport net.rim.device.api.io.URI;import net.rim.device.api.io.messaging.*;import net.rim.device.api.ui.*import net.rim.device.api.ui.component.ButtonField;import net.rim.device.api.ui.container.MainScreen;import net.rim.device.api.system.Application;import java.io.*;public class NetworkSample extends UiApplication { public static void main(String[] args) { NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { pushScreen(new NonBlockingSenderSample()); }}class NonBlockingSenderSample extends MainScreen implements FieldChangeListener{ ButtonField _btnNonBlock = new ButtonField(Field.FIELD_HCENTER); private static UiApplication _app = UiApplication.getUiApplication(); public NonBlockingSenderSample() { _btnNonBlock.setChangeListener(this); _btnNonBlock.setLabel("Fetch page");

Guía de desarrollo Muestra de código: solicitar datos mediante un objeto NonBlockingSenderDestination

34

Page 37: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

add(_btnNonBlock); } public void fieldChanged(Field button, int unused) { if(button == _btnNonBlock) { NonBlockingSenderDestination destination = null; try { URI uri = URI.create("http://www.blackberry.com"); NBSDMsgListener responseListener = new NBSDMsgListener(); destination = (NonBlockingSenderDestination) DestinationFactory.getSenderDestination ("CommAPISample", uri); if (destination == null) { destination = DestinationFactory.createNonBlockingSenderDestination (new Context("CommAPISample"), uri, responseListener); } // Send message to retrieve the response destination.send(); } catch(Exception e) { // process the error } } }}class NBSDMsgListener implements MessageListener { public void onMessage(Destination dest, Message msg) { String payload = null; if (msg instanceof ByteMessage) { ByteMessage reply = (ByteMessage) msg; payload = (String) reply.getStringPayload(); } else if(msg instanceof StreamMessage) { StreamMessage reply = (StreamMessage) msg; InputStream is = reply.getStreamPayload(); byte[] data = null; try { data = net.rim.device.api.io.IOUtilities.streamToBytes(is); } catch (IOException e) { } if(data != null) { payload = new String(data); } } if(payload!=null) { synchronized(Application.getEventLock())

Guía de desarrollo Muestra de código: solicitar datos mediante un objeto NonBlockingSenderDestination

35

Page 38: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

{ UiApplication.getUiApplication().pushScreen (new HTTPOutputScreen(payload)); } } } public void onMessageCancelled(Destination arg0, int arg1) { // process message cancelled notification } public void onMessageFailed(Destination arg0, MessageFailureException arg1) { // process message failed notification }}class HTTPOutputScreen extends MainScreen { RichTextField _rtfOutput = new RichTextField(); public HTTPOutputScreen(String message) { _rtfOutput.setText("Retrieving data. Please wait..."); add(_rtfOutput); showContents(message); } // After the data has been retrieved, display it public void showContents(final String result) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { _rtfOutput.setText(result); } }); }}

Muestra de código: análisis de una estructura de datos deJSONLa muestra de código siguiente muestra una forma de analizar una estructura de datos de JSON. Puede utilizar unproceso semejante para analizar datos de JSON u otros formatos ofrecidos por la API de procesamiento de mensajes.

import net.rim.device.api.io.URI;import net.rim.device.api.io.messaging.*;import net.rim.device.api.ui.*import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;import java.io.*;import org.json.me.*;public class NetworkSample extends UiApplication { public static void main(String[] args) {

Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON

36

Page 39: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { pushScreen(new ParseJSONSample()); }}class ParseJSONSample extends MainScreen implements FieldChangeListener{ ButtonField _btnJSON = new ButtonField(Field.FIELD_HCENTER); private static UiApplication _app = UiApplication.getUiApplication(); public ParseJSONSample() { _btnJSON.setChangeListener(this); _btnJSON.setLabel("Fetch page"); add(_btnJSON); } public void fieldChanged(Field button, int unused) { if(button == _btnJSON) { Thread t = new Thread(new Runnable() { public void run() { Message response = null; String uriStr = "http://docs.blackberry.com/sampledata.json"; BlockingSenderDestination bsd = null; try { bsd = (BlockingSenderDestination) DestinationFactory.getSenderDestination ("CommAPISample", URI.create(uriStr)); if(bsd == null) { bsd = DestinationFactory.createBlockingSenderDestination (new Context("CommAPISample"), URI.create(uriStr), new JSONMessageProcessor() ); } // Send message and wait for response response = bsd.sendReceive(); _json = response.getObjectPayload(); if(_json != null) { _app.invokeLater(new Runnable() { public void run() { _app.pushScreen(new JSONOutputScreen(_json)); } }); } }

Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON

37

Page 40: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

catch(Exception e) { System.out.println(e.toString()); } finally { if(bsd != null) { bsd.release(); } } } }); t.start(); }}class JSONOutputScreen extends MainScreen implements TreeFieldCallback { private TreeField _treeField; public JSONOutputScreen(Object JSONData) { _treeField = new TreeField(this, Field.FOCUSABLE); add(_treeField); setTree(JSONData); } void setTree(Object obj) { int parentNode = 0; _treeField.deleteAll(); try { if(obj instanceof JSONArray) { parentNode = populateTreeArray (_treeField, (JSONArray) obj, parentNode); } else if(obj instanceof JSONObject) { parentNode = populateTreeObject (_treeField, (JSONObject) obj, parentNode); } } catch(JSONException e) { System.out.println(e.toString()); } _treeField.setCurrentNode(parentNode); } // Populate the trees with JSON arrays int populateTreeArray(TreeField tree, JSONArray o, int p) throws JSONException { Object temp; int newParent; newParent = tree.addChildNode(p, "Array " + p); for(int i = 0; i < o.length(); ++i) {

Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON

38

Page 41: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

temp = o.get(i); if(temp == null || temp.toString().equalsIgnoreCase("null")) { continue; } if(temp instanceof JSONArray) { // Array of arrays populateTreeArray(tree, (JSONArray) temp, newParent); } else if(temp instanceof JSONObject) { // Array of objects populateTreeObject(tree, (JSONObject) temp, newParent); } else { // other values newParent = tree.addSiblingNode(newParent, temp.toString()); } } return newParent; } // Populate the tree with JSON objects int populateTreeObject(TreeField tree, JSONObject o, int p) throws JSONException { Object temp; int newParent = tree.addChildNode(p, "Object" + p); JSONArray a = o.names(); for(int i = 0; i < a.length(); ++i) { temp = o.get(a.getString(i)); if(temp == null || temp.toString().equalsIgnoreCase("null")) { continue; } if(temp instanceof JSONArray) { populateTreeArray(tree, (JSONArray) temp, newParent); } else if(temp instanceof JSONObject) { populateTreeObject(tree, (JSONObject) temp, newParent); } else { tree.addSiblingNode (newParent, a.getString(i) + ": " + temp.toString()); } } return newParent; } public void drawTreeItem(TreeField treeField, Graphics graphics, int node, int y, int width, int indent) { if(treeField == _treeField) {

Guía de desarrollo Muestra de código: análisis de una estructura de datos de JSON

39

Page 42: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Object cookie = _treeField.getCookie(node); if(cookie instanceof String) { String text = (String) cookie; graphics.drawText(text, indent, y, Graphics.ELLIPSIS, width); } } } public boolean onSavePrompt() { // Suppress the save dialog return true; }}

Muestra de código: recuperar una página Web mediante elAPI de redPara hacer esta muestra de código tan genérica como sea posible, se usan las interfaces de InputConnection yOutputConnection en lugar de la de HttpConnection.

import net.rim.device.api.io.transport.*;import net.rim.device.api.io.transport.options.*;import net.rim.device.api.ui.component.RichTextField;import net.rim.device.api.ui.container.MainScreen;import net.rim.device.api.ui.UiApplication;import net.rim.device.api.util.Arrays;import java.io.*;import javax.microedition.io.*;public class NetworkSample extends UiApplication { public static void main(String[] args) { NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { new HTTPConnectionSetup(); }}class HTTPConnectionSetup { ConnectionFactory _factory = new ConnectionFactory(); public HTTPConnectionSetup() { // Create preference ordered list of transports int[] _intTransports = { TransportInfo.TRANSPORT_TCP_WIFI, TransportInfo.TRANSPORT_WAP2, TransportInfo.TRANSPORT_TCP_CELLULAR }; // Remove any transports that are not (currently) available

Guía de desarrollo Muestra de código: recuperar una página Web mediante el API de red

40

Page 43: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

for(int i = 0; i < _intTransports.length ; i++) { int transport = _intTransports[i]; if(!TransportInfo.isTransportTypeAvailable(transport) || !TransportInfo.hasSufficientCoverage(transport)) { Arrays.removeAt(_intTransports, i); } } // Set options for TCP Cellular transport TcpCellularOptions tcpOptions = new TcpCellularOptions(); if(!TcpCellularOptions.isDefaultAPNSet()) { tcpOptions.setApn("My APN"); tcpOptions.setTunnelAuthUsername("user"); tcpOptions.setTunnelAuthPassword("password"); } // Set ConnectionFactory options if(_intTransports.length > 0) { _factory.setPreferredTransportTypes(_intTransports); } _factory.setTransportTypeOptions(TransportInfo.TRANSPORT_TCP_CELLULAR, tcpOptions); _factory.setAttemptsLimit(5); // Open a connection on a new thread Thread t = new Thread(new Runnable() { public void run() { ConnectionDescriptor cd = _factory.getConnection ("http://www.blackberry.com"); // If connection was successful, fetch and show the content from // the web server if(cd != null) { Connection c = cd.getConnection(); displayContent(c); } } }); t.start(); } private void displayContent(final Connection conn) { // When the connection thread completes, show the data from the web server UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(conn)); } }); }}class HTTPOutputScreen extends MainScreen

Guía de desarrollo Muestra de código: recuperar una página Web mediante el API de red

41

Page 44: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

{ RichTextField _rtfOutput = new RichTextField(); public HTTPOutputScreen(Connection conn) { // Create a container for the data, and put it on the screen _rtfOutput.setText("Retrieving data. Please wait..."); add(_rtfOutput); // Retrieve the data from the web server, using the connection, on a // separate thread ContentReaderThread t = new ContentReaderThread(conn); t.start(); } // After the data has been retrieved, display it public void showContents(final String result) { UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { _rtfOutput.setText(result); } }); } private final class ContentReaderThread extends Thread { private Connection _connection; ContentReaderThread(Connection conn) { _connection = conn; } public void run() { String result = ""; OutputStream os = null; InputStream is = null; try { // Send HTTP GET to the server OutputConnection outputConn = (OutputConnection) _connection; os = outputConn.openOutputStream(); String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n"; os.write(getCommand.getBytes()); os.flush(); // Get InputConnection and read the server's response InputConnection inputConn = (InputConnection) _connection; is = inputConn.openInputStream(); byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is); result = new String(data); // is.close(); } catch(Exception e) { result = "ERROR fetching content: " + e.toString(); } finally {

Guía de desarrollo Muestra de código: recuperar una página Web mediante el API de red

42

Page 45: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

// Close OutputStream if(os != null) { try { os.close(); } catch(IOException e) { } } // Close InputStream if(is != null) { try { is.close(); } catch(IOException e) { } } // Close Connection try { _connection.close(); } catch(IOException ioe) { } } // Show the response received from the web server, or an error message showContents(result); } }}

Muestra de código: recuperar una página Web mediante elGCFEsta muestra de código utiliza el transporte BlackBerry® Mobile Data System. Para hacer esta muestra de código tangenérica como sea posible, se usan las interfaces de InputConnection y OutputConnection en lugar de la deHttpConnection.

import net.rim.device.api.ui.component.RichTextField;import net.rim.device.api.ui.container.MainScreen;import net.rim.device.api.ui.UiApplication;import java.io.*;import javax.microedition.io.*;public class NetworkSample extends UiApplication { public static void main(String[] args)

Guía de desarrollo Muestra de código: recuperar una página Web mediante el GCF

43

Page 46: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

{ NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { new HTTPConnectionSetup(); }}class HTTPConnectionSetup { public HTTPConnectionSetup() { Thread t = new Thread(new Runnable() { public void run() { Connection c = null; try { c = Connector.open("http://www.blackberry.com;deviceside=false"); } catch (IOException e) { e.printStackTrace(); } if(c != null) { displayContent(c); } } }); t.start(); } private void displayContent(final Connection c) { // When the connection thread completes, show the data from the web server UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { UiApplication.getUiApplication().pushScreen(new HTTPOutputScreen(c)); } }); }}class HTTPOutputScreen extends MainScreen { RichTextField _rtfOutput = new RichTextField(); public HTTPOutputScreen(Connection conn) { // Create a container for the data, and put it on the screen _rtfOutput.setText("Retrieving data. Please wait..."); add(_rtfOutput); // Retrieve the data from the web server, using the connection, on a // separate thread ContentReaderThread t = new ContentReaderThread(conn); t.start(); } // After the data has been retrieved, display it public void showContents(final String result) {

Guía de desarrollo Muestra de código: recuperar una página Web mediante el GCF

44

Page 47: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

UiApplication.getUiApplication().invokeLater(new Runnable() { public void run() { _rtfOutput.setText(result); } }); } private final class ContentReaderThread extends Thread { private Connection _connection; ContentReaderThread(Connection conn) { _connection = conn; } public void run() { String result = ""; OutputStream os = null; InputStream is = null; try { // Send HTTP GET to the server OutputConnection outputConn = (OutputConnection) _connection; os = outputConn.openOutputStream(); String getCommand = "GET " + "/" + " HTTP/1.0\r\n\r\n"; os.write(getCommand.getBytes()); os.flush(); // Get InputConnection and read the server's response InputConnection inputConn = (InputConnection) _connection; is = inputConn.openInputStream(); byte[] data = net.rim.device.api.io.IOUtilities.streamToBytes(is); result = new String(data); // is.close(); } catch(Exception e) { result = "ERROR fetching content: " + e.toString(); } finally { // Close OutputStream if(os != null) { try { os.close(); } catch(IOException e) { } } // Close InputStream if(is != null) { try

Guía de desarrollo Muestra de código: recuperar una página Web mediante el GCF

45

Page 48: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

{ is.close(); } catch(IOException e) { } } // Close Connection try { _connection.close(); } catch(IOException ioe) { } } // Show the response received from the web server, or an error message showContents(result); } }}

Muestra de código: determinar los transportes de red concobertura suficiente mediante la API de redimport net.rim.device.api.io.transport.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;public class NetworkSample extends UiApplication { public static void main(String[] args) { NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { pushScreen(new ListTransportsWithCoverageScreen()); }}class ListTransportsWithCoverageScreen extends MainScreen{ private int[] _transportsWithCoverage; private TransportDescriptor[] _transports; private RichTextField _rtfDisplay; private ButtonField _btnShowTransports; public ListTransportsWithCoverageScreen() { VerticalFieldManager vfm = new VerticalFieldManager(); setTitle("Network Sample"); _rtfDisplay = new RichTextField ("Click button below to display available transports."); _btnShowTransports = new ButtonField

Guía de desarrollo Muestra de código: determinar los transportes de red con cobertura suficiente mediante la API dered

46

Page 49: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

("Show Transports", Field.FIELD_HCENTER); _btnShowTransports.setChangeListener(new FieldChangeListener() { public void fieldChanged(Field field, int context) { getTransports(); } }); vfm.add(_rtfDisplay); vfm.add(_btnShowTransports); add(vfm); } public void getTransports() { StringBuffer sb = new StringBuffer(); sb.append("The transports currently available are: \n"); _transportsWithCoverage = TransportInfo.getCoverageStatus(); _transports = TransportInfo.getTransportDescriptors (_transportsWithCoverage); for(int i = _transports.length - 1; i >=0; --i) { switch(_transports[i].getTransportType()) { case TransportInfo.TRANSPORT_BIS_B: sb.append("BlackBerry Internet Service\n"); break; case TransportInfo.TRANSPORT_MDS: sb.append("BlackBerry Mobile Data Service\n"); break; case TransportInfo.TRANSPORT_TCP_CELLULAR: sb.append("TCP Cellular\n"); break; case TransportInfo.TRANSPORT_TCP_WIFI: sb.append("TCP WiFi\n"); break; case TransportInfo.TRANSPORT_WAP: sb.append("WAP 1.0 or 1.1\n"); break; case TransportInfo.TRANSPORT_WAP2: sb.append("WAP 2.0\n"); break; } } _rtfDisplay.setText(sb.toString()); }}

Muestra de código: control de radiosimport net.rim.device.api.system.*;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;public class NetworkSample extends UiApplication {

Guía de desarrollo Muestra de código: control de radios

47

Page 50: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

public static void main(String[] args) { NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { pushScreen(new RadioControlScreen()); }}class RadioControlScreen extends MainScreen implements FieldChangeListener { boolean[] _intRadioOn = new boolean[3]; ButtonField _btn3G, _btnCDMA, _btniDEN, _btnWiFi; public RadioControlScreen() { VerticalFieldManager vfm = new VerticalFieldManager(Field.FIELD_HCENTER); int wafs = RadioInfo.getSupportedWAFs(); if ((wafs & RadioInfo.WAF_3GPP) != 0 ) { _btn3G = new ButtonField("3G Radio"); _btn3G.setChangeListener(this); vfm.add(_btn3G); } if ((wafs & RadioInfo.WAF_CDMA) != 0 ) { _btnCDMA = new ButtonField("CDMA Radio"); _btnCDMA.setChangeListener(this); vfm.add(_btnCDMA); } if ((wafs & RadioInfo.WAF_WLAN) != 0 ) { _btnWiFi = new ButtonField("WiFi Radio"); _btnWiFi.setChangeListener(this); vfm.add(_btnWiFi); } wafs = RadioInfo.getActiveWAFs(); if ((wafs & RadioInfo.WAF_3GPP) != 0 ) { _intRadioOn[0] = true; _btn3G.setLabel("3G Radio is on"); } if ((wafs & RadioInfo.WAF_CDMA) != 0 ) { _intRadioOn[1] = true; _btnCDMA.setLabel("CDMA Radio is on"); } if ((wafs & RadioInfo.WAF_WLAN) != 0 ) { _intRadioOn[2] = true; _btnWiFi.setLabel("WiFi Radio is on"); } add(vfm); StandardTitleBar tb = new StandardTitleBar(); tb.addTitle("Radio Control Demo"); tb.addSignalIndicator();

Guía de desarrollo Muestra de código: control de radios

48

Page 51: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

setTitleBar(tb); } public void fieldChanged(Field field, int context) { if (field instanceof ButtonField) { if(field == _btn3G) { if (_intRadioOn[0]) { Radio.deactivateWAFs(RadioInfo.WAF_3GPP); _btn3G.setLabel("3G Radio is off"); _intRadioOn[0] = false; } else { Radio.activateWAFs(RadioInfo.WAF_3GPP); _btn3G.setLabel("3G Radio is on"); _intRadioOn[0] = true; } } else if(field == _btnCDMA) { if (_intRadioOn[1]) { Radio.deactivateWAFs(RadioInfo.WAF_CDMA); _btnCDMA.setLabel("CDMA Radio is off"); _intRadioOn[1] = false; } else { Radio.activateWAFs(RadioInfo.WAF_CDMA); _btnCDMA.setLabel("CDMA Radio is on"); _intRadioOn[1] = true; } } else if(field == _btnWiFi) { if (_intRadioOn[2]) { Radio.deactivateWAFs(RadioInfo.WAF_WLAN); _btnWiFi.setLabel("WiFi Radio is off"); _intRadioOn[2] = false; } else { Radio.activateWAFs(RadioInfo.WAF_WLAN); _btnWiFi.setLabel("WiFi Radio is on"); _intRadioOn[2] = true; } } } }}

Guía de desarrollo Muestra de código: control de radios

49

Page 52: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Muestra de código: determinar el estado de un transportede red mediante la API de redimport net.rim.device.api.io.transport.TransportInfo;import net.rim.device.api.ui.*;import net.rim.device.api.ui.component.*;import net.rim.device.api.ui.container.*;public class NetworkSample extends UiApplication { public static void main(String[] args) { NetworkSample app = new NetworkSample(); app.enterEventDispatcher(); } public NetworkSample() { pushScreen(new ProbeSpecificTransportScreen()); }}class ProbeSpecificTransportScreen extends MainScreen implements FieldChangeListener { private TextField _tfTransportStatus; private ObjectChoiceField _ocfTransports; public ProbeSpecificTransportScreen() { String[] strTransportNames = {"none", "TCP Cellular", "WAP 1.0/1.1", "WAP 2.0", "MDS", "BIS", "TCP WiFi" }; VerticalFieldManager vfm = new VerticalFieldManager(); _tfTransportStatus = new TextField(Field.FIELD_HCENTER); _tfTransportStatus.setText ("Select a transport from the list above, then click 'Probe Transport'"); _ocfTransports = new ObjectChoiceField ("Select Transport to Probe: ", strTransportNames, 0, Field.FIELD_HCENTER); _ocfTransports.setEditable(true); ButtonField btnProbe = new ButtonField("Probe Transport", Field.FIELD_HCENTER); btnProbe.setChangeListener(this); vfm.add(_ocfTransports); vfm.add(btnProbe); vfm.add(_tfTransportStatus); add(vfm); } public void fieldChanged(Field field, int context) { int intTransportType = _ocfTransports.getSelectedIndex(); if(intTransportType > 0) { if(TransportInfo.isTransportTypeAvailable(intTransportType)) { if(TransportInfo.hasSufficientCoverage(intTransportType)) { _tfTransportStatus.setText

Guía de desarrollo Muestra de código: determinar el estado de un transporte de red mediante la API de red

50

Page 53: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

((String)_ocfTransports.getChoice(intTransportType) + " is available."); } else { _tfTransportStatus.setText ((String)_ocfTransports.getChoice(intTransportType) + " is available but has insufficient coverage."); } } else { _tfTransportStatus.setText("Sorry, " + (String)_ocfTransports.getChoice(intTransportType) + " is not available."); } } else { _tfTransportStatus.setText ("Please select a transport first, then click 'Probe Transport'"); } }}

Guía de desarrollo Muestra de código: determinar el estado de un transporte de red mediante la API de red

51

Page 54: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Glosario 73GPP

Third Generation Partnership Project (Proyecto de asociación de tercera generación)

AESAdvanced Encryption Standard (Estándar de cifrado avanzado)

APIApplication Programming Interface (Interfaz de programación de aplicaciones)

APNaccess point name (nombre de punto de acceso)

BlackBerry MDSBlackBerry® Mobile Data System

CDMACode Division Multiple Access (Acceso múltiple por división de códigos)

EDGEEnhanced Data Rates for Global Evolution (Velocidad de datos mejorada para una evolución global)

EVDOEvolution Data Optimized (Datos de evolución optimizada)

GANred de acceso genérico

GERANRed de acceso radio para GSM-EDGE

GCFMarco genérico de conexión (GCF)

GPRSGeneral Packet Radio Service

GSMGlobal System for Mobile Communications® (Sistema global para comunicaciones móviles)

HTTPHypertext Transfer Protocol (Protocolo de transferencia de hipertexto)

Guía de desarrollo Glosario

52

Page 55: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

HTTPSHypertext Transfer Protocol over Secure Sockets Layer (Protocolo de transferencia de hipertexto a través de unnivel de socket seguro)

IPProtocolo de Internet (Internet Protocol)

JSONJavaScript Object Notation (Notación de Objetos de JavaScript)

RDFResource Description Framework (Marco de descripción de recursos)

RSSReally Simple Syndication

SOAPProtocolo de acceso simple a objetos

SSLSecure Sockets Layer (Capa de sockets seguros)

TCPTransmission Control Protocol (Protocolo de control de transmisión)

TLSTransport Layer Security (Seguridad de capa de transporte)

Triple DESTriple Data Encryption Standard (Estándar de cifrado triple de datos)

UDPUser Datagram Protocol (Protocolo del datagrama de usuario)

URIUniform Resource Identifier (Identificador uniforme de recursos)

URLUniform Resource Locator (Localizador uniforme de recursos)

UMTSUniversal Mobile Telecommunications System (Sistema Universal de Telecomunicaciones Móviles)

UTRAN

Guía de desarrollo Glosario

53

Page 56: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Red de acceso radio terrestre para UMTS

VPNVirtual Private Network (Red privada virtual)

WAPWireless Application Protocol (Protocolo de aplicaciones inalámbricas)

WLANwireless local area network (red inalámbrica de área local)

WTLSWireless Transport Layer Security (Seguridad inalámbrica de la capa de transporte)

XMLExtensible Markup Language (Lenguaje de marcado extensible)

Guía de desarrollo Glosario

54

Page 57: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Comentarios 8Para ofrecer comentarios acerca de esta entrega, visite www.blackberry.com/docsfeedback.

Guía de desarrollo Comentarios

55

Page 58: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Historial de revisión del documento 9

Fecha Descripción

8 Noviembre de 2010 Se cambiaron los temas siguientes:• Arquitectura: transportes de red• Comunicar con servidores HTTP• Opciones de transportes de red

27 Septiembre de 2010 Primer borrador publicado.

Guía de desarrollo Historial de revisión del documento

56

Page 59: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

Aviso legal 10©2011 Research In Motion Limited. Reservados todos los derechos. BlackBerry®, RIM®, Research In Motion® y lasmarcas comerciales, nombres y logotipos relacionados son propiedad de Research In Motion Limited y estánregistrados y/o se usan en EE. UU. y en diferentes países del mundo.

3GPP yUMTS son marcas comerciales del European Telecommunications Standard Institute. Java y JavaScript sonmarcas comerciales de Oracle America, Inc. CDMA2000 es una marca comercial de Telecommunications IndustryAssociation. Wi-Fi es una marca comercial de Wi-Fi Alliance.. Todas las demás marcas comerciales son propiedad desus respectivos propietarios.

Esta documentación, incluida cualquier documentación que se incorpore mediante referencia como documentoproporcionado o disponible en www.blackberry.com/go/docs se proporciona o se pone a disposición "TAL CUAL" y"SEGÚN SU DISPONIBILIDAD" sin ninguna condición, responsabilidad o garantía de ningún tipo por Research In MotionLimited y sus empresas afiliadas ("RIM") y RIM no asume ninguna responsabilidad por los errores tipográficos,técnicos o cualquier otra imprecisión, error u omisión contenidos en esta documentación. Con el fin de proteger lainformación confidencial y propia de RIM, así como los secretos comerciales, la presente documentación describealgunos aspectos de la tecnología de RIM en líneas generales. RIM se reserva el derecho a modificar periódicamentela información que contiene esta documentación, si bien tampoco se compromete en modo alguno a proporcionarcambios, actualizaciones, ampliaciones o cualquier otro tipo de información que se pueda agregar a estadocumentación.

Esta documentación puede contener referencias a fuentes de información, hardware o software, productos oservicios, incluidos componentes y contenido como, por ejemplo, el contenido protegido por copyright y/o sitiosWeb de terceros (conjuntamente, los "Productos y servicios de terceros"). RIM no controla ni es responsable deningún tipo de Productos y servicios de terceros, incluido, sin restricciones, el contenido, la exactitud, el cumplimientode copyright, la compatibilidad, el rendimiento, la honradez, la legalidad, la decencia, los vínculos o cualquier otroaspecto de los Productos y servicios de terceros. La inclusión de una referencia a los Productos y servicios de tercerosen esta documentación no implica que RIM se haga responsable de dichos Productos y servicios de terceros o dedichos terceros en modo alguno.

EXCEPTO EN LA MEDIDA EN QUE LO PROHÍBA ESPECÍFICAMENTE LA LEY DE SU JURISDICCIÓN, QUEDAN EXCLUIDASPOR LA PRESENTE TODAS LAS CONDICIONES, APROBACIONES O GARANTÍAS DE CUALQUIER TIPO, EXPLÍCITAS OIMPLÍCITAS, INCLUIDA, SIN NINGÚN TIPO DE LIMITACIÓN, CUALQUIER CONDICIÓN, APROBACIÓN, GARANTÍA,DECLARACIÓN DE GARANTÍA DE DURABILIDAD, IDONEIDAD PARA UN FIN O USO DETERMINADO, COMERCIABILIDAD,CALIDAD COMERCIAL, ESTADO DE NO INFRACCIÓN, CALIDAD SATISFACTORIA O TITULARIDAD, O QUE SE DERIVE DEUNA LEY O COSTUMBRE O UN CURSO DE LAS NEGOCIACIONES O USO DEL COMERCIO, O RELACIONADO CON LADOCUMENTACIÓN O SU USO O RENDIMIENTO O NO RENDIMIENTO DE CUALQUIER SOFTWARE, HARDWARE,SERVICIO O CUALQUIER PRODUCTO O SERVICIO DE TERCEROS MENCIONADOS AQUÍ. TAMBIÉN PODRÍA TENER OTROSDERECHOS QUE VARÍAN SEGÚN EL ESTADO O PROVINCIA. ES POSIBLE QUE ALGUNAS JURISDICCIONES NO PERMITANLA EXCLUSIÓN O LA LIMITACIÓN DE GARANTÍAS IMPLÍCITAS Y CONDICIONES. EN LA MEDIDA EN QUE LO PERMITALA LEY, CUALQUIER GARANTÍA IMPLÍCITA O CONDICIONES EN RELACIÓN CON LA DOCUMENTACIÓN NO SE PUEDENEXCLUIR TAL Y COMO SE HA EXPUESTO ANTERIORMENTE, PERO PUEDEN SER LIMITADAS, Y POR LA PRESENTE ESTÁNLIMITADAS A NOVENTA (90) DÍAS DESDE DE LA FECHA QUE ADQUIRIÓ LA DOCUMENTACIÓN O EL ELEMENTO QUEES SUJETO DE LA RECLAMACIÓN.

Guía de desarrollo Aviso legal

57

Page 60: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

EN LA MEDIDA MÁXIMA EN QUE LO PERMITA LA LEY DE SU JURISDICCIÓN, EN NINGÚN CASO RIM ASUMIRÁRESPONSABILIDAD ALGUNA POR CUALQUIER TIPO DE DAÑOS RELACIONADOS CON ESTA DOCUMENTACIÓN O SUUSO, O RENDIMIENTO O NO RENDIMIENTO DE CUALQUIER SOFTWARE, HARDWARE, SERVICIO O PRODUCTOS YSERVICIOS DE TERCEROS AQUÍ MENCIONADOS INCLUIDOS SIN NINGÚN TIPO DE LIMITACIÓN CUALQUIERA DE LOSSIGUIENTES DAÑOS: DIRECTOS, RESULTANTES, EJEMPLARES, INCIDENTALES, INDIRECTOS, ESPECIALES, PUNITIVOSO AGRAVADOS, DAÑOS POR PÉRDIDA DE BENEFICIOS O INGRESOS, IMPOSIBILIDAD DE CONSEGUIR LOS AHORROSESPERADOS, INTERRUPCIÓN DE LA ACTIVIDAD COMERCIAL, PÉRDIDA DE INFORMACIÓN COMERCIAL, PÉRDIDA DELA OPORTUNIDAD DE NEGOCIO O CORRUPCIÓN O PÉRDIDA DE DATOS, IMPOSIBILIDAD DE TRANSMITIR O RECIBIRCUALQUIER DATO, PROBLEMAS ASOCIADOS CON CUALQUIER APLICACIÓN QUE SE UTILICE JUNTO CON PRODUCTOSY SERVICIOS DE RIM, COSTES DEBIDOS AL TIEMPO DE INACTIVIDAD, PÉRDIDA DE USO DE LOS PRODUCTOS Y SERVICIOSDE RIM O PARTE DE ÉL O DE CUALQUIER SERVICIO DE USO, COSTE DE SERVICIOS SUSTITUTIVOS, COSTES DECOBERTURA, INSTALACIONES O SERVICIOS, COSTE DEL CAPITAL O CUALQUIER OTRA PÉRDIDA MONETARIA SIMILAR,TANTO SI DICHOS DAÑOS SE HAN PREVISTO O NO, Y AUNQUE SE HAYA AVISADO A RIM DE LA POSIBILIDAD DE DICHOSDAÑOS.

EN LA MEDIDA MÁXIMA EN QUE LO PERMITA LA LEY DE SU JURISDICCIÓN, RIM NO TENDRÁ NINGÚN OTRO TIPO DEOBLIGACIÓN O RESPONSABILIDAD CONTRACTUAL, EXTRACONTRACTUAL O CUALQUIER OTRA, INCLUIDA CUALQUIERRESPONSABILIDAD POR NEGLIGENCIA O RESPONSABILIDAD ESTRICTA.

LAS LIMITACIONES, EXCLUSIONES Y DESCARGOS DE RESPONSABILIDAD SE APLICARÁN: (A) INDEPENDIENTEMENTEDE LA NATURALEZA DE LA CAUSA DE LA ACCIÓN, DEMANDA O ACCIÓN SUYA, INCLUIDA PERO NO LIMITADA ALINCUMPLIMIENTO DEL CONTRATO, NEGLIGENCIA, AGRAVIO, EXTRACONTRACTUAL, RESPONSABILIDAD ESTRICTA OCUALQUIER OTRA TEORÍA DEL DERECHO Y DEBERÁN SOBREVIVIR A UNO O MÁS INCUMPLIMIENTOS ESENCIALES OAL INCUMPLIMIENTO DEL PROPÓSITO ESENCIAL DE ESTE CONTRATO O CUALQUIER SOLUCIÓN CONTENIDA AQUÍ; Y(B) A RIM Y A SUS EMPRESAS AFILIADAS, SUS SUCESORES, CESIONARIOS, AGENTES, PROVEEDORES (INCLUIDOS LOSPROVEEDORES DE SERVICIOS DE USO), DISTRIBUIDORES AUTORIZADOS POR RIM (INCLUIDOS TAMBIÉN LOSPROVEEDORES DE SERVICIOS DE USO) Y SUS RESPECTIVOS DIRECTORES, EMPLEADOS Y CONTRATISTASINDEPENDIENTES.

ADEMÁS DE LAS LIMITACIONES Y EXCLUSIONES MENCIONADAS ANTERIORMENTE, EN NINGÚN CASO NINGÚNDIRECTOR, EMPLEADO, AGENTE, DISTRIBUIDOR, PROVEEDOR, CONTRATISTA INDEPENDIENTE DE RIM O CUALQUIERAFILIADO DE RIM ASUMIRÁ NINGUNA RESPONSABILIDAD DERIVADA DE O RELACIONADA CON LA DOCUMENTACIÓN.

Antes de instalar, usar o suscribirse a cualquiera de los Productos y servicios de terceros, es su responsabilidadasegurarse de que su proveedor de servicios de uso ofrezca compatibilidad con todas sus funciones. Puede quealgunos proveedores de servicios de uso no ofrezcan las funciones de exploración de Internet con una suscripciónal servicio BlackBerry® Internet Service. Consulte con su proveedor de servicios acerca de la disponibilidad, arreglosde itinerancia, planes de servicio y funciones. La instalación o el uso de los Productos y servicios de terceros conproductos y servicios de RIM puede precisar la obtención de una o más patentes, marcas comerciales, derechos deautor u otras licencias para evitar que se vulneren o violen derechos de terceros. Usted es el único responsable dedeterminar si desea utilizar Productos y servicios de terceros y si se necesita para ello cualquier otra licencia deterceros. En caso de necesitarlas, usted es el único responsable de su adquisición. No instale o utilice Productos yservicios de terceros hasta que se hayan adquirido todas las licencias necesarias. Cualquier tipo de Productos yservicios de terceros que se proporcione con los productos y servicios de RIM se le facilita para su comodidad "TALCUAL" sin ninguna condición expresa e implícita, aprobación, garantía de cualquier tipo por RIM y RIM no sume

Guía de desarrollo Aviso legal

58

Page 61: Blackberry Java SDK 1327377 0217050809 005 6.0 ES(Network Communcation

ninguna responsabilidad en relación con ello. El uso de los Productos y servicios de terceros se regirá y estará sujetoa la aceptación de los términos de licencias independientes aplicables en este caso con terceros, excepto en los casoscubiertos expresamente por una licencia u otro acuerdo con RIM.

Algunas funciones mencionadas en esta documentación requieren una versión mínima del software de BlackBerry®Enterprise Server, BlackBerry® Desktop Software y/o BlackBerry® Device Software.

Los términos de uso de cualquier producto o servicio de RIM se presentan en una licencia independiente o en otroacuerdo con RIM que se aplica en este caso. NINGUNA PARTE DE LA PRESENTE DOCUMENTACIÓN ESTÁ PENSADAPARA PREVALECER SOBRE CUALQUIER ACUERDO EXPRESO POR ESCRITO O GARANTÍA PROPORCIONADA POR RIMPARA PARTES DE CUALQUIER PRODUCTO O SERVICIO DE RIM QUE NO SEA ESTA DOCUMENTACIÓN.

Research In Motion Limited295 Phillip StreetWaterloo, ON N2L 3W8Canadá

Research In Motion UK Limited Centrum House 36 Station Road Egham, Surrey TW20 9LF Reino Unido

Publicado en Canadá

Guía de desarrollo Aviso legal

59