quarta-feira, 14 de novembro de 2007

Sistema de Apoio Policial --> Trabalho de Conclusão de Curso

PROCEDIMENTO POLICIAL

A computação está sendo aplicada de forma mais intensa nos setores públicos desde o início do novo milênio. Atualmente os órgãos públicos dos governos Municipais, Estaduais e Federais estão investindo de forma significativa na integração de informações que são utilizadas pelos (e entre os) setores, instituições, etc.

As informações básicas de um veículo já podem ser consultadas pelo proprietário via internet. Entre os vários sites existentes pode-se citar o e-Detran (Departamento Estadual de Trânsito de São Paulo). Basta se cadastrar gratuitamente no site, como um cidadão, obtendo um login e senha para acesso. Através desse portal também é possível fazer solicitações como: Carteira Nacional de Habilitação definitiva; Segunda via da Carteira Nacional de Habilitação; Fazer acompanhamento das solicitações realizadas; Agendar a vistoria do veículo, com dia e hora marcada e definição do serviço de que precisa; Multas; Pontos na Carteira; Situação do veículo; etc.; porém cabe ao cidadão a decisão de se usufruir desses recursos ou não (DETRAN, 2007).

A Polícia também é um das instituições que utilizam essas informações para o seu trabalho, como exemplo ronda ou patrulhamento. Porém um grande problema é enfrentado pelos Policiais: a lenta comunicação. Muitas vezes as informações sobre determinado veículo demoram a ser repassadas pelo rádio, influenciando na velocidade e no desempenho do trabalho Policial. Um novo meio de transmitir essas informações se faz necessário e este trabalho propõe uma alternativa para a resolução deste problema.

Os Policiais, para consultar uma informação de um determinado veículo devem seguir um procedimento básico, simples, porém organizado. A Figura 3.1 mostra o diagrama de atividades do procedimento e aqui alguns pontos devem ser ressaltados:

Figura 3.1 Diagrama de Atividades do Procedimento olicial

1) A comunicação entre as viaturas e a base (COPOM) é totalmente feita por rádio, todos conversam com todos, ou seja, todos os Policiais ouvem tudo o que se passa naquela frequência de rádio. Se alguma pessoa sintonizar nessa freqüência, ela também ouvirá tudo, porém não conseguirá interferir ( _____ , 2007).

2) COPOM - Central De Operações Policiais Militares. Tendo como chefe imediato um Sargento, preferencialmente um especialista em comunicações, o COPOM é um instrumento do Comandante da Organização Policial Militar para a rápida comunicação entre todos os Policiais de serviço, agilizando e organizando o acionamento, sendo que o rádio-operador age, acionando viaturas e passando determinações, em nome do Comandante da OPM, devendo sempre estar em contato com o CPU (Comandante do Policiamento da Unidade) para repassar as determinações, conforme o caso1.

3) Quando se chama o COPOM, um sistema nacional de informações de trânsito é acessado. Qualquer órgão que tiver convênio pode ter acesso àquelas informações. Desta forma há uma integração entre os vários órgãos de trânsito, havendo compartilhamento e troca de informações e, portanto quando há alterações em um órgão conveniado, os outros são atualizados. O PRODESP - Companhia De Processamento De Dados Do Estado De São Paulo, é um órgão conveniado ( _____ , 2007).

4) Este procedimento fornece apenas as características básicas do veículo e normalmente estas são encontradas no documento do mesmo.

É importante lembrar que este é um procedimento básico da operação. Para ter certeza de que aquele veículo está regular, são necessários dois momentos: no primeiro, é realizado o procedimento citado. O veículo constando como roubado ou furtado no sistema a Polícia fará a abordagem e autuação imediata daquele veículo. Caso as informações não sejam as mesmas, a Polícia passará para o segundo momento, a Abordagem do veículo, que deverá ser feita em um local seguro. Após pedir os documentos do condutor e do veículo, a viatura Policial entrará novamente em contato com o COPOM para verificar outras informações, desta vez muito mais detalhadas. Conforme a veracidade desses dados, novas consultas serão feitas, até se chegar à conclusão de que o carro está irregular2 ou não. Neste trabalho, o foco será dado apenas para o primeiro momento do processo, sendo este adaptado para o caso em que o veículo também consta como roubado ou furtado ( _____ , 2007).

Exemplificando: um cidadão queixa na delegacia que seu carro acabou de ser roubado. Imediatamente essa informação é difundida via rádio para todas as viaturas, pois há a possiblidade deste carro estar circulando na cidade ou em uma rodovia ainda próxima a cidade. Além dessa difusão, a informação é adicionada ao PRODESP (que automaticamente é atualizada pra todos os outros órgãos conveniados). A partir daí, as viaturas designadas farão a busca do veículo. Se a cidade for grande, os Policiais avistarão muitos carros com as mesmas características descritas pelo COPOM. Sendo assim, os Policiais terão a necessidade de confirmar algumas informações antes de fazer a abordagem de um carro considerado suspeito, para ter certeza que não estarão perdendo tempo parando aquele veículo sem necessidade, evitando também constrangimentos e transtornos tanto para o condutor do veículo e passageiros, quanto para a própria Polícia ( _____ , 2007).

Em um caso como este, não se pedirá ao COPOM para verificar todas as placas dos carros que forem avistados, pois isso causaria um congestionamento na via de comunicação e, portanto, apenas os carros que os Policiais considerarem suspeitos e sentirem necessidade de colher mais informações é que serão consultados. Uma observação a ser feita neste exemplo é que duas situações graves podem ocorrer:

1) Um carro idêntico ao descrito é encontrado, porém com uma placa diferente. Com a consulta ao PROCOM, verifica-se que aquela placa é fria, ou seja, ela não existe legalmente e, portanto aquele carro pode ter sido roubado ou furtado ( _____ , 2007).

2) Um carro idêntico ao descrito é encontrado, inclusive a placa é a mesma, mas ele é de outro proprietário. Provavelmente, este é um carro dublê. Assim como acontece nas linhas de telefones celulares em que alguém usa a linha e quem paga pelos gastos é o dono, o mesmo acontece com os carros dublês, alguém o usa, gera multas e perde pontos na carteira, mas na verdade quem sai prejudicado, arcando com todas as conseqüências é o dono verdadeiro do veículo ( _____ , 2007).

Portanto, o trabalho Policial na busca de informações de trânsito é delicado, conforme foi mostrado na descrição deste procedimento. Este trabalho tentará otimizar essa busca, incluindo itens de suma importância no retorno dessas informações. No capítulo a seguir o sistema será apresentado.

1 Conforme site da Policia Militar do Paraná:

http://www.pmpr.pr.gov.br/pmpr/modules/conteudo/conteudo.php?conteudo=1194

2 Irregular: licenciamento vencido, IPVA vencido, etc, enfim, qualquer tipo de irregularidade.


MODELAGEM DA APLICAÇÃO J2ME

O Sistema de Apoio Policial tem como objetivo facilitar o trabalho da Polícia Militar. Utilizando tecnologias recentes descritas nos capítulos anteriores, este sistema propõe uma solução para o problema de acesso às informações de veículos1 para a Polícia. Através de um celular com suporte à Java e acesso à web (e a um banco de dados), os policiais obterão com maior rapidez as informações de que necessitam.


Artefatos de Requisitos

Basicamente, o sistema possuirá um software que através do Login/Senha fornecidos se conecta a web e ao banco de dados. Com a autenticação feita, o policial escolherá o tipo de consulta que será feita: Placa ou Chassi. Após a escolha ele deverá digitar ou o número do chassi (caso for consulta por chassi) ou o número da placa (caso seja consulta por placa). Em seguida, a consulta será feita no banco de dados e na tela retornarão as informações relacionadas àquela placa (ou chassi). Terminada a pesquisa, a conexão e a aplicação são encerradas pelo policial ou uma nova consulta poderá ser realizada. As Tabelas 4.1 e 4.2 mostram as funções e os atributos do sistema.

Tabela 4.1 Funções para o Sistema de Apoio Policial.

Tabela 4.2 Atributos para o Sistema de Apoio Policial.


4.2 Diagramas de Caso de Uso

Figura 4.1 Diagrama de Caso de Uso – NetBeansIDE5.5

O público que utilizará este sistema é variado, alguns leigos e outros não e, portanto é necessário levar esse item em consideração, buscando desenvolver uma aplicação de fácil usabilidade para o usuário final. Desta forma serão utilizadas mensagens e telas simples com formulários, tanto para digitação, quanto para o retorno das informações.

No Caso de Uso EfetuarLogin, o Policial, devido à necessidade de buscar mais informações, inicia a aplicação no celular, sendo mostrado em seu display a tela inicial onde deverá digitar o Login/Senha e apertar o botão conectar. Na ação de apertar o botão conectar, o software mostrará mensagem automática de conexão à rede e as informações dos campos serão validadas através da conexão ao banco de dados. Se o Login/Senha existir no banco de dados, uma tela de confirmação será retornada. Caso Login/Senha estejam incorretos ou não existam no banco de dados, uma tela de erro será retornada ao usuário.


Caso de Uso1


No Caso de Uso ConsultarPlaca o Policial apenas digitará a placa do automóvel que deseja consultar. Quando clicar no botão buscar, o sistema fará a verificação de existência da placa no banco de dados. Se a placa existir, as informações no banco de dados retornarão na tela do celular em alguns segundos, caso não exista, uma mensagem de erro será retornada.


Caso de Uso2


No Caso de Uso ConsultarChassi o Policial apenas digitará o chassi do automóvel que deseja consultar. Quando clicar no botão buscar, o sistema fará a verificação de existência do chassi no banco de dados. Se o chassi existir, as informações no banco de dados retornarão na tela do celular em alguns segundos, caso não exista, uma mensagem de erro será retornada.


Caso de Uso3


Diagrama de Classes

Figura 4.2 Diagrama de Classe: Classe Usuario – NetBeansIDE5.5

Figura 4.3 Diagrama de Classe: Classe Veiculo – NetBeansIDE5.5


4.4 Diagramas de Seqüência

Nos diagramas de seqüência a seguir são mostradas as trocas de mensagens entre o Policial e o Sistema de Apoio Policial.

Figura 4.4 Diagrama de Seqüência: EfetuarLogin – NetBeansIDE5.5

Contrato1

Figura 4.5 Diagrama de Seqüência: ConsultarPlaca – NetBeansIDE5.5

Contrato2

Figura 4.6 Diagrama de Seqüência: ConsultarChassi – NetBeansIDE5.5

Contrato3

4.5 Diagrama de Atividade

Figura 4.7 Diagrama de Atividade – NetBeansIDE5.5

4.6 Diagrama de Implementação

Figura 4.8 Diagrama de Componente – NetBeansIDE5.5

Figura 4.9 Diagrama de Implantação – NetBeansIDE5.5


Banco de Dados

Código

Esta seção abordará comentários sobre o código desenvolvido para a aplicação do servidor e também para a aplicação cliente.

Como mostrado nos diagramas de componentes e de implantação, de um lado, o cliente, foi utilizado um programa que simula um dispositivo móvel para a configuração CLDC 1.0 e o perfil MIDP 2.0. O Sun Wirelles Toolkit 2.5 é de uso obrigatório para outros programas, como o Netbeans, para desenvolvimento e simulação das aplicações móveis. Do outro lado foi utilizado um servidor web para aplicações Java, o web container Tomcat5 (suporte à Servlet 2.4, JSP 2.0, versão J2EE 1.4) trabalhando junto com o banco de dados MySQL 5.

A aplicação do lado cliente (aplicação móvel) foi desenvolvida no NetBeans5.5. A figura 4.12 mostra o flow design da aplicação desenvolvida através da opção Visual Midlet do NetBeans.

O Flow Design funciona como um fluxo da aplicação, tornando a programação mais produtiva. A aplicação cliente possui então, quatro formulários: login, escolha do tipo de consulta, consultar por placa e consultar por chassi. No formulário principal, foram incluídos dois botões, um para sair da aplicação e outro para logar. No formulário para escolha do tipo de consulta, existem quatro botões: placa – para ir ao formulário da consulta por placa, chassi – para ir ao formulário da consulta por chassi, sair – para sair da aplicação e voltar – para voltar à tela de login.

Figura 4.10 Flow Design – NetBeansIDE5.5

Quando o usuário escolher placa, o formulário para placa será chamado e mostrado no display. Este possui quatro botões: sair – para sair da aplicação, voltar – para voltar à tela de escolha do tipo de consulta, consultar – para fazer a busca no banco e ir para chassi – para escolher o formulário chassi. O formulário para o chassi é chamado quando o usuário clica no botão consultar por chassi. Assim como o formulário placa, este também possui quatro botões: sair – para sair da aplicação, voltar – para voltar à tela de escolha do tipo de consulta, consultar – para fazer a busca no banco e ir para placa – para escolher o formulário placa.

No lado servidor, um servlet foi desenvolvido utilizando também o NetBeans 5.5. O servlet recebe o pedido do cliente através de uma string url e apartir dela é possível tratar a comunicação com o banco de dados e também o envio da resposta para o cliente, tudo através da conexão HTTP.

De forma resumida, a seguir, é apresentado o que ocorre nesta conversa entre cliente e servidor nos códigos fontes de cada um.

Ao clicar no botão logar, a classe ThreadHttpConnection é chamada. No primeiro bloco try/catch ocorre a seguinte situação: se houver um erro de conexão HTTP ou no servidor, este erro será retornado ao cliente no display. Caso a conexão seja estabelecida, o servidor fará a comparação da string command enviada ao final da url para saber o que fazer.

APLICAÇÃO CLIENTE

//início da classe

1 private class ThreadHttpConnection extends Thread {

//a linha 2 envia a string url de conexão web via http (método post) para o servidor

2 public String url = "http://localhost:8084/ServerSAP/ServerSAP?command=fazerlogin";

:

:

:

APLICAÇÃO DO SERVIDOR

//início do método POST

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

//abre o envio e recebimento de dados

dis = new DataInputStream( ( InputStream ) request.getInputStream() );

dos = new DataOutputStream( ( OutputStream ) response.getOutputStream() );

// define uma string chamada command para comparar a string que está chegando do cliente e com ela saber o que fazer em seguida

String command = request.getParameter( "command" );

System.out.println( "n String command recebida... " + command );

// se o comando que está chegando do cliente estiver vazio

if ( ( "" ).equals( command ) ) {

// imprime no console

System.out.println( "n String command vazia" );

}

// se o comando que está chegando do cliente é o comando fazer login

else if ( ( "fazerlogin" ).equals( command ) ) {

:

:

:

Se a string enviada pelo cliente for a que corresponde a fazerlogin, então, o servlet fará o gerenciamento de sessão e buscará os dados no banco.

O gerenciamento de sessão deve sempre ser utilizado em aplicações deste tipo. Isto porque o protocolo HTTP não tem estado e também não possui nenhuma conexão persistente entre o cliente e o servidor. Portanto, a interação entre eles poderá ocorrer se o servidor reconhecer que os pedidos estão vindo do mesmo cliente. Neste trabalho utilizou-se a reescrita de url para sanar este problema. O servlet criará então apartir da string url fornecida uma nova sessão e um ID de sessão correspondentes para poder controlar os pedidos do cliente, isto é também conhecido como controle de sessão. Com isto, um cabeçalho é enviado ao cliente e nele é indicado o novo url reescrito. Ao receber a resposta do servlet, o cliente procura por um cabeçalho indicando o novo url e após este passo, cada pedido do cliente, usando este novo url reescrito, faz com que seja possivel para o servlet reconhecer quem inicou o pedido (MUCHOW, 2004).

O código a seguir, desenvolvido para esta aplicação, mostra como o servlet e o midlet faz este tratamento.

APLICAÇÃO DO SERVIDOR

:

:

:

//inicia o bloco try/catch que trata da requisição do cliente

try {

// obtém informações da sessão

HttpSession session = request.getSession( true );

System.out.println( "n Session... " + session );

// se for uma sessão nova, reescreve o URL do cliente

if ( session.isNew() ) {

// obtém o URL

String incomingURL = request.getRequestURL().toString();

System.out.println( "n incomingURL... " + incomingURL );

// codifica e adiciona o ID de sessão no URL

String URLwithID = response.encodeURL(incomingURL);

System.out.println( "n URLwithID... " + URLwithID );

// devolve um cabeçalho para o cliente, com o novo URL

response.setHeader( "Custom-newURL", URLwithID );

System.out.println( "n URLwithID... " + URLwithID );

}

:

:

:

Com a conexão estabelecida, o cliente envia os dados de login para que o servidor busque no banco de dados e verifique sua existência.

APLICAÇÃO CLIENTE

:

:

:

//inicio da thread

public void run() {

HttpConnection http = null;

//bloco try/catch: envia dados para o servidor

try {

//abre a conexão http

http = (HttpConnection)Connector.open(url, Connector.READ_WRITE);

//informações de cabeçalho exigido pelo método POST (headers ou cabeçalho normalmente tem um nome e um valor que estão sempre no formato string)

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

http.setRequestProperty("Content-Language", "en-US");

//método POST

http.setRequestMethod(HttpConnection.POST);

//abre a saída de dados

dos = http.openDataOutputStream();

//envia a string login

dos.writeUTF(login.trim());

//força o envio dos dados

dos.flush();

//imprime no console a url e o login enviados ao servidor

System.out.println( "n Enviando String url: " + url );

System.out.println( "n Enviando String Login: " + login );

System.out.println( "n Conectando com o servidor para fazer o login" );

}

:

:

:

O servidor recebe a string e faz a busca no banco.

APLICAÇÃO DO SERVIDOR

:

:

:

//o servidor lê a string que veio do cliente

String login = dis.readUTF();

// escreve no console a string login que veio do cliente

System.out.println( "n String login recebida... " + login );

//bloco try/catch: busca dos dados no banco e imprime tudo no console

try {

// prepara a Statement

ps = this.con.prepareStatement(sqla);

System.out.println( "n prepare statement... " + sqla );

// seta o valor “?” da String sql

ps.setString( 1, login );

System.out.println( "n string login para consulta... " + login );

//executa a query de consulta

rs = ps.executeQuery();

System.out.println( "n rs... " + rs );

System.out.println( "n ps... " + ps );

}

:

:

:

Após a consulta, o servlet fará a verificação de null. Mesmo que o conteúdo de loginResult seja null, este resultado será enviado ao cliente, que se encarregará do tratamento adequado. Com o IF, é possível identificar quando ocorre o null na busca.

APLICAÇÃO DO SERVIDOR

:

:

:

//ser loginResult for igual a null então

if ( ( "" ).equals( loginResult ) ) {

System.out.println( "n if loginResult == null --> String loginResult tem o valor... " + loginResult );

// retorna para o cliente o resultado da busca

response.setContentType("text/plain");

dos.writeUTF(loginResult);//saída de dados

dos.writeUTF(senhaResult); //saída de dados

System.out.println( "| Enviando loginResult: " + loginResult + " | Enviando senhaResult: " + senhaResult );

dos.flush(); // força o envio para o cliente

dis.close(); // fecha a entrada de dados

dos.close(); // fecha a saída de dados

}

//ser loginResult for diferente de null então

else {

System.out.println( "n if loginResult < > null --> String loginResult tem o valor... " + loginResult );

// retorna para o cliente o resultado da busca

response.setContentType("text/plain");

dos.writeUTF(loginResult); //saída de dados

dos.writeUTF(senhaResult); //saída de dados

System.out.println( "| Enviando loginResult: " + loginResult + " | Enviando senhaResult: " + senhaResult );

dos.flush(); // força o envio para o cliente

dis.close(); // fecha a entrada de dados

dos.close(); // fecha a saída de dados

}

:

:

:

No cliente, primeiro é feito o controle de sessão:

APLICAÇÃO CLIENTE

:

:

:

//bloco try/catch: tratamento da resposta do servidor

try {

//abre a entrada de dados

dis = http.openDataInputStream();

//bloco try/catch: gerenciamento de sessão

try {

//obtém informações de cabeçalho

String URLwithID = http.getHeaderField("Custom-newURL");

System.out.println( "n URLwithID: " + URLwithID );

//se o cabeçalho possui um URL reescrito, então:

if(URLwithID != null) {

url = URLwithID; //atualiza o URL para todos os pedidos futuros da servlet

System.out.println( "n Url: " + url );

}

}

//se qualquer erro ocorrer neste ponto, é mostrado um alert.

catch (IOException ex) {

System.out.println( "n Passei no catch Reescrita de URL..." + ex.toString() + " n " );

showAlert( " n Foi encontrado o seguinte erro...n" + ex.getMessage() + " n " );

getDisplay().setCurrent(get_alert1(), get_formPrincipal());

ex.printStackTrace();

}

:

:

:

Em seguida é feita a leitura das strings que estão chegando do servidor. Se loginResult for igual a null, então o texto “Dados não encontrados” é setado no item “StringItem” do formulário, mostrando para o usuário que a busca retornou um erro. Caso loginResult for diferente de null, então um alert será mostrado com o resultado da busca.

APLICAÇÃO CLIENTE

:

:

:

try {

loginResult = dis.readUTF();//entrada de dados

senhaResult = dis.readUTF();//entrada de dados

System.out.println( "n String loginResult tem o valor... " + loginResult + " String senhaResult tem o valor... " + senhaResult);

//se loginResult e senhaResult forem igual a null então imprime no console o que chegou e vai para o catch

if ( ("").equals(loginResult) && ("").equals(senhaResult) ){

System.out.println( "n if loginResult == null --> String loginResult tem o valor... " + loginResult + "String senhaResult tem o valor..." + senhaResult);

}

//se loginResult e senhaResult forem diferente de null então

else {

try {

System.out.println( "n if loginResult < > null --> String loginResult tem o valor... " + loginResult + "String senhaResult tem o valor..." + senhaResult);

alertResult = new Alert( "n Seja Bem Vindo(a):n ","n Bem Vindo(a): n " + loginResult, null, AlertType.CONFIRMATION) ;

alertResult.setTimeout(Alert.FOREVER);

getDisplay().setCurrent(alertResult, get_formEscolha());

getDisplay().vibrate(1000);

dos.close();//fecha a saída de dados

dis.close();//fecha a entrada de dados

http.close();//fecha a conexão http

} catch (IOException ex) {

ex.printStackTrace();

}

}

}

//passa aqui quando loginResult e senhaResult for igual a null

catch (IOException ex) {

System.out.println( "n Passei no catch login result..." + ex.toString() + " valor de loginResult " + loginResult);

stringItemFormPrincipal.setLabel("Erro: ");

stringItemFormPrincipal.setText("Dados não encontrados. Por favor, Faça seu login novamente!");

getDisplay().setCurrent(get_formPrincipal());

textFieldLogin.setString("");

textFieldSenha.setString("");

//ex.printStackTrace();

}

:

:

:

O código para consulta por placa e por chassi é semelhante, o conceito é o mesmo e, portanto não há necessidade de comentá-los. O código fonte completo da aplicação cliente e servidor encontra-se no CD que acompanha este trabalho.

1 Entenda-se por veículos motos, carros, caminhões, enfim, meios de transporte terrestre.


CONCLUSÃO

A linguagem J2ME está em sua plena forma no mundo atual, sendo portanto muitíssimo utilizada para desenvolvimento de diversas aplicações, desde as mais simples até as mais complexas. As empresas descobriram o que é possível fazer com todas essas ferramentas e tecnologias disponíveis e estão cada vez mais investindo nesta área devido aos inúmeros benefícios fornecidos e portanto, a tendência é a de que este mercado cresça e se fortaleça.

Os estudos bibliográficos realizados e discutidos nos capítulos 1 e 2 deste trabalho, confirmam o quão veloz evoluem as tecnologias no mundo da computação. No início deste projeto, existiam apenas celulares com suporte para MIDP 2.0. Porém ao término deste, o MIDP3.0 foi lançado e aparelhos com suporte para a nova especificação de JME estão sendo vendidos em peso no mercado.

Para os desenvolvedores desta área, o desafio é sempre a palavra chave de seu trabalho. Constantes mudanças dos fabricantes e do JCP obrigam o desenvolver a estar sempre antenado no que está acontecendo ao seu redor e a atualizar-se rapidamente para que não fique ultrapassado.

Graças a todo esse esforço em evoluir, a idéia deste projeto pôde ser concretizada. Como já dito anteriormente, a implantação deste projeto no mundo real leva em conta outros fatores que fogem ao escopo desta monografia, como por exemplo o envolvimento da Policia Militar e toda a burocracia carregada com a instituição.

Por fim, conclui-se que o objetivo deste trabalho foi alcançado e como extensão de trabalho possíveis melhorias na segurança dos dados transferidos entre o celular e o servidor podem ser realizadas.

0 comentários: