Interação de J2ME e PHP

Por que PHP com J2ME?

Você deve ter notado que no último ano ou até mesmo no ano anterior, houve um aumento no uso de aparelhos móveis, alavancando o surgimento de novas tecnologias que influenciaram as empresas desenvolvedoras de software para dispositivos móveis. Wireless está ficando mais acessível e rotineira, mas somente pessoas com bom poder aquisitivo tem acesso ainda. Uma pesquisa criada pelo IDC projetou que somente as vendas de jogos wireless gerarão aproximadamente 72.2 milhões de dólares em 2007. Acompanhando esse crescimento a demanda por novos aparelhos celulares também aumentará.

 

Tudo isso é muito bom, mas o que tem a ver com PHP? Não somente existirão milhares de novas aplicações wireless, como muitos aplicativos existentes deverão ser adaptados/modificados para funcionar com os aparelhos celulares. Na maioria dos casos fará mais sentido manter a tecnologia atual e criar uma interface com a tecnologia móvel.

 

Isso quer dizer que sites já criados com PHP precisam interagir com tecnologias móveis. Uma das tecnologias emergentes mais populares é a J2ME. J2ME é fornecida pela Sun Microsystems e é o acrônimo de Java 2 Plataform Micro Edition. Para aprender mais sobre J2ME e Java em geral, visite http://java.sun.com

 

Com J2ME é possível produzir pequenas aplicações em Java ou jogos chamados Midlets. Os Midlets estão para WML como os Java Applets estão para o HTML. Isto quer dizer que seus Midlets são executados através de um browser com suporte a WML ou podem ser baixados para que executem diretamente no aparelho.

 

Há algumas opções disponíveis que devem ser consideradas quando deseja-se comunicar PHP com J2ME.

 

HTTP Simple Fetch

HTTP GET/POST

Web Services

Fetching Images

Requirements

 

Este artigo usa tanto J2ME como PHP. Você precisará do J2ME deveolpment tool kit, que pode ser baixado em http://wireless.java.sun.com. Você também precisará de um servidor web que suporte PHP como o IIS ou o Apache. Após tudo copiado, instalado e configurado continue com o artigo.

 

Simple HTTP Fetch

Aqui há um exemplo simples de como obter dados de um arquivo texto na Internet.

Código-fonte J2ME

import java.io.*;

import javax.microedition.io.*;

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class SimpleFetch extends MIDlet {

 

    private Display display;

    

    String url = "http://127.0.0.1/midlet/helloworld.txt";

 

    public SimpleFetch() {

       display = Display.getDisplay(this);

    }

    

    public void startApp() {

 try {

            getViaStreamConnection(url);

 } catch (IOException e) {

            //Manipule as exceções da maneira que prefirir.

            System.out.println("IOException " + e);

            e.printStackTrace();

 }

    }

    public void pauseApp() {   }

    public void destroyApp(boolean unconditional) {  }

 

    /**

     * Read URL as Stream

     */

    void getViaStreamConnection(String url) throws IOException {

        StreamConnection streamConnection = null;

        InputStream inputStream = null;

        StringBuffer b = new StringBuffer();

        TextBox textBox = null;

        try {

          streamConnection = (StreamConnection)Connector.open(url);

          inputStream = streamConnection.openInputStream();

          int ch;

          while((ch = inputStream.read()) != -1) {

             b.append((char) ch);

          }          

          textBox = new TextBox("Simple URL Fetch", b.toString(), 10240);

        } finally {

           if(inputStream != null) {

              inputStream.close();

           }

           if(streamConnection != null) {

              streamConnection.close();

           }

        }        

        display.setCurrent(textBox);

    }

}

 

Código-fonte PHP

Neste caso não há nenhum código em PHP, pois o midlet acessa diretamente um arquivo texto.

O conteúdo do arquivo texto pode ser algo como:

 

Hello World!

by Jason

 

Como indicado no código J2ME o nome do arquivo texto é helloworld.txt.

Saída

Chamada por HTTP GET

Aqui um exemplo simples de chamada do PHP com parâmetros passados por GET:

Código J2ME

import java.io.*;

import javax.microedition.io.*;

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class SimpleGETExample extends MIDlet {

 

    private Display display;

 

    String url = "http://127.0.0.1/midlet/testGET.php?type=2";

 

    public SimpleGETExample() {

       display = Display.getDisplay(this);

    }

 

    public void startApp() {

 try {

            testGET(url);

 } catch (IOException e) {

     System.out.println("IOException " + e);

     e.printStackTrace();

 }

    }

 

    public void pauseApp() {    }

    public void destroyApp(boolean unconditional) {   }

 

    void testGET(String url) throws IOException {

        HttpConnection connection = null;

        InputStream is = null;

        OutputStream os = null;

        StringBuffer stringBuffer = new StringBuffer();

        TextBox textBox = null;

 

        try {

          connection = (HttpConnection)Connector.open(url);

          connection.setRequestMethod(HttpConnection.GET);

          connection.setRequestProperty("IF-Modified-Since","20 Jan 2001 16:19:14 GMT");

          connection.setRequestProperty("User-Agent","Profile/MIDP-2.0 Confirguration/CLDC-1.0");

          connection.setRequestProperty("Content-Language""en-CA");

          connection.setRequestProperty("Content-Type""application/x-www-form-urlencoded");

          os = connection.openOutputStream();

          is = connection.openDataInputStream();

          int ch;

          while ((ch = is.read()) != -1) {

            stringBuffer.append((char) ch);

          }

          textBox = new TextBox("Teste simples de GET", stringBuffer.toString(), 10240);

        } finally {

           if(is!= null) {

              is.close();

           }

           if(os != null) {

              os.close();

           }

           if(connection != null) {

              connection.close();

           }

        }

        display.setCurrent(textBox);

    }

}

 

Código PHP

<?php

$response = "Olá";

 

if (isset($_GET)) {

  switch ($_GET["type"]) {

    case 1: $response = "Bom dia"break;

    case 2: $response = "Boa tarde"break;

    case 3: $response = "Boa noite"break;

    default: $response = "Olá"break;

  }  

}

echo $response;

?>

 

Saida

O resultado gerado pelo código testGET.php dependerá do parâmetro enviado pelo midlet. Se você está familiarizado com o uso de envoi de parâmetros por GET ou POST, pode ver que não há nada de diferente quando utilizado através do midlet.

[Nota] Os resultados serão os mesmos caso queira usar GET ou POST, lembrando que seus códigos deverão manipular as requisições adequadamente. [/Nota]

WebService simples

Você provavelmente já sabe que é possível criar web services com PHP e NuSoap. Uma das grandes vantagens dos webservices é que você prove-los independentemente do sistema operacional ou plataforma que o acessa. Para saber mais sobre webservices, sugiro a leitura de um excelente artigo de Ahm Asaduzzaman's sobre Building XML Web Services with PHP NuSOAP publicado em http://www.devarticles.com/art/1/414.

Neste exemplo você precisará das APIs apropriadas para que o midlet funcione corretamente:

 

· kSOAP - http://ksoap.enhydra.org/

· kXML - http://kxml.org

 

Neste exemplo utilizaremos as versões 1.x da kSOAP e kXML.

 

Código J2ME

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import java.io.*;

import javax.microedition.io.*;

import org.ksoap.*;

import org.ksoap.transport.*;

import org.ksoap.SoapObject;

 

public class SimpleWebService extends javax.microedition.midlet.MIDlet {    

  private Display display;        

  private String url = "http://127.0.0.1/midlet/webservice/service.php";

  TextBox textbox = null;

    

  public SimpleWebService() {

    display = Display.getDisplay(this);

  }

 

  public void startApp() {

    try {  

      testWebService();

    } catch (Exception ex) {

      System.out.println(ex);   

    }

  }

 

  public void pauseApp() {

  }

 

  public void destroyApp(boolean unconditional) {

  }

 

  public void testWebService() throws Exception {

    StringBuffer stringBuffer = new StringBuffer();

    

    TextBox textBox = null;

    

    // First WebService - echos name that is passed in, in this case 'Jason'

    SoapObject client = new SoapObject(url,"hello");

    client.addProperty("name","Jason");

    HttpTransport ht = new HttpTransport(url,"hello");  

    stringBuffer.append(ht.call(client));

    // 2nd WebService - Supply 2 numbers and the result is the sum of the 

    //                  two numbers

    client = new  SoapObject(url,"add");

    client.addProperty("x","7");

    client.addProperty("y","6");

    ht = new HttpTransport(url,"add");

    stringBuffer.append("\nAdd Result: " + ht.call(client));      

    

    // display results in textbox

    textBox = new TextBox("Simple WebService Test", stringBuffer.toString(), 10240);

    display.setCurrent(textBox);

  } 

 

}

 

Código PHP

<?php

// include NuSOAP library

require_once('nusoap.php');

 

// Create Web Service Server

$server = new soap_server; 

 

// Register Services

$server->register('hello');

$server->register('add');

 

// Define Services

function hello ($name){

  return "Hello $name";

 

function add ($x,$y){

  return $x + $y;

$server->service($HTTP_RAW_POST_DATA);

?>

 

Saída

 

Viu como foi fácil? Agora seu webservice está disponível para ser acessado de qualquer plataforma.

Transmissão de imagens

Você também pode transmitir dados bináros como imagens. Se o dispositivo móvel suporta a leitura de arquivos PDF, por exemplo, você pode disponibilizá-los sem problemas através do protocolo HTTP.

Código J2ME

 

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

import javax.microedition.io.*;

import java.io.*;

 

public class SimpleImageFetch extends MIDlet

{

  private Display display;

  private String URL = "http://127.0.0.1/midlet/image/test.php";

  private Form formImage;

 

  public SimpleImageFetch()

  {

    try {

      display = Display.getDisplay(this);

      Image im = getImage(URL);

      formImage = new Form("Simple Image Test");

      formImage.append(im);

      display.setCurrent(formImage);

    } catch (Exception ex) {

      System.out.println(ex);

    }

 

}

 

  public void startApp() { }

  public void pauseApp() { }

  public void destroyApp(boolean unconditional) {  }

 

  private Image getImage(String url) throws IOException

  {

    ContentConnection connection = (ContentConnection) Connector.open(url);

    DataInputStream iStrm = connection.openDataInputStream();

    Image im = null;

 

    try {

      byte imageData[];

      ByteArrayOutputStream bStrm = new ByteArrayOutputStream();

      int ch;

      while ((ch = iStrm.read()) != -1)

        bStrm.write(ch);

      imageData = bStrm.toByteArray();

      bStrm.close();

      im = Image.createImage(imageData, 0, imageData.length);

    } finally {

      if (iStrm != null)

        iStrm.close();

      if (connection != null)

        connection.close();

    }

    return (im == null ? null : im);

  }

}

 

Código PHP

<?php

$filename = "./phpjava.png";

$handle = fopen ($filename, "rb");

$contents = fread ($handle, filesize ($filename));

fclose ($handle);

header("Content-type: image/gif");

header("Content-length: ".(string)(filesize($filename)));

echo $contents

?>

 

Saída

Além da comunicação básica através do HTTP

Geralmente, utilizamos o protocolo HTTP para realizar a comunicação, mas lembramos que há outras maneiras de realizar a comunicação entre J2ME e PHP, como SMS, e-mail e até mesmo Sockets

Lembre-se que os exemplos apresentados neste artigo são muito simples, servindo somente para introduzir o leitor ao assunto sugerido. Para criar aplicações realmente funcionais você poderá estudar os seguinte temas:

 

Manipulação de Sessions e Cookies com J2ME;

J2ME e PHP page caching;

Detecção da váriavel HTTP_USER_AGENT;

Criptografia, Base64, MD5, Bouncy Castle ( http://www.bouncycastle.org ) com MIDP 2.0 está no pacote PKI;

Latência;

Tamanho dos dados transmitidos;

Frequência da transmissão dos dados.

 

Conclusão

O objetivo deste artigo foi introduzir o leitor à interação de J2ME com PHP. Há vários artigos que tratam da interação do J2ME com JSP/Servlets e alguns mencionam a possibilidade de fazer a interação do J2ME com outras linguagens que são interpretadas por um servidor web. O que foi apresentado aqui é uma dessas possibilidades.

 

Há diversas maneiras de fazer a interação do PHP com outras páginas em PHP em servidores diferentes, assim como também é possível fazer a interação de páginas em PHP com outras linguagens. O mais importante é que este artigo demonstrou a possibilidade de interagir duas tecnologias bastante diferentes.

 

Alguns podem questionar o motivo pelo qual foram utilizadas 2 linguagens. Faria mais sentido utilizar JSP/Servlets com J2ME? Na verdade sim, se você iniciar um projeto totalmente novo, mas a intenção foi mostrar a possibilidade de aproveitar um ambiente já criado com o PHP, sendo aproveitado por uma nova tecnologia, como o J2ME. Deve-se sempre considerar as circuntâncias para optar pela reestruturação total do ambiente ou aproveitar o que já está feito. Dadas as circunstâncias, você deverá escolher o que é melhor para cada situação.

 

Nome: Jason Lam

Email: jasonlam_@hotmail.com

Jason é um entusiasta do desenvolvimento open source e wireless.

Para saber mais sobre ele visite seu site pessoal: http://www.jasonlam604.com/

 

Veja mais

Fonte: http://www.javafree.org/javabb/viewtopic.jbb?t=2248

Outro: http://www.jasonlam604.com/tutorials.php#j2me