Conectividade de cliente J2ME

Propaganda
CONECTIVIDADE
Desenvolvimento de Sistemas WEb
Computação Móvel
Conectividade em Java ME

Conectividade( redes) em Java ME:
◦ Flexível para suportar uma variedade de
dispositivos
◦ Muitos dispositivos específicos ao mesmo
tempo.

Solução:
◦ GCF (Generic Connection Framework)
◦ Foi criado para oferecer conectividade de
acordo com as características heterogêneas
do ambiente de computação móvel
GCF (Generic Connection Framework)



A ideia do GCF é definir as abstrações de rede e
arquivos I/O de forma tão genérica quanto
possível.
Essas abstrações são definidas como interfaces
Java.
Os fabricantes de dispositivos escolhem quais
interfaces serão implementadas e aplicadas com
base nas capacidades de seus dispositivos MIDP.
GCF (Generic Connection Framework)

Composto por duas classes:
◦ Connector e PushRegistry

A classe Connector é usada para criar objetos de
conexão

A classe PushRegistry é usada para manter uma lista
de conexões de entrada
GCF (Generic Connection Framework)
Interfaces
As interfaces de conexão do GCF definem os tipos
de comunicação que podem ser realizadas
 Conexões simples de entrada e saída
 Conexões com datagramas (transmissão de
pacotes sem mecanismo de confiança)
 Com sockets (um link de comunicação fim-a-fim
em redes IP)
 Com HTTP (Hypertext Transfer Protocol, protocolo
de transmissão de dados entre clientes e
servidores)
 Entre outras formas….

Consultar a documentação!!!!
GCF – Diagrama de Classes Básico
Fonte: Jakl, 2009 - http://www.symbianresources.com
GCF – Diagrama de Classes MIDP
Fonte: Jakl, 2009 - http://www.symbianresources.com
GCF (Generic Connection Framework)
Pacotes Opcionais
 Bluetooth
 Arquivos
 SmartCards
 Messaging
 ….
GCF (Generic Connection Framework)
A URL de Conexão
Argumentos de conexão são especificados através do seguinte formato de endereçamento:
GCF (Generic Connection Framework)
Classe Connector
A classe Connector implementa os métodos necessários
para abertura de conexões
 Essencialmente, essas conexões podem ser usadas para
enviar (escrever) e receber (ler) dados
 Os tipos de conexão podem ser:
◦ WRITE : Modo de acesso somente escrita – envio de
dados
◦ READ : Modo de acesso somente leitura – recepção
de dados
◦ READ_WRITE : Modo de acesso de leitura e escrita


Ao criar uma conexão, é opcional a definição do modo
de acesso. Porém, se o modo de acesso não for
especificado, o modo READ_WRITE é usado por padrão
GCF (Generic Connection Framework)
Classe Connector – Métodos Relacionados


O método mais básico a ser usado é o da criação
da conexão:
◦ Connection open (String string_conexao)
A String de conexão deve seguir o formato
◦

protocolo:[alvo][parâmetros]
protocolo: indica o tipo de conexão a ser criada
◦ Deve-se escolher esse parâmetro de acordo com
a necessidade da aplicação
◦ Tipos de protocolo:
socket, datagram, http, file e com
GCF (Generic Connection Framework)
Classe Connector – Métodos Relacionados




alvo:
◦ um host (um computador ou servidor que está
na rede)
◦ uma porta de um host
◦ um arquivo ou uma porta de comunicação
a escolha do alvo depende do tipo de protocolo
definido anteriormente
parâmetros: (opcional)
também depende do tipo de protocolo selecionado
GCF (Generic Connection Framework)
Classe Connector – Abertura de Conexão

A sobrecarga do método open permite a sua
utilização de três formas distintas
static Connection
open (String name)
Cria e abre uma conexão
static Connection
open (String name, int mode)
Cria e abre uma conexão com a definição
de um modo de acesso
static Connection
open (String name, int mode,
boolean timeout)
Cria e abre uma conexão com a definição
de um modo de acesso e um timeout
GCF (Generic Connection Framework)
Exemplos de Conexão
Com o protocolo HTTP:
◦ Connection c = Connector.open
(“http://j2me.datamazon.com”)
◦ Connection c = Connector.open
(“http://j2me.datamazon.com”,0)
◦ Connection c = Connector.open
(“http://j2me.datamazon.com”,0,1000)
 Com um socket:
◦ Connection cs = Connector.open
(“socket://localhost:9000”)
 Com um arquivo:
◦ Connection ca = Connector.open (“file://dados.txt”)
 Para fechar uma conexão:
◦ void close()

GCF (Generic Connection Framework)
Exemplo
import javax.microedition.io.*;
import javax.microedition.midlet.*;
public class TesteConexao extends MIDlet {
public TesteConexao() {}
public void pauseApp(){}
public void destroyApp(boolean unconditional){
notifyDestroyed();}
public void startApp(){
try {
String URL ="http://j2me.datamazon.com";
Connection conexao = Connector.open(URL, Connector.READ_WRITE);
System.out.println("Conectado com "+URL );
conexao.close();
System.out.println("Conexao fechada");
}
catch( Exception exc ){
System.out.println("URL não pode ser aberta -"+exc );
}
destroyApp(true);
}
}
Fonte
Java para Dispositivos Móveis - Desenvolvendo aplicações com J2ME
por Thienne M. Johnson ; Novatec Editora LTDA; ISBN: 978-85-7522-143-3
GCF (Generic Connection Framework)
Conexão Assíncrona
Fonte: Jakl, 2009 - http://www.symbianresources.com
GCF (Generic Connection Framework)
Conexão Assíncrona
Solução: Para evitar problemas de deadlock ou travamento do
dispositivo, é recomendada a criação de threads específicas para a
execução de funções de comunicação em rede
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados

Para ler e receber dados da conexão, deve-se
implementar fluxo de dados
◦ Fluxo de entrada usado para ler conteúdo
◦ Fluxo de saída usado para enviar conteúdo


Os fluxos são obtidos a partir da referência ao
objeto da conexão já estabelecida
Para conexões em que as duas partes desejam
enviar e receber dados:
◦ Utilização da interface StreamConnection através dos
métodos InputStreamConnection e
OutputStreamConnection
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados

Para analisar os dados que serão
enviados/recebidos e manipular a conexão de
forma mais precisa:
◦ Utilização da interface ContentConnection
◦ Disponibiliza métodos como getType()

Métodos relacionados a fluxos dados:
◦ static DataInputStream openDataInputStream (String
name)
◦ static DataOutputStream openDataOutputStream (String
name)
◦ static InputStream openInputStream (String name)
◦ static OutputStream openOutputStream (String name)
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados
Exemplo: conexão ContentConnection e fluxo de entrada com InputStream
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
public
public
public
public
class TesteStream extends MIDlet {
TesteStream() {}
void pauseApp(){}
void destroyApp(boolean unconditional){ notifyDestroyed();}
public void startApp(){
try {
String URL ="http://j2me.datamazon.com";
ContentConnection conexao = (ContentConnection)Connector.open(URL);
InputStream IS = conexao.openInputStream();
int conteudo;
System.out.println( "Tipo de conteúdo é "+ conexao.getType() );
while( ( conteudo = IS.read() ) != -1 ){
System.out.print((char)conteudo);
}
IS.close();
conexao.close();
}
catch( ConnectionNotFoundException exc ){
System.out.println("URL não pode ser aberta" );
}
catch(IOException exc ){
System.out.println( exc.toString() );
}
destroyApp(true);
}
}
Fonte: Java para Dispositivos Móveis - Desenvolvendo aplicações com J2ME
por Thienne M. Johnson ; Novatec Editora LTDA
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados
Atenção

Não é possível recuperar/manipular uma
referência à conexão real, mas somente
aos fluxos de entrada e saída

Isso significa que não podemos manipular
ou pesquisar a conexão diretamente
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados
Exemplo: conexão StreamConnection para acessar um servidor e buscar um arquivo texto
import
import
import
import
java.io.*;
javax.microedition.io.*;
javax.microedition.lcdui.*;
javax.microedition.midlet.*;
public class BuscaArquivoTexto extends MIDlet {
private Display display;
public BuscaArquivoTexto() {display = Display.getDisplay(this);}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void startApp() {
String URL = "http://j2me.datamazon.com/arquivoteste.txt";
StreamConnection SC = null;
InputStream IS = null;
StringBuffer SB = new StringBuffer();
TextBox textbox = null;
try {
SC = (StreamConnection)Connector.open(URL);
IS = SC.openInputStream();
int dadosEntrada;
while((dadosEntrada = IS.read()) != -1) {
SB.append((char) dadosEntrada);
}
System.out.println(SB.toString());
textbox = new TextBox("Teste de StreamConnection", SB.toString(), 1024,
0);
if(IS != null) {
IS.close();
}
if(SC != null) {
SC.close();
}
display.setCurrent(textbox);
} catch (Exception exc) {
System.out.println("Exception " + exc);
}
}
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados
Exemplo: conexão que acessa um servidor e busca uma arquivo de imagem do tipo png
public class BuscaImagem extends MIDlet {
private Display display;
private Form tela;
public BuscaImagem() { display = Display.getDisplay(this);}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
public void startApp() {
String URL = "http://j2me.datamazon.com/Midlets.png";
InputStream IS = null;
Image img = null;
try {
IS = Connector.openInputStream(URL);
ByteArrayOutputStream BAOS = new ByteArrayOutputStream();
int dadosEntrada;
while ((dadosEntrada = IS.read()) != -1)
BAOS.write(dadosEntrada);
byte dadosImagem[] = BAOS.toByteArray();
img = Image.createImage(dadosImagem, 0, dadosImagem.length);
if (img != null){
ImageItem imagem = new ImageItem("Nova Imagem", img, ImageItem.LAYOUT_CENTER, null);
int largura = img.getWidth();
int altura = img.getHeight();
tela = new Form("Nova Imagem "+largura+"x"+altura );
tela.append(imagem);
}else
tela = new Form("Erro de download da imagem");
display.setCurrent(tela);
if(IS != null)
IS.close();
} catch (Exception exc) {
System.out.println("Exception " + exc);
}
}
}
GCF (Generic Connection Framework)
Leitura de Dados / Fluxo de Dados
Exemplo: Conexão com HTTP
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
public class TesteHTTP extends MIDlet {
public TesteHTTP() {}
public void pauseApp(){}
public void destroyApp(boolean unconditional){
notifyDestroyed();}
public void startApp(){
try {
String URL ="http://j2me.datamazon.com";
HttpConnection conexao = (HttpConnection)Connector.open(URL);
InputStream IS = conexao.openInputStream();
System.out.println( "Tipo de conteúdo é "+ conexao.getType() );
System.out.println("Cabeçalho= "+conexao.getHeaderField(1));
System.out.println("Porção Arquivo= "+conexao.getFile());
System.out.println("Host= "+conexao.getHost());
System.out.println("Porta= "+conexao.getPort());
System.out.println("Protocolo= "+conexao.getProtocol());
System.out.println("Tipo de requisição= "+conexao.getRequestMethod());
System.out.println("Código de resposta= "+conexao.getResponseCode());
System.out.println("Mensagem de resposta= "+conexao.getResponseMessage());
IS.close();
conexao.close();
}
catch( ConnectionNotFoundException exc ){
System.out.println("URI não pode ser aberta" );
}
catch( IOException exc ){
System.out.println( exc.toString() );
}
destroyApp(true);
}
}
GCF (Generic Connection Framework)
Conexões com Sockets


Sockets são usados para criar um link de comunicação entre
um cliente e um servidor (dispositivo móvel ou não)
Etapas:
◦ Primeiramente especificar o socket do lado do servidor através da
interface ServerSocketConnection , como no exemplo:
 ServerSocketConnection conexaoServidor =
(ServerSocketConnection)Connector.open(“socket://<porta>”);
◦ No lado do cliente usamos o formato:
 SocketConnection conexaoServidor =
(SocketConnection)Connector.open(“socket://<host>:<porta>”);


É possível também especificar algumas opções para
comunicação com sockets, como: tamanho de buffer de
escrita, tempo para deixar a porta de comunicação aberta,
tamanho do buffer de recepção e de envio,...
Ver documentação....
GCF (Generic Connection Framework)
Exemplo: Conexão com Sockets
Socket Cliente
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
public class SocketCliente extends MIDlet implements Runnable{
public SocketCliente() {}
public void destroyApp(boolean unconditional) {}
protected void pauseApp() {}
protected void startApp(){
Thread t = new Thread(this);
t.start();
}
public void run() {
try {
SocketConnection conexao = SocketConnection)Connector.open("socket://localhost:5000");
System.out.println("CLIENTE: Conectado ao servidor");
InputStream IS = conexao.openInputStream();
while (true) {
StringBuffer buff = new StringBuffer();
int dadosEntrada = 0;
while (((dadosEntrada = IS.read()) != '\n') && (dadosEntrada != -1)) {
buff.append((char)dadosEntrada);
}
if (dadosEntrada == -1) {
break;
}
System.out.println("CLIENTE: Mensagem recebida = " + buff.toString());
}
IS.close();
conexao.close();
}catch (Exception exc){
System.out.println(exc);
}
}
}
GCF (Generic Connection Framework)
Exemplo: Conexão com Sockets
Socket Servidor
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.midlet.*;
public class SocketServidor extends MIDlet implements Runnable{
public SocketServidor() {}
public void destroyApp(boolean unconditional) {}
protected void pauseApp() {}
protected void startApp(){
Thread t = new Thread(this);
t.start();
}
public void run() {
try {
ServerSocketConnection conexaoServer = (ServerSocketConnection)Connector.open("socket://:5000");
SocketConnection conexao = (SocketConnection)conexaoServer.acceptAndOpen();
System.out.println("SERVIDOR: Conexão aceita");
OutputStream OS = conexao.openOutputStream();
String message = "SERVIDOR: Hello Cliente! Vamos testar a comunicação!";
try {
OS.write(message.getBytes());
OS.write("\r\n".getBytes());
System.out.println("SERVIDOR: Mensagem enviada");
} catch (Exception exc) {
System.out.println(exc);
}
OS.close();
conexao.close();
conexaoServer.close();
} catch (Exception exc) {
System.out.println(exc);
}
}
}
Tópicos Avançados

Framework Marge (conectividade com bluetooth)
◦ https://marge.dev.java.net/

Framework Floogy (persistência de dados)
◦ floggy.sourceforge.net/
Web Service (manipulação de XML)
 Mobile Media API (controle de recursos
multimídia)
 Wireless Messaging API (SMS)
 API para desenvolvimento de jogos
(GameCanvas)
 Location API (posicionamento global / GPS)

Exemplo de Aplicações
Placar Eletrônico para Partida de Tênis
Sistema que utiliza comunicação sem fio para que o árbitro registre e
controle o andamento da partida a distância
Principais componentes do sistema:
Aplicação desenvolvida no LEC (Laboratório de Experiências Computacionais). Laboratório vinculado aos Cursos de Ciência da Computação e
Sistemas de Informação da URI – Campus Santo Ângelo-RS
Desenvolvedores: Professores Denilson R. Silva e Luciano L. Caimi
Bolsistas: Anderson A. Parreiras e Tales Marchesan
Placar Eletrônico para Partida de Tênis

Característica e Recursos

Aplicação de controle instalada no PDA
o

Aplicação Servidora (Desktop)
o

Java Micro Edition (MIDP 2.0 e CLDC 1.1)
Plataforma Java padrão para Desktop (JDK 1.5)
Utilizando sockets, o programa cria um canal de
comunicação com a aplicação servidora através da interface
Wi-Fi
PDA Zire 71 com cartão Wi-Fi
 AP (Acess Point ) Dlink DWL2000AP+ configurado com
criptografia WEP 104 bits
 Computador Dell Vostro 200 com placa de vídeo GForce2
5200
 TV de Plasma 42 polegadas

Placar Eletrônico para Partida de Tênis

O sistema de Acompanhamento Acadêmico para Dispositivos
Móveis CLDC
URI Mobile
Os principais requisitos do sistema é acessar, buscar,
persistir e visualizar informações acadêmicas como:
◦ disciplinas, curso, frequência, avaliações, datas
especiais, etc.
 Possibilidade de persistência das informações para
consultas “off-line” nos dispositivos

Fonte (vargas, 2007)
SISTEMA DE ACOMPANHAMENTO ACADÊMICO PARA DISPOSITIVOS MÓVEIS CLDC – URI MOBILE
Trabalho de Conclusão de Curso – Ciência da Computação / URI – Santo Ângelo
Aluno: Moacir José de Vargas
Orientador: Denilson Rodrigues da Silva
O sistema de Acompanhamento Acadêmico para Dispositivos
Móveis CLDC
Arquitetura do URI Mobile
Integrar tecnologias heterogêneas, através do uso de web
service
 Portal do aluno da URI, desenvolvido em Microsoft .NET, para
acesso utilizando PCs
 Disponibilização de dados à uma aplicação desenvolvida em
linguagem Java, utilizando o Java ME

O sistema de Acompanhamento Acadêmico para Dispositivos
Móveis CLDC
URI Mobile – Pacotes, Classes e Interfaces
O sistema de Acompanhamento Acadêmico para Dispositivos
Móveis CLDC
URI Mobile – Classe SendData - Exemplo de envio de informações

String DadosWS_SOAP () – Método que gera o XML
dinamicamente realiza a conexão enviando estes dados,
recebe os e fecha a conexão. Parte do Código deste método,
responsável por gerar o XML, e abrir a conexão, pode ser
visto na a seguir.
Gênius Bluetooth


Gênius (Simon): brinquedo popular nos anos 80
◦ Lógica baseada na memorização de cores
sequenciais
Recursos utilizados:
◦ Interface gráfica baixo nível baseada em Canvas
◦ Conexão bluetooth (Framework Marge)
◦ Uso de Threads
Gênius Bluetooth
Download