GPS, LBS e J2ME (integração de tecnbologias)

6 respostas
liclopes

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

6 Respostas

liclopes

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 -&gt 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 -&gt 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 -&gt http://www.vivo.com.br/portal/vivo_encontra.php .

abraço. Elias.Lôgan-X

Wolf_X

soh pra confirmar. aqueles modelos do site possuem GPS embutido ou apenas a API e eu necessitaria adiquirir um acessorio???

obrigado

D

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

Fiquei com uma dúvida em relação a essa lista de celulares…como eu sei que um desses modelos apresentam GPS integrado? Pelo fato deles terem suporte a a classe location? Como faço para saber se um modelo desejado apresenta GPS integrado?Nem sempre no site do fabricante ele cita isso…

Valeu pessoal!

griciolli

Liclopes boa tarde, gostaria de saber se você sabe se existe alguma possibilidade de usar a JSR179 para pocket pc?
Att
Fabrício

P

dafukush:
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

Fiquei com uma dúvida em relação a essa lista de celulares…como eu sei que um desses modelos apresentam GPS integrado? Pelo fato deles terem suporte a a classe location? Como faço para saber se um modelo desejado apresenta GPS integrado?Nem sempre no site do fabricante ele cita isso…

Valeu pessoal!

Não tem como saber a não ser indo no site do fabricante e vendo nas especifícações a palavra “gps integrado” ou “buit-in gps”.

Por exemplo o Motorola A1200 responde TRUE a propriedade que diz que tem a API Location, mas este aparelho não tem GPS !

Os únicos que sei que tem integrado são estes da Nokia: N95, N82.

M

Me interessei pelo assunto.
Estou precisando de interligar um GPS GARMIN externo ao celular para transmitir as informações de localização usando SOAP.
Pelo que eu entendi, esse código acima faz a interligação do GPS externo ao celular, correto? Imagino essa interligação usando o próprio cabo de dados do GPS. Pode ser assim?
Alguem pode me dar mais informações, por favor?
Obrigado

Criado 6 de setembro de 2006
Ultima resposta 7 de jul. de 2010
Respostas 6
Participantes 6