Creación de aplicaciones para BlackBerry con Herramientas de Código Abierto, Parte 1: Preparación del Terreno

Quizá no haya una tecnología que transforme más el mercado que la del teléfono celular. Y dentro de esa clasificación de dispositivos, quizá ninguno sea más conocido que la BlackBerry de Research In Motion (RIM). La mayoría de las personas piensan que es sólo para e-mail empresarial, pero existe potencial sin explotar en ese adictivo dispositivo. A pesar de ser una plataforma popular, las aplicaciones de terceros siguen siendo necesarias para la plataforma de BlackBerry. No existe una mejor forma de hacer que esas aplicaciones sean una realidad que permitiendo la ayuda de la comunidad del código abierto. Continúe con este tutorial mientras se prepara el terreno para una aplicación de recolección de datos de código abierto, en la cual se compila un servicio accesible y fácil de usar de recolección de datos.

Frank Ableson, Author

Después de que terminara su carrera basquetbolista colegial sin un contrato multianual para jugar para los Lakers de Los Ángeles, Frank Ableson cambió su enfoque hacia el diseño de software informático. Disfruta solucionando problemas complejos, particularmente en las áreas de comunicaciones e interfaces de hardware. Cuando no está trabajando, está pasando el tiempo con su esposa Nikki y sus hijos. Es posible contactar a Frank escribiendo a frank@cfgsolutions.com.



12-11-2012

Antes de comenzar

Este tutorial es para desarrolladores de código abierto y tecnología de Java™ interesados en el desarrollo de aplicaciones de BlackBerry en el contexto de una aplicación móvil de recolección de datos. La aplicación de ejemplo demuestra una simple aplicación de recolección de datos aprovechando las herramientas de desarrollo de BlackBerry disponibles gratuitamente. La experiencia en desarrollo móvil es útil, pero no se requiere. Se requieren habilidades de programación de Java para aplicaciones de BlackBerry, pero no son un requisito explícito para este tutorial. Asimismo, PHP y MySQL son empleados en el backend, así que estar familiarizado con esas plataformas es útil, pero, de nuevo, no es un requisito.

Acerca de este tutorial

¿Por qué nos importa la grabación de aplicaciones para BlackBerry? Uno de los retos del software de código abierto es que frecuentemente es visto únicamente con una sola cara — Linux®— y que está frecuentemente oculto en un servidor enterrado en un centro de datos. Sin embargo, uno de los secretos más grandes en el mercado es que la plataforma móvil más popular y poderosa utiliza un lenguaje de programación de código abierto: el lenguaje de programación de Java. Así es, un lenguaje de código abierto es la base de las aplicaciones en los dispositivos de BlackBerry que se utilizan diariamente.

Las aplicaciones de BlackBerry representan una convergencia interesante de perfil de uso y posibilidad. El usuario prototipo de una BlackBerry es un profesional que usa una BlackBerry para trabajar. Los dispositivos de BlackBerry permiten a las personas estar más disponibles y en tiempo real, ya que BlackBerry es el principal en el uso de e-mail móvil. Pero la plataforma de BlackBerry ofrece más que sólo e-mail. Construido sobre una base de J2ME, RIM ha extendido el entorno de Java para proporcionar dispositivos poderosos y deseables que permiten aplicaciones útiles y divertidas para los negocios y el entretenimiento por igual. A medida que las nuevas plataformas móviles entran en escena, el punto de referencia es BlackBerry. Si otras plataformas se comparan con BlackBerry, existe motivación suficiente para explorar las posibilidades de esta plataforma que mueve al mercado.

Este tutorial presenta el desarrollo de aplicaciones de BlackBerry dentro del contexto del espacio de aplicaciones móviles de recolección de datos. Proporciona una introducción al desarrollo de BlackBerry con una rápida introducción a la plataforma, un tour por las herramientas de desarrollo de BlackBerry y una construcción de una aplicación de recolección de datos completa. El código de origen completo está disponible para la aplicación de BlackBerry y los componentes del lado del servidor utilizados en la aplicación de muestra en la sección de Descargas de este artículo. Este tutorial está organizado en las siguientes secciones:

  • Bases de la plataforma de BlackBerry
  • Desarrollo de aplicaciones de BlackBerry con JDE
  • Aplicaciones de recolección de datos con BlackBerry
  • Procesos de transacción en el lado del servidor
  • Siguientes pasos

Requisitos del sistema

Este tutorial demuestra algunas tecnologías de código abierto y las une para formar un prototipo para una plataforma móvil de recolección de datos de código abierto. Todas ellas son necesarias para realizar las etapas en este tutorial. Nuestro enfoque principal es desarrollar aplicaciones para la plataforma de BlackBerry, así que esas piezas son el requisito primario. Es posible aprovechar un sitio web públicamente disponible para transacciones del lado del servidor si la construcción del lado del servidor no es de su interés. Esta es la lista completa:

BlackBerry Java Development Environment
Este tutorial emplea V4.0.2 del JDE, aunque hay una versión más reciente disponible.
PHP
PHP puede ser descargado desde PHP.net. El release más reciente y estable es V4.4.9.
MySQL
El release más reciente y estable es V5.0.
IBM Tutorial on BlackBerry Data Collection Applications
Acceda al sitio del autor que aloja las transacciones del lado del servidor.

Resaltes del código de muestra

En este tutorial, se construye una aplicación genérica de recolección de datos para BlackBerry. Tiene el poco creativo nombre de bb_ibm_demo. Pero no deje que el nombre lo engañe. Cuando los conceptos presentados sean absorbidos, una gran gama de aplicaciones útiles estará esperando. El código de origen completo está disponible en la sección de Descargas de este artículo. Los fragmentos de código de origen incluyen:

bb_ibm_demo constructor
Esta es la clase primaria de la aplicación de BlackBerry.
main() método en bb_ibm_demo de la aplicación de BlackBerry
Este es el método público inválido estático para la aplicación (el punto de entrada de la aplicación de BlackBerry).
bb_ibm_screen constructor
Esta es la interfaz de usuario (IU) real mostrada al usuario en la BlackBerry. Este método demuestra la creación de los elementos de IU.
fieldChanged()
Este es el método que maneja el presionar los botones en la pantalla de IU en la BlackBerry.
ProcessTransaction
Este método comunica la BlackBerry con un servidor en Internet utilizando HTTP.
index.php
Esta es la página de inicio de nuestra aplicación de servidor de muestra. Desde aquí, es posible iniciar una búsqueda de transacciones previamente subidas.
db.php
Gestiona la conexión con la base de datos MySQL.
export.php
Proporciona una exportación para el archivo CSV de transacciones subidas.
manage.php
Gestiona transacciones subidas. Añádalo a este archivo para su propia funcionalidad.
showtransactions.php
Muestra cualquier transacción cargada para un identificador específico.
posttransaction.php
Esta rutina de servidor trabaja mano a mano con ProcessTransaction en la BlackBerry para registrar datos recolectados en el campo.
utils.php
Este archivo contiene funciones de ayuda para gestionar transacciones en el servidor.
db.sql
Este script contiene el lenguaje de definición de datos (DDL) para crear la tabla de transacciones utilizada en el servidor.

Bases de BlackBerry y el JDE

Antes de entrar en la instalación del JDE de BlackBerry y construir una aplicación, vamos a presentar los principales componentes de la plataforma de BlackBerry. Una vez que sean presentados algunos de los fundamentos, examinaremos el JDE.

Conozca la BlackBerry

Históricamente, BlackBerry siempre ha sido una plataforma de mensajería. Las primeras versiones de los dispositivos de RIM eran localizadores de dos vías glorificados. Expandiéndose a partir de ese humilde — e importante — comienzo, la BlackBerry actual es un entorno integrado de teléfono, texto, e-mail y aplicaciones enriquecidas, incluyendo posibilidades de medios de comunicación y GPS en los dispositivos más recientes. A diferencia de otros dispositivos que se jactan de tener atractivas pantallas táctiles y un hardware lleno de dispositivos, la BlackBerry es un dispositivo capaz y táctil, ideal para el usuario empresarial de poder y el usuario de mensajería de texto de poder.

Opciones de comunicaciones en red

Toda la comunicación entre un dispositivo de BlackBerry e Internet se hace pasando a través de los centros de datos de RIM. La comunicación entre el dispositivo y RIM es realizada utilizando un protocolo seguro. Si tiene una BlackBerry, se le presentará uno de distintos escenarios:

BlackBerry Enterprise Server (BES)
Las redes corporativas emplean un BES como un medio para gestionar dispositivos de usuarios móviles y conectar los dispositivos a servidores corporativos de e-mail. La comunicación mediante la red de RIM y una instancia de un BES es completamente segura; no hay una sola porción de texto plano de esta comunicación en Internet.
BlackBerry Internet Service (BIS)
Este es el servicio que la mayoría de los consumidores y usuarios de pequeñas empresas utilizan, ya que tiene los costos de licenciamiento más bajos y no requiere hardware adicional más allá del dispositivo de BlackBerry. BIS funciona al configurar su cuenta o cuentas de e-mail en el sitio web de RIM y, mágicamente, su e-mail se muestra en su BlackBerry. La comunicación entre RIM y su dispositivo es segura, pero la conexión entre RIM y su servidor de e-mail puede o no ser segura, dependiendo del tipo de proveedor de e-mail que use.
Desktop Redirector para Outlook
El redirector conecta el centro de datos de RIM con una sesión local de Microsoft® Outlook® ejecutándose en una computadora local. En este escenario, el programa de Outlook debe estar conectado en todo momento para que el e-mail fluya hacia el dispositivo de BlackBerry. Este no es un escenario ideal para el verdadero usuario móvil que tiene una laptop y no una desktop. Si la laptop está guardada en una mochila mientras usted está en el tren, no hay e-mail móvil.

Ejecutar en un entorno de BES proporciona el mayor control y las mayores opciones para aplicaciones y el cumplimiento de las políticas de TI. Por ejemplo, un administrador de TI puede evitar que los usuarios accedan a ciertos sitios de Internet, restringiendo así el uso del dispositivo exclusivamente a cuestiones de negocios. Además, hay algunas posibilidades de aplicación de "push" con un BES. Los temas en este tutorial son universalmente aplicables, sin importar el entorno en el que opere una BlackBerry particular. Lo único que se presupone es que está habilitado un plan de datos que permita el acceso a Internet. Por supuesto, si tiene una BlackBerry restringida con respecto a los sitios de Internet que pueden ser visitados, tal vez tenga que convencer a su administrador de TI para que abra el acceso al servidor de las aplicaciones de muestra.

Características del dispositivo

Existen algunas características físicas del dispositivo de BlackBerry que vale la pena mencionar:

Teclado QWERTY
Los dispositivos de BlackBerry se han distinguido por su teclado QWERTY completo — una característica obligada para los usuarios móviles que utilizan mucho las funciones de texto. Los botones táctiles también son buenos para los atajos de teclado — una característica que brilla por su ausencia en los dispositivos que no tienen botones físicos.
Rueda de desplazamiento
La rueda de desplazamiento es esencialmente un "mando de desplazamiento" en el costado de su BlackBerry. La rueda de desplazamiento es utilizada para navegar en la IU, ya que los dispositivos de BlackBerry no presentan una pantalla táctil. La rueda de desplazamiento es "seleccionable", lo que significa que puede ser presionada para hacer una selección en la GUI. Presionar la rueda de desplazamiento es análogo a "hacer clic" con el ratón en una computadora. Mantener presionado el botón Alt del teclado modifica el comportamiento de la rueda de desplazamiento dentro de la IU. Los dispositivos más recientes tienen una bola de desplazamiento, la cual actúa en forma similar a la rueda de desplazamiento.
Botón de escape
Este botón actúa como un botón de retroceso, moviendo al usuario a una etapa anterior en la navegación.
Aplicaciones de Ribbon vs. aplicaciones que no son de Ribbon
Los iconos de aplicación en la pantalla principal son conocidos como los Ribbon. Las aplicaciones personalizadas, como la que se construye en este tutorial, residen dentro de la carpeta Aplications en el Ribbon.
Comunicaciones Bluetooth
Además de los audífonos de Bluetooth manos libres estándar, muchos dispositivos de BlackBerry soportan el perfil de puerto serie de Bluetooth. Esto permite que se graben aplicaciones sofisticadas para BlackBerry. Algunas ideas incluyen la comunicación con un receptor GPS, imprimir, o cargar firmware en un dispositivo intercalado, como un electrodoméstico o una máquina expendedora.

La figura 1 resalta algunas de estas características físicas.

Figura 1. Dispositivo BlackBerry
BlackBerry device

Ahora examinemos el desarrollo de aplicaciones de BlackBerry.

JDE de BlackBerry

Desde una perspectiva de software, los dispositivos de BlackBerry están habilitados para Java y proporcionan una excelente plataforma para el desarrollo de aplicaciones. A diferencia de algunos teléfonos habilitados para J2ME, en donde ejecutar una aplicación se siente como si se saltara al otro lado del teléfono en una forma de "doble arranque", el inicio de aplicaciones en la BlackBerry tiene una sensación natural e integrada. De hecho, la integración es tan estrecha que las aplicaciones de terceros incluso pueden añadir menús personalizados a muchas de las aplicaciones centrales de BlackBerry. Contar con una sólida comprensión del lenguaje Java es útil para compilar aplicaciones de BlackBerry.

Este tutorial se enfoca en el uso del JDE de BlackBerry. Existe un número de versiones del JDE disponibles para descarga en el sitio web de RIM. Estas versiones distintas corresponden a revisiones de software encontradas en el hardware de BlackBerry. Por ejemplo, utilizar una versión anterior del JDE puede ser una buena idea cuando la aplicación pretende funcionar en tantos dispositivos como sea posible, incluyendo dispositivos anteriores, los cuales pueden tener un conjunto de dispositivos más limitado. Esto puede verse como la grabación de una aplicación que no requiere una cámara o verdaderos servicios de GPS. Tomar un denominador mínimo común puede ser una buena idea cuando se está compilando una aplicación comercial, ya que, mientras más dispositivos sean capaces de ejecutar la aplicación, mayores serán las oportunidades de venta del producto.

¿Qué se incluye?

Los paquetes de descarga del entorno de desarrollo disponibles en RIM consisten en más que simplemente un editor de código gráfico y herramientas de compilación. Los recursos de RIM incluyen:

Editor de código gráfico
Este se ve similar a otros entornos de programación que ofrecen gestión de proyecto de aplicaciones, edición de código, compilación de código y depuración.
Simuladores de dispositivo
Estos habilitan los ciclos de código, compilación y depuración para que se lleven a cabo directamente en la computadora de desarrollo. Esta es una gran ventaja sobre hacer las pruebas únicamente en el dispositivo real. Las buenas prácticas de la codificación sugieren que las pruebas se realicen en el dispositivo antes del release de un producto. Sin embargo, utilizar el simulador es de gran ayuda para ahorrar tiempo durante la fase de desarrollo. Utilizar simuladores también puede ser una parte importante del proceso de soporte de aplicaciones, ya que un usuario puede informar una anomalía que sólo ocurre en un dispositivo particular. Por ejemplo, una aplicación que grabé funcionaba bien en la mayoría de los dispositivos, pero en el 8700c su comportamiento era algo extraño. Utilizando el simulador, pude aislar el problema y encontrar la solución. Es una buena idea probar periódicamente su aplicación en los simuladores de dispositivos más recientes a medida que están disponibles. Esta es una alternativa más económica a comprar cada dispositivo nuevo que llegue al mercado. El simulador también es un mecanismo conveniente para documentar una aplicación — obtener capturas de pantalla es simple.
Referencia de la API
Una referencia conveniente y detallada de la API es incluida en la descarga del JDE.
Simulador de MDS
Este software simula el tráfico de comunicación entre una BlackBerry real y la red de RIM. Sin el simulador de MDS en ejecución, el simulador de dispositivo de BlackBerry no puede comunicarse con hosts en Internet.
Simulador de e-mail
El JDE también incluye un simulador de e-mail. Ya que buena parte de las operaciones de una BlackBerry están relacionadas con el e-mail, es una buena idea hacer uso del simulador de e-mail. Esto permite a las aplicaciones probar las funcionalidades relacionadas con el e-mail.

Desde una perspectiva de código, las aplicaciones de BlackBerry aprovechan las clases de J2ME, así como las Interfaces de Programación de Aplicaciones (APIs) extendidas especialmente. Estas APIs tienen algo de solapamiento con los paquetes de J2ME. Sin embargo, las clases proporcionadas por BlackBerry son de gran interés, debido al poderoso acceso que proporcionan a una BlackBerry.

Si su objetivo aquí es continuar con la construcción de la aplicación de muestra, tómese un momento para instalar una versión del JDE de BlackBerry. Lasección de requisitos del sistema incluye un enlace a la página de descarga del JDE en el sitio web de RIM.


Una aplicación de BlackBerry

La mejor forma de aprender es haciendo las cosas, así que pasemos directamente a la construcción de una aplicación de recolección de datos de BlackBerry. Cada elemento principal de la aplicación de muestra del tutorial es examinado, incluyendo los fragmentos de código de origen relevantes.

La clase de Aplicación BlackBerry

Este tutorial crea una sola aplicación, la cual será construida en partes a lo largo de este tutorial. Este primer fragmento de código a revisar es encontrado en bb_ibm_demo.java. Es posible descargar el código de origen completo para este tutorial en la sección de Descargas .

Como cualquier aplicación básica de Java, una aplicación requiere un punto de entrada, es decir main. Las porciones del archivo de origen bb_ibm_demo.java están incluidas a continuación.

Listado 1. Método main del archivo bb_ibm_demo.java
//
// bb_ibm_demo.java
//
// MSI Services, Inc.
// Frank Ableson
// 973.448.0070
// fableson@msiservices.com
// code free to use for any purpose, commercial or otherwise
 

package com.msi.ibm;

// required imports
import net.rim.device.api.ui.*;

// our application class
class bb_ibm_demo extends UiApplication
{
    
    // application entry point
    public static void main(String[] args)
    {
        // create an instance of our app
        bb_ibm_demo theApp = new bb_ibm_demo();
        
        // "run" the app
        theApp.enterEventDispatcher();
    }


    // app constructor
    public bb_ibm_demo()
    {

        // create an instance of the main screen of our application
        bb_ibm_screen screen = new bb_ibm_screen();

        // make the screen visible
        pushScreen(screen); 
    }
}

El método main crea una nueva instancia de la clase named bb_ibm_demo. Esta clase es una extensión de la clase UiApplication extendida. UiApplication es encontrada en net.rim.device.api.ui . La clase UiApplication es una clase base para todas las aplicaciones de BlackBerry que tienen una IU.

El constructor de la clase bb_ibm_demo crea una instancia de bb_ibm_screen . Esta clase es definida e implementada en bb_ibm_screen.java. Una vez que la pantalla es creada, se pasa a pushScreen() . Esto esencialmente trae la pantalla a la vista en el dispositivo.

La pantalla

La aplicación de ejemplo tiene una IU muy básica. La clase bb_ibm_screen extiende la clase MainScreen , la cual es una clase proporcionada por RIM que implementa dispositivos comunes para aplicaciones de BlackBerry. Además, esta clase implementa la Interfaz de Java FieldChangeListener. Esto permite que la clase reaccione a la entrada del usuario en los elementos de IU. Este tema es explicado con más detalle en una sección más adelante sobre la detección de una presión de botón.

La IU central para la aplicación de muestra es creada en el constructor de la clase bb_ibm_screen. Antes de observar el código para la creación de los elementos de IU, echemos un vistazo a la declaración de los elementos de IU que son miembros de nuestra clase.

Listado 2. Declaración de elementos de IU
    // private members - these represent the "controls"
    private BasicEditField identifierfield = null;
    private BasicEditField datafield = null;
    private ButtonField submitbutton = null;
    private LabelField statusfield = null;

Cada variable representa un elemento de IU. Hay dos campos donde el texto puede ser ingresado. Estos son los miembros BasicEditField . El ButtonField es utilizado para iniciar una transacción. El LabelField proporciona una visualización de sólo lectura de lo que está sucediendo en la aplicación. Observemos el código que crea la IU para la aplicación de muestra del tutorial (vea el Listado 3). El constructor invoca el constructor de superclase con una llamada para super(). El título de la pantalla es establecido y un método es llamado para crear la IU. La IU se divide en un método separado.

Listado 3. Crear la IU para la aplicación de muestra
    // constructor
    public bb_ibm_screen()
    {
        // invoke the constructor of the super class (MainScreen)
        super();
        // give our application window a title
        setTitle("BB IBM Demo App");
        // create user interface components
        createui();
    }

El diseño

Observando más de cerca el método createui , note que cada uno de los campos es creado con una llamada de método específica (vea el Listado 4). Por ejemplo, la clase BasicEditField presenta una etiqueta, junto con un campo de entrada con un valor predeterminado específico, una longitud máxima y un estilo. Para ver un listado de los estilos disponibles, examine las definiciones de clase Field y EditField en el Javadoc de API. Una ButtonField es utilizada para enviar una transacción. Una LabelField es también creada para proporcionar información de estado. Una vez que cada uno de estos elementos ha sido instanciado, el método add es utilizado para incluir el componente de IU en la pantalla. Uno de los muy agradables dispositivos de las pantallas de BlackBerry es que el desplazamiento vertical ocurre automáticamente sin la necesidad de código de desplazamiento complicado. Para las aplicaciones de recolección de datos que requieren una buena cantidad del espacio de la pantalla, este es un dispositivo bastante útil.

Listado 4. Método creatui()
private void createui()
  {
      try
      {
      // create a field for entering the "identifier" of our transaction
      identifierfield = new BasicEditField("Identifier: ","",50, EditField.NO_NEWLINE );
      // add this field to the screen
      add(identifierfield);
      // create a field for the data of our transaction
      datafield = new BasicEditField("Data: ","",100, EditField.NO_NEWLINE );    
      // add this field to the screen
      add(datafield);
      // create a button to submit out transaction
      submitbutton = new ButtonField("Submit Transaction",ButtonField.CONSUME_CLICK);
      // tell this button who handles changes (selection)
      submitbutton.setChangeListener(this);
      // add this button to the screen
      add(submitbutton);
      // add a status label
      statusfield = new LabelField("Please enter transaction data.");
      // add label to screen
      add(statusfield);
      }
      catch (Exception e)
      {
          System.out.println("Failed to create user interface components");
      }
    }

Ahora que la IU ha sido creada, es momento de ver la detección de eventos. Mantenerse en línea con la arquitectura de Java para la plataforma de BlackBerry, la detección de eventos es implementada mediante el uso de una o más interfaces de receptor de eventos.

Detección de la presión de botones

Hay un número de receptores de eventos disponibles en el entorno de BlackBerry. El receptor de interés para esta aplicación de muestra es FieldChangeListener Esta interfaz proporciona los medios para detectar cambios en los campos, incluyendo botones. Para hacer uso de un FieldChangeListener, se deben cumplir tres requisitos. El primero es la implementación del método de la interfaz fieldChanged(). El método de hecho es bastante simple, requiriendo sólo dos argumentos — siendo el primero el más importante, el cual representa el campo que ha cambiado de alguna forma.

Listado 5. fieldChanged()
public void fieldChanged(Field field, int Context);

La segunda etapa requerida es instalar el receptor con una llamada para setChangeListener(), como se muestra en el fragmento de código anterior. Sin esta invocación de método, los cambios en el campo no son procesados.

El tercer requisito es que el argumento pasado a setChangeListener debe ser una clase que contenga el fieldChanged . Otra forma de comenzar esto es que la clase implementa el FieldChangeListener En este caso, la clase de IU de la aplicación de muestra del tutorial (bb_ibm_screen) implementa FieldChangeListener: la clase bb_ibm_screen amplia MainScreen, que implementa FieldChangeListener.

Examinemos el método fieldChanged , como se muestra en el Listado 6.

Listado 6. fieldChanged
    // this method implements the FieldChangedListener Interface
    // it is used to detect when the button is selected
    // after validating that the input data is correct, it attempts to submit a 
	// transaction to the server
    public void fieldChanged(Field f, int context)
    {
        // which field was changed
        if (f == submitbutton)
        {
            // check fields....
            String id = identifierfield.getText();
            String data = datafield.getText();
            
            if (id.trim().length() == 0 || data.trim().length() == 0)
            {Dialog.alert("Please fill in all fields.");identifierfield.setFocus();return;
            }
            
            // ok, looks like we have some good data
            if (bb_ibm_transaction.ProcessTransaction(id,data) == true)
            {// transaction was submitted successfully, let's reset the GUI for easy
	// entry to another \
	fieldidentifierfield.setText("");datafield.setText("");\
	identifierfield.setFocus();statusfield.setText("Transaction Sent.");
// if you preferred to just close this application after submission, 
	// uncomment out the following line//onClose();
            }

        }
    }

El método verifica si el campo pasado al método es Submit . De ser así, la implementación continúa para verificar los datos de entrada. En este ejemplo, el código simplemente verifica que los campos no estén vacíos. En una aplicación más rigurosa, estos valores pueden ser validados con un almacén local de identificadores conocidos u otros criterios de entrada. Asumiendo que los datos pasan la prueba de validación simple, la transacción es procesada con una llamada al método ProcessTransaction de la clase bb_ibm_transaction , la cual es revisada en la siguiente sección.


Aplicaciones de recolección de datos con BlackBerry

¿Pero qué es una aplicación de recolección de datos? Muchas aplicaciones entran en esta categoría; están a nuestro alrededor. Cada vez que nos inscribimos a un paquete o tomamos una fotografía de una casa que estamos considerando rentar, estamos recolectando datos. Frecuentemente, estas aplicaciones están asociadas con una "vertical", como el cuidado de la salud o la logística. Sin importar la industria, existen algunos patrones de diseño y prácticas que son importantes al recolectar información con un dispositivo móvil. La siguiente sección habla sobre lo que hay que hacer con los datos una vez que han sido recolectados, incluyendo un método de Java en funcionamiento para procesar una transacción.

Qué conforma a una buena aplicación de recolección de datos

Existe un puñado de técnicas que contribuyen a una buena aplicación de recolección de datos. A veces los dispositivos están fuera del rango, pero siguen siendo capaces de recolectar datos. Un ejemplo de esto es una pieza de equipo habilitada para Bluetooth que está en una ubicación remota. El técnico de servicio de campo que carga una BlackBerry tal vez no tenga señal de celular, pero puede seguir interactuando con el equipo por medio de una conexión de datos de Bluetooth local. En este caso, es importante que el usuario tenga la opción de almacenar (poner en cola) datos localmente para transmitirlos más tarde cuando otra vez tenga señal. Otro ejemplo de almacenamiento local es para datos de referencia utilizados para validar los campos de entrada de datos por usuarios móviles. Durante un conteo de ciclo de inventario, una lista de referencia de elementos a contar sería razonable para almacenar en el dispositivo sin tener una conexión de red.

Sin embargo, hay ocasiones en que el almacenamiento local no es necesario o garantizado. Por ejemplo, una aplicación puede requerir una conexión a Internet hacia un servidor que proporciona información relevante para el usuario en ese momento, como la proximidad de otros usuarios en la red. Un ejemplo de esto sería una aplicación de red relacionada con la disponibilidad de personas específicas o recursos. Los datos de mercado son otro ejemplo de dónde pueden ser importantes los datos en tiempo real. No queremos comprar carne de cerdo a un precio mayor al del mercado, por ejemplo.

Crear la posibilidad de almacenar datos localmente es un aspecto importante de aplicaciones móviles de recolección de datos. Sin embargo, las técnicas para almacenar datos localmente en la BlackBerry están más allá del ámbito de este tutorial. Dicho esto, la aplicación de muestra del tutorial sí recolecta datos y necesita tener algo qué hacer con ellos una vez que los recolecta. Para hacer esto, examinemos el método ProcessTransaction en la clase bb_ibm_transaction , implementado en el archivo bb_ibm_transaction.java.

Listado 7. ProcessTransaction
    // this method interacts with the server
    public static boolean ProcessTransaction(String id,String data)
    {
        // default to non-success return code
        boolean ret = false;
        
        // some variables necessary for HTTP communication
        InputStream inputStream = null;
        HttpConnection httpConnection = null;


        // because many of the steps can throw an exception, wrap this method 
		// in a try/catch block
        try
        {
            
            StringBuffer returnStringBuffer = new StringBuffer();
            String returnString = new String();
            

            String desiredEncoding = "ISO-8859-1";


            URLEncodedPostData params = new URLEncodedPostData(URLEncodedPostData.
DEFAULT_CHARSET, true);
            params.append("identifier", id);
            params.append("data", data);
            
            String url = "http://ibm.msi-wireless.com/posttransaction.php?" 
+ params.toString();                   
            System.out.println(url);                                              
            //Connecting to Server
            httpConnection = (HttpConnection)Connector.open(url);
            inputStream = httpConnection.openDataInputStream();
            
            if(httpConnection.getResponseCode() == HttpConnection.HTTP_OK)
            {int ch;
            //Process Response// check header field for a specific encodingString \
contenttype = httpConnection.getHeaderField("Content-Type");if (contenttype != null){   
contenttype = contenttype.toUpperCase();   \
if (contenttype.indexOf("UTF-8") != -1)    {        desiredEncoding = "UTF-8";    }}
            // get an inputstreamreader to handle utf-8 dataInputStreamReader \
isr = new InputStreamReader(inputStream,
desiredEncoding);
while ((ch = isr.read()) != -1) { returnStringBuffer.append((char) ch);} \
	inputStream.close();httpConnection.close();inputStream = null;\
	httpConnection = null;returnString = returnStringBuffer.toString();
// examine return stringif (returnString.indexOf("SUCCESS") \
!= -1){    ret = true;}return ret;
            }
            inputStream.close();
            httpConnection.close();
            inputStream = null;
            httpConnection = null;
            //Bad Transaction.
            return ret;
        }
        catch (Exception e)
        {
            System.out.println("Error occurred in ProcessTransaction(" + id + "," 
+ data + ")\n" + e.toString());
            return ret;
        }
        finally
        {
            try
            {if (inputStream != null)    inputStream.close();if \
(httpConnection != null)    httpConnection.close();
            }
            catch (Exception ee)
            {
            }
        }
    }

El método ProcessTransaction demuestra un número de técnicas útiles para comunicarse con un servidor web. Establece una conexión y envía una consulta URLEncoded a un URL específica. El URLEncodedPostData se encarga de formatear datos como si fueran generados por un "Campo de Formulario" en un navegador de escritorio. Note el código que examina el tipo de contenido y establece un InputStreamReader para procesar los datos. Sin esta etapa, cualquier dato más allá del más básico de texto puede presentarse en formas inesperadas y no deseadas. Esta función retorna True si el servidor web retorna la serie SUCCESS.

Compilar la aplicación

Ahora que los fragmentos de código relevantes han sido revisados, regresemos al entorno de desarrollo de BlackBerry para compilar la aplicación. Después de cargar el código de muestra, el JDE de BlackBerry debe verse similar a la Figura 2.

Figura 2. El JDE de BlackBerry con el código de muestra cargado
The BlackBerry JDE with the sample code loaded

Para compilar la aplicación, presione F7 . Para ver la salida del proceso de compilación, seleccione la opción Output en el menú View o use Alt+2 (mientras mantiene presionada la tecla Alt , presione el número 2).

Asumiendo que no hay errores en el código y que la aplicación ha sido compilada sin errores, es momento de ejecutar la aplicación en el simulador de BlackBerry. Lo primero que hay que hacer es asegurarse de que el simulador de MDS se está ejecutando. El simulador de MDS permite que el simulador de BlackBerry se conecte a la red, incluyendo Internet. El simulador de MDS puede iniciarse automáticamente, si así lo prefiere. Para hacer cambios como cuándo es iniciado el simulador de MDS (automática o manualmente) y otras opciones del simulador de BlackBerry, use Preferences del menúEdit en el editor del JDE de BlackBerry, como se muestra a continuación.

Figura 3. Opción Preferencias en el editor del JDE de BlackBerry
Preferences option in the BlackBerry JDE editor

Presionar F5 iniciará el simulador de BlackBerry. La aplicación de muestra del tutorial no se iniciará inmediatamente. Debe ser iniciada al navegar hacia el icono de la aplicación en el Ribbon de la aplicación de la página de inicio y seleccionar la aplicación de muestra del tutorial: bb_ibm. Las teclas de flecha en la computadora simulan la rueda de desplazamiento, la tecla Enter simula el presionar la rueda de desplazamiento y la tecla de escape emula el botón de escape de BlackBerry.

Ahora que la parte de BlackBerry de este tutorial ha sido discutida, echemos un vistazo a la importante parte del servidor, donde los datos son almacenados y gestionados.


Procesos de transacción en el servidor

Sin un lugar donde almacenar y gestionar datos recolectados, la aplicación de BlackBerry sería de valor limitado. Aunque una aplicación móvil de recolección de datos puede almacenar datos únicamente en el dispositivo móvil. En la mayoría de los casos, una aplicación móvil de recolección de datos exitosa tendrá un componente del lado del servidor para complementar el software móvil de recolección de datos.

Almacenamiento de datos

Para almacenar datos en el servidor, la aplicación de muestra del tutorial aprovecha la popular base de datos de código abierto MySQL. Una sola tabla de base de datos de aplicaciones es empleada: tbl_transactions. Esta tabla almacena datos enviados por la aplicación de BlackBerry. Otras etapas de gestión, incluyendo la exportación y el purgado de datos, aprovechan esta misma tabla de base de datos. El Lenguaje de Definición de Datos para esta tabla se encuentra en el Listado 8.

Listado 8. Lenguaje de Definición de datos para la tabla tbl_transactions
CREATE TABLE 'db_ibmmsiwireless'.'tbl_transactions' (
'tid' INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'unique id',
'usercode' VARCHAR( 50 ) CHARACTER SET ascii COLLATE ascii_general_ci 
    NOT NULL COMMENT 'which user',
'datum' LONGTEXT CHARACTER SET ascii COLLATE ascii_general_ci 
    NOT NULL COMMENT 'data from tran',
'stampx' DATETIME NOT NULL COMMENT 'when transaction occurred',
PRIMARY KEY ( 'tid' ) ,
INDEX ( 'usercode' , 'stampx' ) 
) ENGINE = MYISAM CHARACTER SET ascii COLLATE ascii_general_ci

Tener una tabla de base de datos no soluciona el reto de almacenar datos completamente. Lo que se necesita es una transacción para aceptar los datos entrantes, validar los datos según sea necesario y almacenar la transacción. Existe un número de opciones disponibles aquí. La aplicación requiere una Llamada de Procedimiento Remota (RPC) de algún tipo. Sin entrar en las diversas discusiones filosóficas de cuál método de RPC es mejor, el tutorial está tomando un enfoque simplista de utilizar URL codificado a partir de datos para el envío de transacciones. Para no distraerse con otras tecnologías (importantes), mantengamos las cosas simples.

Una ventaja de utilizar un enfoque de datos basado en formularios es que las pruebas del lado del servidor pueden hacerse con un formulario construido simplemente — no se requieren herramientas costosas o complejas.

Procesos de transacción

La transacción del lado del servidor es implementada en otra tecnología de código abierto: PHP. PHP es empleado debido a su facilidad de uso, su funcionalidad enriquecida y su modelo de licenciamiento de código abierto. Como muchos entornos de programación, separar las funcionalidades en módulos o clases es un buen estilo de programación, fomentando la facilidad de mantenimiento y la disponibilidad. Examinemos el entorno de PHP que implementa el lado del servidor de la aplicación de muestra del tutorial.

Listado 9. Transacción de PHP del lado del servidor
db.php	
<?php
$mysql_db = "db_ibmmsiwireless";
$mysql_user = "username";
$mysql_pass = "password";
$mysql_link = mysql_connect("dbservername", $mysql_user, $mysql_pass);
mysql_select_db($mysql_db, $mysql_link);
?>

La página db.php contiene información de conectividad relacionada con la base de datos. Este archivo es incluido por cualquier página que interactúe con la base de datos. Tome en cuenta que el uso de una plataforma de base de datos que no sea MySQL provocaría que el contenido del archivo db.php sea cambiado para reflejar el entorno de base de datos alternativo.

Listado 10. Detalles de base de datos
posttransaction.php
<?php
require('db.php');
require('utils.php');
putTransaction($_GET['identifier'],$_GET['data'])
?>

La página post-transaction.php es muy simple — referencia los valores de la base de datos encontrados en db.php y carga las rutinas encontradas en utils.php, las cuales serán revisadas muy pronto.

Una vez que las dos sentencias require son procesadas para cargar las rutinas de base de datos y de utilidad, respectivamente, este script del lado del servidor pasa dos elementos de datos a una función llamada putTransaction. Note la sintaxis de $_GET[]. Esto demuestra los medios para acceder a datos de formulario enviados a la página desde la BlackBerry (o un formulario de pruebas). Tome en cuenta que si los datos serán enviados utilizando POST, en lugar de GET, serían accedidos utilizando $_POST[] .

Observemos la función putTransaction , la cual es encontrada en el archivo utils.php.

Listado 11.putTransaction
function putTransaction($id,$datum)
{
global $mysql_link;

$sql = "insert tbl_transactions (usercode,datum,stampx) values ('$id','$datum',NOW())";
//print($sql);
$result = mysql_query($sql,$mysql_link);
if ($result == 1)
{
	print("SUCCESS");
}
else
{
	print("FAILED");
}
}

El método putTransaction recibe dos argumentos: un identificador y los datos a ser almacenados, o $id y $datum, respectivamente. La función genera una sentencia insert de SQL simple para llenar una nueva fila en la tabla tbl_transactions. Note el uso de la función MySQL de NOW(). Esto permite que se proporcione una indicación de fecha y hora generada por la base de datos en cada transacción registrada. Esta puede ser una herramienta útil en aplicaciones de recolección de base de datos para saber cuándo fue recibida una transacción.

Adicionalmente, una transacción de producción debe incluir una provisión para protegerse de una inyección de SQL. Esta etapa es omitida para efectos de claridad.

Si la operación de base de datos es exitosa, este método retorna la serie SUCCESS, de lo contrario, la serie FAILED. Tome en cuenta que esta función utiliza la función print de PHP, lo que significa que esta serie es enviada de regreso directamente al cliente, que en el caso de esta aplicación de muestra del tutorial es la aplicación de BlackBerry presentada anteriormente. En el sentido más estricto, este es un atajo. Las funciones encontradas en util.php deben idealmente retornar valores a sus interlocutores, que entonces tomarán la decisión sobre lo que comunicará al cliente. Por simplicidad, todas las funciones retornan valores directamente al cliente.

¡Enhorabuena! La transacción que inició en la BlackBerry está ahora almacenada en forma segura en una base de datos relacional en el servidor. Ahora que los datos han sido almacenados, veamos qué se puede hacer con ellos.

Gestionando los datos

Las funciones adicionales en utils.php habilitan otros dispositivos importantes de una aplicación de recolección de datos. La función getTransactions() es invocada desde la página showtransactions.php. Esto permite una consulta simple en todas las transacciones almacenadas y muestra los resultados en el navegador.

Listado 12.getTransactions() function is invoked from showtransactions.php
// In file showtransactions.php:

<?
require('db.php');
require('utils.php');
require('header.php');
?>
<html>
<head>
<title>MSI Wireless Transactions</title>
</head>
<body>
<h3>Transaction List for <? print('['.$_POST['identifier'].']') 
    ?>.</h3>
<hr />
<? getTransactions($_POST['identifier']) ?>
<br>
<a href="/">Try again</a><br>
<? require('footer.php'); ?>
</body>
</html>


// In file utils.php:

function getTransactions($id) 
{
global $mysql_link;
$result = mysql_query("SELECT * from tbl_transactions where \
usercode = '$id' order by tid", $mysql_link);
  if(mysql_num_rows($result))
  {
      print("<table border=1><tr><td>Transaction 
#</td><td>Data</td><td>Time Stamp</td></tr>");
      while($row = mysql_fetch_row($result))
      {

print("<tr><td>$row[0]</td><td>$row[2]</td><td>
$row[3]</td></tr>");
      }
      print("</table>");
      print("<a target='_blank' href='export.php?id=$id'>Export Your 
Transactions</a>");
      print("<br>");
      print("<br>");
      print("<a href='manage.php?id=$id&action=remove'>Delete Your 
Transactions</a>");
      print("<br>");
  }
  else
  {
	print("There are no transactions available.");
  }
}

El archivo showtransactions.php es esencialmente un procesador de formularios para el formulario de entrada encontrado en index.php, con las porciones relevantes mostradas a continuación.

Listado 13. Archivo showtransactions.php abreviado
<?require ('header.php'); ?>
//
<form method="POST" action="showtransactions.php">
Your identifier:&nbsp;<input name="identifier" maxlength="50">
<input type=submit value="Look Up My Transactions">
</form><br>
//
<? require('footer.php'); ?>
</body>
</html>

Secuencia de transacción completa

Las siguientes capturas de pantalla pasan a través del uso de la aplicación de muestra del tutorial, comenzando con la aplicación de BlackBerry y partiendo de una búsqueda en el lado del servidor para encontrar las transacciones recién ingresadas. El ingreso de una transacción en la BlackBerry es mostrado a continuación.

Figura 4. Ingresando una transacción en la BlackBerry
Entering a transaction on the BlackBerry

La Figura 5 muestra el lado del servidor aceptando una consulta para este tipo de transacción. Note que el formulario de entrada tiene la serie IBM DEMO. Es posible ingresar cualquier valor que desee para este campo. Este campo corresponde al identificador o campo de ID en la tabla de base de datos y a los fragmentos de código presentados anteriormente.

Figura 5. El lado del servidor aceptando una consulta para la transacción mostrada en la Figura 4
The server side accepting a query for the transaction shown in Figure 4

La página showtransactions.php llama a la función getTransactions , pasando el valor de consulta, el cual en este caso es IBM DEMO. Cualquier transacción encontrada en tbl_transactions que coincida con ese identificador es mostrada en la página resultante, como se muestra a continuación.

Figura 6. Mostrando transacciones en la tabla tbl_transactions que coinciden con IBM_DEMO
Displaying transactions in tbl_transactions table matching IBM_DEMO

Integración de datos

Un importante dispositivo del sistema de recolección de datos es la capacidad de exportar datos recolectados para uso subsecuente en sistemas de gestión de destino, como un paquete de logística o quizá un sistema de facturación. Por ejemplo, esta aplicación de muestra del tutorial puede ser adaptada para usarse en una compañía de servicio eléctrico para recolectar datos de medición del campo. El identificador sería el número de medición y los datos de KWH obtenidos del medidor.

El lado del servidor implementa una función export simplista que lleva los datos seleccionados a un archivo de Microsoft Excel® legible con valores separados por comas (CSV). El código del lado del servidor que implementa esta función es encontrado en export.php.

Listado 14. Función export del archivo export.php
<?php
	header("Content-Type: application/vns.ms-excel");
	header('Cache-Control: maxage=10'); 
	header('Pragma: public');
	header('Content-Disposition: attachment; filename="'.$_GET['id'].
'_transactions.csv"');
	require('db.php');
	require('utils.php');
	$out = fopen('php://output', 'w');
	getTransactionsToCSV($out,$_GET['id']);
	fclose($out);
?>

La función getTransactionsToCSV , encontrada en utils.php, es mostrada a continuación.

Listado 15. La funcióngetTransactionsToCSV
function getTransactionsToCSV($out,$id) 
{
global $mysql_link;
$result = mysql_query("SELECT tid,datum,stampx from \
tbl_transactions where usercode = '$id' order by tid", $mysql_link);
  if(mysql_num_rows($result))
  {
      fputcsv($out,array("Transaction #","Data","Timestamp"));
      while($row = mysql_fetch_array($result,MYSQL_NUM))
      {
	fputcsv($out,$row);
      }
  }
}

Esta funcionalidad del lado del servidor está disponible gratuitamente para que la use para pruebas fuera de sus aplicaciones de recolección de datos de BlackBerry (vea los requisitos del sistema).


Siguientes pasos

Existen algunos temas que se deben atender antes de que este tutorial esté completo. A esta aplicación de muestra del tutorial le falta una etapa esencial requerida para ejecutar aplicaciones en una BlackBerry real. Adicionalmente, hay dos dispositivos que es conveniente tener en cualquier aplicación móvil de recolección de datos que necesitan ser atendidos. Y el tema del licenciamiento de código abierto es abordado antes de concluir.

APIs controladas

Primero, discutamos la etapa requerida para cargar una aplicación en una BlackBerry real. Existe un número de clases en la API de BlackBerry que requieren firma de código. Estas clases son conocidas como APIs Controladas. Esto significa que el RIM ve el uso de estas clases como sensibles y, por lo tanto, requiere que firme la aplicación con una clave de desarrollador proporcionada por RIM. Esto permite que RIM identifique al autor de una aplicación. ¿Por qué esto es importante? Digamos que alguien crea una aplicación que envía spam o que de alguna forma es un ciudadano con mal comportamiento. La etapa para requerir una firma hace que el desarrollador lo piense dos veces antes de lanzar una aplicación así. Además, RIM puede revocar la clave de un desarrollador si es necesario, dificultando así la capacidad del desarrollador malintencionado para publicar este tipo de aplicaciones. Por supuesto, compilar aplicaciones malintencionadas no es la intención aquí. Pero sí es importante discutir esto, ya que esta etapa es requerida antes de cargar una aplicación en un dispositivo real. Desafortunadamente, esta etapa no es gratis, pero la cuota (US$ 20) no es excesiva.

Para obtener una clave de desarrollador, debe aplicar en el sitio web de RIM. Vea la sección Resources para el URL de registro de la clave de desarrollador.

Una vez que una clave de desarrollador es instalada en el JDE, firmar la aplicación es sencillo.

Firmar la aplicación

Después de compilar exitosamente la aplicación, seleccione la opción Request Signature debajo del menú Build.

Figura 7. Seleccionar la opción Request Signatures
Selecting the Request Signatures option

Cuando se inicie la pantalla Signature Tool, cada módulo de código es listado, junto con un campo Category indicando si el módulo particular requiere de una firma. Ingrese la contraseña de clave privada establecida cuando la clave de desarrollador fue creada para continuar con la operación de firmado.

Figura 8. Ingresar la contraseña de clave privada
Entering the private key password

Una vez que la etapa de firmado está completa, la columna Status indicará que los módulos han sido firmados.

Figura 9. La columna Status indica que los módulos han sido firmados
Status column indicates modules have been signed

Hasta este punto, la aplicación está lista para ser instalada en el dispositivo. Las aplicaciones pueden ser instaladas mediante BlackBerry Enterprise Server, BlackBerry Desktop Manager o utilizando un método Over The Air. Para obtener más información sobre la carga de una aplicación en un dispositivo real, vea Resources.

Manejo de errores

El manejo de errores fue omitido de este tutorial para hacerlo más breve y claro. Por supuesto, todo código listo para producción debe tener una dosis saludable de manejo de errores e instrucciones para el usuario de la aplicación en caso de que algo salga mal.

Colas

Este tema se abordó brevemente, pero amerita una mayor mención. Existen escenarios donde una aplicación necesitará poner datos en cola. Las razones pueden involucrar requisitos de datos de recolección de datos en lotes y enviarlos con información de resumen — una aplicación de inventario físico, por ejemplo. Alternativamente, pueden surgir problemas de conectividad en donde las transacciones no pueden ser enviadas inmediatamente después de la recolección. Aunque este tema no fue implementado expresamente en la aplicación de muestra del tutorial, la estrategia de colas no debe ser ignorada en una aplicación de recolección de datos del mundo real.

Licenciamiento del código abierto

Llevar una idea del concepto a una aplicación de código abierto con licencia no es poca cosa. Esta muestra del tutorial es un buen punto de partida para una plataforma de recolección de datos más completa, pero hay más trabajo por hacer. La siguiente etapa puede ser añadir información basada en la ubicación (datos de GPS, por ejemplo) o quizá incluir un escáner de código de barras habilitado para Bluetooth para recolectar datos de inventario en el campo. Sin importar el siguiente dispositivo técnico por añadir a esta aplicación, la elección de una licencia apropiada de código abierto necesita ser atendida. Los pros y contras de una selección de licencia de código abierto van más allá del ámbito de este tutorial, pero necesitan ser considerados para cualquier producto de código abierto serio. La sección de referencias contiene un enlace a un sitio que agrega un número de licencias de código abierto. Si se toma en serio la compilación de una aplicación de código abierto, piense bien la elección de una licencia apropiada para su aplicación de BlackBerry.


Resumen

Este tutorial ha presentado la plataforma de BlackBerry y demostrado el desarrollo de aplicaciones móviles de recolección de datos con tecnologías de código abierto, incluyendo Java, PHP y MySQL. Las bases de la IU de BlackBerry y comunicaciones fueron presentadas, junto con un lado del servidor simple pero poderoso implementado en los básicos del código abierto PHP y MySQL. Aprovechar estas tecnologías de código abierto abre un mundo de creatividad de software que va mucho más allá de los ringtones y la mensajería de texto. Se podría decir que el mercado para las aplicaciones de BlackBerry de código abierto con Java está en su punto.


Descargas

DescripciónNombretamaño
Java codeos-blackberry-code.zip17KB
PHP and SQL codeos-blackberry-serverside.zip4KB

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Desarrollo móvil
ArticleID=845273
ArticleTitle=Creación de aplicaciones para BlackBerry con Herramientas de Código Abierto, Parte 1: Preparación del Terreno
publish-date=11122012