Simulación Pago Servicios Públicos (JME)

Simulación Pago Servicios Públicos (JME)

En Java Zone, hemos incursionado en el tema de Java MicroEdition, programacion java para moviles, este es uno de nuestro ejemplos, le he querido compartir con todos, para que opinen, den sus criticas, constructivas espero, y nos ayuden a crear mejores proyectos.

Codigo

Clase Principal

package clases;

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class Principal extends MIDlet{

Display pantalla;
Forma forma;
    public Principal() {
     pantalla=Display.getDisplay(this);
     forma=new Forma(this);
    }

    public void startApp(){
  pantalla.setCurrent(forma);
    }

    public void pauseApp(){

    }

    public void destroyApp(boolean x){
  notifyDestroyed();
    }
}

Clase Forma

package clases;

import javax.microedition.lcdui.*;

public class Forma extends Form implements CommandListener{

 Principal midlet;
 TextField user,pass;
 Command salir,entrar;
 Image icono,logo;
 ImageItem logoEntrada;
 int intentos=0;

    public Forma(Principal midlet) {
     super("Autenticacion");
     this.midlet=midlet;
     startGui();
    }

    public void startGui(){
     cargaIcono();
     logoEntrada=new ImageItem("",logo,ImageItem.LAYOUT_CENTER,"ninguno");
     user=new TextField("Usuario:","",10,TextField.ANY);
     pass=new TextField("Clave:","",10,TextField.PASSWORD);
     salir=new Command("Salir",Command.OK,1);
     entrar=new Command("Entrar",Command.OK,2);
     this.append(logoEntrada);
     this.append(user);
  this.append(pass);
  this.addCommand(salir);
  this.addCommand(entrar);
  this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d){
     if(c==salir){
      midlet.destroyApp(true);
     }else if(c==entrar) {
         Operaciones op = new Operaciones();
         String mensaje="";
         if(op.validar(user.getString(),pass.getString())){
          Cuenta cuenta=new Cuenta();
          FormaCajero fc=new FormaCajero(midlet,cuenta);
          midlet.pantalla.setCurrent(fc);
          intentos=0;
         }else{
          intentos++;
          if(intentos>=3){
           mensaje="Error, se ha intentado loguear mas de tres veces, trate nuevamente luego.";
           Alert alerta=new Alert("autenticacion",mensaje,icono,AlertType.WARNING);
           alerta.setTimeout(Alert.FOREVER);
           midlet.pantalla.setCurrent(alerta,this);
           midlet.destroyApp(true);
          }
         }
      }
    }

      public void cargaIcono(){
       try{
        icono=Image.createImage("/logo.png");
        logo=Image.createImage("/logo.png");
       }catch(Exception e){
        e.toString();
       }
      }
}

Clase FormaCajero

package clases;

import javax.microedition.lcdui.*;

public class FormaCajero extends List implements CommandListener {

Principal midlet;
Command salir;
Cuenta cuenta;

    public FormaCajero(Principal midlet,Cuenta cuenta) {

     super("MENU",List.IMPLICIT);
     this.midlet=midlet;
     this.cuenta=cuenta;
     cargaItem();
     salir=new Command("Salir",Command.OK,1);
     addCommand(salir);
    }

    public void cargaItem(){
     this.insert(0,"Consultar Saldo",null);
     this.insert(1,"Pago Servicios",null);
     this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d){
     if(c==this.SELECT_COMMAND){
      switch(this.getSelectedIndex()){
       case 0: {
        Alert alerta=new Alert("Consulta de Saldo","Su saldo es "+cuenta.saldo,null,AlertType.WARNING);
            alerta.setTimeout(Alert.FOREVER);
            midlet.pantalla.setCurrent(alerta,this);
            break;
        }
       case 1:{
        FormaPago fp=new FormaPago(this.midlet,this,this.cuenta);
        midlet.pantalla.setCurrent(fp);
        break;
       }
      }
     }
     if(c==this.salir){
      midlet.destroyApp(true);
     }
    }
}

Clase FormaCancelar

package clases;

import javax.microedition.lcdui.*;

public class FormaCancelar extends Form implements CommandListener{

Principal midlet;
TextField txtmonto;
Command descontar;
Cuenta cuenta;
FormaPago formap;

    public FormaCancelar(Principal midlet, FormaPago formap, Cuenta cuenta) {
     super("Cantidad a Pagar");
     this.cuenta=cuenta;
     this.midlet=midlet;
     this.formap=formap;
  txtmonto=new TextField("Cantidad:","",10,TextField.ANY);
  descontar=new Command("Descontar",Command.OK,1);
  append(txtmonto);
  addCommand(descontar);
  this.setCommandListener(this);
    }

 public void commandAction(Command c, Displayable d){
     if(c==this.descontar){
      if(Double.parseDouble(txtmonto.getString())>cuenta.saldo){
       Alert alerta=new Alert("autenticacion","Error saldo insuficiente",null,AlertType.WARNING);
           alerta.setTimeout(Alert.FOREVER);
           midlet.pantalla.setCurrent(alerta,this);
      }else{
       cuenta.deducir(Double.parseDouble(txtmonto.getString()));
      this.midlet.pantalla.setCurrent(formap);
      }
     }
    }
}

Clase FormaPago

package clases;

import javax.microedition.lcdui.*;

public class FormaPago extends List implements CommandListener{

Principal midlet;
Image icono;
Command volver;
Cuenta cuenta;
FormaCajero fc;

    public FormaPago(Principal midlet,FormaCajero fc,Cuenta cuenta) {
     super("MENU",List.IMPLICIT);
     this.midlet=midlet;
     this.fc=fc;
     this.cuenta=cuenta;
     cargaItem();
     volver=new Command("Volver",Command.OK,1);
     addCommand(volver);
    }

    public void cargaItem(){
     this.insert(0,"Energia",null);
     this.insert(1,"Agua",null);
     this.insert(2,"Telefono",null);
     this.setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d){
     if(c==this.SELECT_COMMAND){
      switch(this.getSelectedIndex()){
       case 0: {
        FormaCancelar formac=new FormaCancelar(this.midlet,this,this.cuenta);
        this.midlet.pantalla.setCurrent(formac);
        break;
       }
       case 1: {
        FormaCancelar formac=new FormaCancelar(this.midlet,this,this.cuenta);
        this.midlet.pantalla.setCurrent(formac);
        break;
       }
       case 2: {
        FormaCancelar formac=new FormaCancelar(this.midlet,this,this.cuenta);
        this.midlet.pantalla.setCurrent(formac);
        break;
       }
      }
     }
     if(c==this.volver){
      this.midlet.pantalla.setCurrent(fc);
     }
    }

    public void cargaIcono(){
       try{
        icono=Image.createImage("/item.png");

       }catch(Exception e){
        e.toString();
       }
      }
}

Clase Cuenta

package clases;

public class Cuenta {

double saldo;
String nombre;

    public Cuenta() {
     saldo=500000;
     nombre="Roger";
    }

    public boolean deducir(double monto){
     if(monto<=saldo){
      saldo=saldo-monto;
      return true;
     }else{
      return false;
     }
    }
}

Clase Operaciones

package clases;

import java.io.InputStream;
import com.sun.midp.ssl.CryptoException;
import com.sun.midp.ssl.MessageDigest;
import gov.nist.core.StringTokenizer;

public class Operaciones {

 public Operaciones() {
 }
 StringBuffer sb;
 String usuario,password;

 public boolean validar(String user, String pass){
  String txt=leerArchivo();
  String userenc=encriptarString(user);
  String passenc=encriptarString(pass);
  StringTokenizer st=new StringTokenizer(txt, ',');
  while(st.hasMoreChars()){
   usuario=st.nextToken();
   usuario=usuario.substring(0, usuario.length()-1);
   password=st.nextToken();
  }
  if(userenc.equalsIgnoreCase(usuario) && passenc.equalsIgnoreCase(password)){
   return true;
  }else{
   return false;
  }
 }

 public String leerArchivo(){
  InputStream is = getClass().getResourceAsStream("/seguridad.txt");
  try{
   StringBuffer sb = new StringBuffer();
   int chr, i = 0;
   while ((chr = is.read()) != -1){
    sb.append((char)chr);
   }
   return sb.toString();
  }
  catch (Exception e){
  }
  return null;
 }

 public String encriptarString(String word) {
  StringBuffer sb = new StringBuffer();
  byte[] vectorbytes=new byte[16];
  MessageDigest md;
  try {
   md = MessageDigest.getInstance(MessageDigest.ALG_MD5,true);
   md.reset();
   md.update(word.getBytes(),0,word.length());
   short hash = md.doFinal(word.getBytes(), 0, word.length(), vectorbytes, 0);
   for (int i = 0; i < vectorbytes.length; i++) {
    String hex = Integer.toHexString(0xff & vectorbytes[i]);
    if (hex.length() == 1)
     sb.append('0');
    sb.append(hex);
   }
  } catch (CryptoException e) {
   e.printStackTrace();
  }
  return sb.toString();
 }
}

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Sr. Negativo

Simulación de pagos

Como siempre tus aplicaciones son muy buenas. No he usado JME para nada, pero en cuanto pueda lo pruebo haber que tal.

Por lo que veo es parecido a Swing (según yo). Buen post.

0_o

Agradecimiento

Gracias Sr Negativo, y si, me ha gustado trabajar con JME, y seguiremos aportando a toda la comunidad para asi todos aprender algo nuevo.

Imagen de JaimeItlzc

JME?

Que onda Roger antes que nada muy buenos ejemplos.
Pero este post abre el tema ala discusion que ha pasado con JME?

Segun en el 2008 decian que era la plataforma movil del futuro y ahorita donde esta? que le paso? que ni su propietario oracle lo usa creo. O si?

Oracle Now is free to download:
Oracle for iPhone/iPad/iPod Touch
Oracle for Android
Oracle for BlackBerry
Oracle Now for Symbian (Nokia N8) - Coming Soon!

Saludos.

Imagen de Sr. Negativo

Re: JME ?

Estuve leyendo sobre los nuevos planes a futuro de Oracle.

Tienes razón @JaimeItlzc , al parecer JME va de salida en Java 8 u 9. Pero eso será hasta 2015 o más.

JME todavía tiene mucho que dar ... aunque Android (SDK) parece ser el más usado y más comercial.

sobre jme

en el aspecto de que android e ios los cuales son catalogados como smartphones son los mas utilizados es correcto pero aun hay una gran parte de dispositivos tanto moviles y no relacionados a la telefonia que no son smartphones, en los cuales se lleva a cabo tareas con jme, asi que aun hay jme para rato, aqui lo conveniente seria ver hacia donde van a evolucionar esta seccion de dispositivos.

Recientemente me he encontrado con las plataformas arduino y netduino, donde ya no es java el lenguaje principal para dispositivos electronicos de bajo consumo.

No por gacho pero JME ya no tiene nada que dar

Es que en aquellos tiempos memorables en donde Java corría libremente por la pradera del desarrollo multiplataforma era muy atractivo para los desarrolladores hacer algo que funcionara en mi Motorola Razr V3 o en mi Nokia N-Gage o en mi Samsung V3TU4S4B3R sin más. Y a pesar de que los desarrolladores tenían sus propios SDK (Symbian tiene su SDK base C++ y Python, sobre Qt. Blackberry tiene su SDK en base a Java pero, con sus propias librerías, en Windows Mobile su .NET Compact Framework, etc.) no le ponían peros a que existiera una máquina virtual de Java.

Después en el 2007 llega un dispositivo con una filosofía muy distinta, en donde programas únicamente en el sistema operativo de dicha compañía, con las herramientas de desarrollo que te ofrece dicha compañía y únicamente con ello puedes hacerles funcionar. Aunque existía el homebrew y maneras para saltarse las restricciones, pues muchos usuarios no sabían ni estaban interesados en "hackear" sus dispositivos, de modo que para desarrollar en dicho dispositivo tenía que pasar por el aro.

Luego llega un sistema operativo móvil que tiene una mentalidad algo más abierta, sin embargo, usa una máquina virtual que no es la oficial de Java (Dalvi KVM) y pues por mucho Java que sea, serviría únicamente para dicho SO, no para ningún otro.

Tiempo después Blackberry anuncia su nuevo SDK en base a Adobe Air. En fin, muchas compañías ofreciendo sus SDK y sus tiendas de aplicaciones.

Terminamos en una regresión en donde para desarrollar para X dispositivo necesitas R SDK... Actualmente JavaME es capaz de ser ejecutado en teléfonos baratitos y en los pocos Symbian que quedan en el mercado, pero, como ya no es algo atractivo (justamente era lo chido de Java, "Java is here Java is everywhere") pues mejor me aviento la aplicación nativa.

En fin, algo triste y a mi parecer en lugar de evolucionar en desarrollo de software nos fuimos para atrás en donde existía un SDK por modelo o compañía.

Imagen de Sr. Negativo

JME Vs Android (sdk)

De plano Android lleva la delantera sobre JME:

  1. Soporte de Google
  2. Soporte de Eclipse (plugin)
  3. Y además lo más importante: los usuarios lo prefieren

Sin embargo , JME es la base de los demás sdks que han surgido para el desarrollo de apps para móviles.

Algo ya se había comentado sobre JME y Android
Aqui

Re: JME Vs Android (sdk)

Pues por mucho. Aunque yo de verdad no me decantaría por el SDK de Google
sobretodo porqué me agrada mucho el "type once run everywhere", y de momento
para las aplicaciones que yo estoy haciendo me vale con Titanium
e incluso parece que en el ramo de las animaciones va mejorando mucho.

Pero, si lo que quisiera hacer fueran animaciones o videojuegos me pasaría
a usar algo como Corona SDK.

También parece que HTML 5 viene muy fuerte para el desarrollo de aplicaciones
móviles, incluso proyectos como Boot2Gecko y Meego/Tizen apuestan por un SDK
en base a HTML 5. Habría que ver que tan limitados vamos, pero a decir por lo visto
en móviles como el N9, vaya que se va por muy buen camino... Un buen motor de
HTML como Gecko o Webkit, y sin más programando con estándares.

Es un tema interesante esto del desarrollo móvil, pero, una cosa es segura, opciones
tenemos para aventar al cielo, pueden gustar o no, pero de que hay opciones si que las
hay.

Imagen de Sr. Negativo

Re: Re: JME Vs Android (sdk)

Hay muchos SDKs para programar móviles.

Lista
SDks

  1. Sencha http://www.sencha.com/ [sdk para móviles]
  2. Titanium http://www.appcelerator.com/ [sdk para móviles]
  3. Corona http://www.anscamobile.com/corona/ [sdk para móviles]
  4. Android http://developer.android.com/sdk/index.html [sdk para móviles]

Habrá que probarlos.

0_o

Imagen de ezamudio

Motorola

Para JavaME yo he utilizado el motodev studio que está basado en Eclipse y la neta estaba bueno, pero ahora veo que es para Android, no sé si siga soportando JavaME.

Imagen de Sr. Negativo

Androiiiiid!!!!

Instalé y configuré el SDK de Android para Eclipse. Cree en AVD (le puse 300 M)

Se tarda bastante en ejecutar :@ !!!

Según es por el sistema, pero se me hace mucho tiempo solo para un simple hola mundo

Haber si mejor pruebo los demás SDK.

El emulador es lento, apesta y google lo dice

Hasta google dice que la mejor manera de probar las aplicaciones android es usando un dispositivo. Aunque recuerdo usar el sdk y en linux y mac era aceptable (bueno, después de usar el emulador de microsoft todo va que vuela).

Imagen de Sr. Negativo

Emulador lento

Si ya pude resolver el problema, al inicio de configurar el AVD puse como un límite de 100M, pero al aumentarle a 300M ya funciono.

Cuando se activa el emulador es necesario darle tiempo e ir al botón de menú para ver tu aplicación funcionando.

Voy descubriendo cosas de Android, como crear componentes con XML o código Java se ve interesante

Mi percepción

Es evidente que los dispositivos moviles han evolucionado y a gran velocidad, mi celular ahora tiene mas capacidad que mi primer computador, uno de los viejitos, increible, pero sin duda no todas las personas tienen alcance a este tipo de dispositivos, yo soy de colombia, aca todavia se usa JME y mucho, trabaje un tiempo no hace mucho, con una empresa que vendia software en JME para controlar envios, y cada conductor de un camion o carro, tenia un celular sencillo que soportaba JME, barato y bueno el servicio. No imagino a todos los conductores con Androids o Iphones. Aca creo que todavia hay mercado y para rato.

Re: Mi percepción

Pues que te diré, quizás la mejor opción para ello no era un teléfono... yo trabajé en una empresa en donde estaban empeñados en usar un teléfono para controlar justo lo que buscas, al final bastó con un teclado sencillito y una caja capaz de conectarse y enviar por GPRS la información; incluso la gente de electrónica fue quien hizo dicha caja y salía a precio de risa comparado con una solución JME (tanto en tiempo de desarrollo y en equipo), ya que nos bastó con un servicio que recibía las peticiones y ya se procesaban en el servidor.

Otra cosa que me sorprende (y mucho) es que la gente piensa que un smartphone es caro si o si. Por ejemplo, un Android que se encargue de hacer lo que dices no te tiene que costar más de $100~120 USD, incluso en export and go puedes ver muchas ofertas similares. No serán un MotoRazr o un Galaxy Nexus, pero al final son teléfonos Android capaces de hacer esas tareas. Incluso si metes algo de esfuerzo consigues teléfonos Android desfasados a muy buenos precios en Amazon y de marcas pues regularmente conocidas. Incluso he visto en Amazon teléfonos como el Xperia X10 Mini en $120~$130USD, como vez no lo veo tan apartado por el parámetro económico (y seguro que con el tiempo de desarrollo se compensa dicho costo).

Respecto a iPhone, te doy la razón. iPhone no está pensado para ser un dispositivo de uso en masa para las empresas (bueno, sólo para ciertas empresas, muy pocas) está pensado en ser un dispositivo de en base al consumo de contenido, aunque con muchas posibilidades, su enfoque es el consumo de contenido.

EDIT: Investigando un poco más me encontré con teléfonos android por debajo de los $80USD.

Imagen de Sr. Negativo

Mi percepción de Android

Solo tengo algo que decir:

mas de lo mismo

parece que no aprendemos, que si java, que si android, que si ios, symbian, etc. etc. etc.
pasa lo mismo que con los pcs de escritorio, apenas hay diferencia entre usar windows o linux (al menos en mi caso, que uso los dos todos los días, y hago las mismas tareas)
al final todas las aplicaciones serán en HTML5 y se podrán ejecutar en todos los terminales. mientras tanto perdemos el tiempo programando (al menos nos da de comer) varias veces lo mismo.