GPS, LBS e J2ME

28/08/2006

1

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 = ´´;

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(´´);
// adiciona comando ao formulário
f.addCommand(cmExit);
// gerenciador de comandos
f.setCommandListener(this);
Display.getDisplay(this).setCurrent(f);
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);
// 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);
// 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 ) {
lat = qc.getLatitude().toString();
long = qc.getLongitude().toString();
alt = qc.getAltitude().toString();
// obtêm a altura
f.append(´Altura: ´+lat);
// obtêm a latitude
f.append(´Latitude: ´+long);
// obtêm a longitude
f.append(´Longitude: ´+alt);
f.append(siLocalidade);
}
// 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;

// 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
hc = (HttpConnection) Connector.open(url);
hc.setRequestMethod(HttpConnection.GET);
// 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

void findLatLong(){
LocationProvider lp = LocationProvider.getInstance(null);
Location loc = lp.getLocation(10); // 10 -- timeout
QualifiedCoordinates qc = loc.getQualifiedCoordinates();
double latitude = qc.getLatitude();
double longitude = qc.getLongitude();
System.out.println(´Latitude: ´ + latitude);
System.out.println(´Longitude: ´ + longitude);
}


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


Responder