GPS, LBS e J2ME (Integração de tecnologias)

2 respostas
L

serviços baseados em localização (LBS) utilizando dados GPS (dados geométricos de lattitude-longitude-altura) e a classe javax.microedition.location de J2ME (JSR 179). Como é um assunto pouco discutido, queria amostrar um exemplo para começar

ilustração da posição física do dispositivo móvel.

para dispositivos móveis

// classes de uso do j2me
 import javax.microedition.midlet.*;
 import javax.microedition.lcdui.*;
 import javax.microedition.location.*;
 
 public class locationMidlet extends Midlet implements CommandListener {
     // criação do comando sair
     Command cmExit = new Command("Sair",Command.EXIT,0);
     Command cmPesquisar = new Command("Pesquisar", Command.SCREEN, 2);
     private String lat = "";
     private String long = "";
     private String alt = "";
     private String met = "";
 
     public locationMidlet() {}
     
     public void startApp() {
         // criação do formulário com titulo
         Form f=new Form("Esperando...");
         // subtitulo
         f.append("Procurando por localização...");
         // amostrará o resultado da consulta do servlet LBS 
         StringItem siLocalidade = new StringItem("", "");
         String ErroMsg = new String("");
         String lat = new String("");
         String long = new String("");
         String alt = new String("");
         String met = new String("");
         // adiciona comando ao formulário
         f.addCommand(cmExit);
         // gerenciador de comandos
         f.setCommandListener(this);
         Display.getDisplay(this).setCurrent(f);
         thread tGetLocation = new thread(){
             public void run(){
                  try{
	       // obtêm uma instância da classe Location
                       LocationProvider lp=LocationProvider.getInstance(c);
                       // pega a localização com tempo limite de 60s
                       Location loc=lp.getLocation(60);
                  }
                  catch(LocationException e){
                       f.append("Exception: "+e);
                  }
                  catch(InterruptedException e){
                       f.append("Exception: "+e);
                  }
             }

         }; 

         try {
             // obtêm uma instancia um criteria
             Criteria c=new Criteria();
             // Precisão de 1000m horizontalmente e verticalmente
             c.setHorizontalAccuracy(100);
             c.setVerticalAccuracy(100);
             // ajusta o nível máximo preferido do consumo de potência (pouco uso)
             c.setPreferredPowerConsumption(Criteria.POWER_USAGE_LOW);
             AlertType.INFO.playSound(m_Display);
             tGetLocation.start();
             tGetLocation.join();
             f.append(found(loc)+"location");
             // obtêm uma instancia um Qualified Coordinates que representa as coordenadas 
             QualifiedCoordinates qc=loc.getQualifiedCoordinates();
             // uso das informações de coordenadas, vincula (exibição) ao formulario (display)
             // Caso haja coordenadas de localização
             if((qc != null) || (location.isValid())) {
                 // obtêm a latitude
                 lat = Coordinates.convert(qc.getLatitude(), Coordinates.DD_MM_SS), "");
                 // obtêm a longitude
                 long = Coordinates.convert(qc.getLongitude(), Coordinates.DD_MM_SS), "");
                 // obtêm a altura
                 alt = Coordinates.convert(qc.getAltitude(), Coordinates.DD_MM_SS), "");
                 String locate = c.convert(alt,1);
                 // obtêm a método de localização
                 met = location.getLocationMethod();

                 // exibe a altura
                 f.append("Altura: "+lat);
                 // exibe a latitude
                 f.append("Latitude: "+long);
                 // exibe a longitude
                 f.append("Longitude: "+alt);
                 // exibe o método
                 f.append("Método: "+met);
                 // exibe a localizadde
                 f.append(siLocalidade);
                 // atualiza o display
                 display.setCurrent(f);
             }
             else{
	// caso a localização ou as coordenadas não é valida.
	String msg = location.getExtraInfo(application/X-jsr179-location-nmea);
                f.append("Localização não válida: "+msg);
             }
          // tratamento de erro, 
         } catch(Exception e) {
             f.append("Exception: "+e);
         }
     }
     // função orbigatoria do midlet (pausa)
     public void pauseApp() {}
     // função orbigatoria do midlet (saida)
     public void destroyApp(boolean destroy) {}
     // gerenciador de ação (comando)
     public void commandAction(Command c, Displayable s) {
         if (c == cmExit) {
             destroyApp(true);
             notifyDestroyed();
         }
 
         else if (c == cmPesquisar) {
             PesquisarGet();
         }
     }
 
 
     // Acesso ao Servlet Usando metodo Get
     public void PesquisarGet() throws IOException {
 	// Criação dos elementos HttpConnection e InputStream utilizados numa conexão do tipo GET
         HttpConnection hc = null;
         InputStream is = null;
         boolean ret = false;

         thread tConnection = new thread(){
              public void run(){
	    // Inicializa uma conexão
                    hc = (HttpConnection) Connector.open(url);
                    hc.setRequestMethod(HttpConnection.GET);
               }
        };
 
         // Definição de URL que enviara os dados (coordenadas) para a pesquisa
         String url = "http://ENDEREÇO_DO_SERVLET:8080/" + "?" + "latitude=" + lat + "&longitude=" + long
 
         try{
 	// Inicializa uma conexão
                AlertType.INFO.playSound(m_Display);
                tConnection.start();
                tConnection.join();
                // Inicia o InputStream para troca de mensagens
                is = hc.openInputStream();
                ret = processResposta(hc, is) 	    
         }
 
         finally{
             if (is != null)
 	       // Finaliza conexão
 	        is.close();   
 	    if (hc != null)
 	       	hc.close();
 	}
 
 	if(ret == false)
 	    showAlert(erroMsg);
 	
     }
 
     // Processa uma reposta do Servlet
     public boolean processResposta(HttpConnection hc, InputStream is) throws IOException { 	       
 	erroMsg = null; 
             // se conexão realizada e resposta OK enviada, calcula o tamanho da resposta (resultado)
 	if(hc.getResponseCode() == HttpConnection.HTTP_OK){
             int length = (int) hc.getLength();
             string str;
              
             if(length != -1){
                byte servletData[] = new Byte[lenght];
                // recebe resposta do servlet e depois guarda em str
                is.read(servletData);
                str = new string(servletData);
             }
             else{  
                ByteArrayOutputstream bos = new ByteArrayOutputstream();
                int ch;
                while(ch = is.read() != -1)
                bos.write(ch);
             
                str = new String(bos.toByteArray());
                bos.close()
          }
          // amostra o resultado (resposta do servlet) no display   
          siLocalidade.setText(str);
          return true;
 	}
 	else{
 	    erroMsg = new String(hc.getResponseMessage());
 	    return false;
 	}
 	// Mostra alerta
 	private Void showAlerta(String msg){
 	    alErro = new Alert("Erro", msg, null, AlertType.ERROR);
 	    alErro.setTimeout(Alert.FOREVER);
 	    display.setCurrent(alErro, fmPrincipal);
 	}
 } fim da classe locationMidlet

Código para usa ro GPS no desktop

import javax.microedition.location;
 //...

 void findLatLong(){
     LocationProvider lp = LocationProvider.getInstance(null);
     Location loc = lp.getLocation(10);
     QualifiedCoordinate qc = LocationProvider.getInstance(
          new Criteria()).getLastKnownLocation().getQualifiedCoordinates() ;
     String exinf = l.getExtraInfo("text/plain");
     System.out.println("A palavra é... " + exinf); 
     if ((qc != null) || (location.isValid()){
        double latitude = qc.getLatitude();
        double longitude = qc.getLongitude();
        String locate = c.convert(alt,1);
        graphics.drawString(locate,4,30,Graphics.TOP|Graphics.LEFT); 
        System.out.println("Latitude: " + latitude);
        System.out.println("Longitude: " + longitude);
        System.out.println("Método: "+location.getLocationMethod());
     else{
        // caso a localização ou coordenadas não é valida.
        String msg = location.getExtraInfo(application/X-jsr179-location-nmea);
	System.out.println(Localização não valida: +msg);
     }

 }

Código da classe do servlet (servidor web) que receberá as coordenadas (dados gps) e realizará a consulta

Classe do servlet

import javax.servlet.http.*;
 import javax.servlet.*;
 import java.io.*;
 import java.util.*;
 import java.sql.*;
 
 public class gpsServlet extends HttpServlet {
      
      // Procedimento doGet (recebimento de solicitação do cliente)
      public void doGet(HttpServletRequest req, HttpServletResponse res)
      throws ServletException, IOException {      
         
         // Captura os dados passados por parametro atraves do endereço URL
         String latitude = request.getParameter("latitude"),
         	longitude = request.getParameter("longitude");
         String localidade = pesquisaLocal(latitude, longitude);
 
         // se resultado vazio, amostra msg de erro
         if(localidade == null){
 	    res.SendError(res.SC_BAD_REQUEST, "Nao possivel localizar o local");
 	    return;
 	}
 	
 	res.SendContentType("text/plain");
 	// Inicializa o objeto PrintWriter que vai escrever(enviar pro dispositivo) a resposta
         PrintWriter out = res.getWriter();
 	out.print(localidade);
 	out.close();
 	desconectar();
      }
 	
      // Pesquisa num banco de dados
      public String pesquisaLocal(String latitude, String longitude){
 	Connection conn = null;
 	Statement st = null;
 	StringBuffer msgb = new StringBuffer("");
                // commando básico de pesquisa em um BD 
 	String sql = Select LOCALIDADE From DADOS_LOCALIDADE Where latitude = " + latitude + "And longitude = " + longitude + "'"
 	
 	try{
                 // informações sobre o BD ussado ,no caso hsqldb
 	    Class.forName("org.hsqldb.jdbcDriver");
                 // nome do usuário (login), senha e endereço url do BD
             String user = "sa";
             String password = "";
       	    String url = "jdbc:hsqldb:hsql://localhost";            
 	    conn = DriverManager.getConnection(url,user,password);
 
 	    Statement stm = conn.createStatement();
 	    ResultSet rs = stm.executeQuery(sql);
 
 	    // retorna o resultado da pesquisa
 	    if(rs.next())
 	        return rs.getString(1);
 	    else
 	        resturn null;
 	 }
 	 // Erro ao acessar o banco de dados
         catch(ClassNotFoundException e) {
             resp = "* ERRO: BANCO DE DADOS INACESSIVEL! ";
             // e.printStackTrace(); // Esta linha iria imprimir no console informações sobre o erro obtido
         }
         
         // Erro ao executar a consulta sql
         catch(SQLException e) {
             resp = "* ERRO: CONSULTA SQL INVÁLIDA!";
             // e.printStackTrace();
         }
      }
 
      // Finaliza a conexão com o banco de dados
      public void desconectar() throws SQLException {
         this.conn.close();
      }
 }

Abraço Elias.Lôgan-X

2 Respostas

L

Celulares novos já foram lançados c/ gps integrando e com suporte a classe location. vai nesse site e ve as listas dos dispositivos que suportam a classe -> http://j2mepolish.org/devices/devices-locationapi.html

é uma saida usar um módulo GPS externo, via Bluetooth. Abaixo tem um link com um exemplo (src code):

Accessing GPS receiver from mobile phone via bluetooth -> http://www.hcilab.org/documents/tutorials/BT_GPS/BT_GPS.htm

Vai no site da vivo que eles explicam qual a função da operadora em relação ao aplicativos lbs -> http://www.vivo.com.br/portal/vivo_encontra.php .

abraço. Elias.Lôgan-X

M

Elias,
Estava precisando fazer a conexão inversa…

Tenho uma aplicação em JEE e gostaria de verificar a localização de um aparelho em específico usando LBS.

Voce tem alguma idéia de por onde posso começar??

Muito Obrigado,
Leandro.

Criado 4 de setembro de 2006
Ultima resposta 13 de mar. de 2007
Respostas 2
Participantes 2