Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso,...
-
Upload
alicia-jose -
Category
Documents
-
view
214 -
download
1
Transcript of Jornada de Cursos - J2ME Aula 6 – MIDP 2.0. Pausa para reflexão "Sem esforço não há progresso,...
Jornada de Cursos - J2ME
Aula 6 – MIDP 2.0
Pausa para reflexão
"Sem esforço não há progresso, mas com esforço também não há progresso”
Ryotan Tokuda, Mestre Zen
Agenda• MIDP 2.0 Technical Overview• MIDP Desenvolvimento e Deployment• API´s• Wireless Messaging API• Práticas de programação
Technical Overview
APIs de MIDP 1.0• Modelo de aplicação:
• Javax.microedition.midlet• Persistência
• Javax.microedition.rms• Rede
• Javax.microedition.io.HTTPConnection• Interface gráfica
• Javax.microedition.lcdui• IO e pacotes util de CLDC
• Java.lang• Java.io• Java.util
MIDP 2.0• Objetivos de MIDP 2.0
• Compatibilidade com MIDP 1.0• Foco contínuo em telefones com poucos recursos• Usar informação dos deployments MIDP 1.0 para
criar um modelo mais aprimorado• Foco em aplicações core necessárias a todos os
dispositivos e aplicações
MIDP 2.0 - Novas características• Novos protocolos de rede
• HTTPS, Comm, Datagram, SSL, Socket, ServerSocket• Nota: Somente HTTP e HTTPS são requeridos pela
especificação• Funcionalidade Push
• Possibilidade de iniciar um MIDlet em resposta a uma mensagem
• OTA• Game API• UI melhorada• platformRequest
Requisitos mínimos• Display:
• Tamanho de tela: 96x54• Profundidade de display: 1 bit• Pixel aspect ratio: 1:1
• Input• One or two handed keyboard, touch screen
• Memória:• 256 kb de memória não-volátil• 8 kb para dados persistentes• 128 kb de memória volátil
Requisitos (cont.)• Rede:
• Two-way• Wireless• Possibilidade de intermitência, com uma banda
limitada• Som
• Pode tocar tons, via HW ou SW
Desenvolvimento e Deployment
Verificação de classfiles em CLDC
Passos1. Escreva sua aplicação2. Compile-a3. Use o preverifier4. Empacote-a
1. Assine o JAR (só em MIDP 2.0)5. Crie o descritor6. Publique a suite MIDlet7. Instale via OTA
Prática recomendada: OTA• MIDP 1.0 deixou não especificado OTA• MIDP expert group lançou OTA para clarificar
detalhes• Requisito core em MIDP 2.0
OTA
OTA
OTA
OTA
Versões• Agora que temos MIDP 1.0 e 2.0, é preciso
saber a versão que estamos trabalhando• System.getProperty(“MicroEdition-Profile”)
• Por default, o JAM não instalará MIDP 2.0 em aparelhos MIDP 1.0
MIDP 2.0 APIs
MIDP 2.0 APIs• Segurança e segurança em rede• Push API• Media APIs• APIs de interface gráfica• Game API
Segurança
Riscos de segurança inclusos• Aplicações usando o dinheiro do usuário sem
permissão• Mensagens SMS podem custar 10 centavas por
mensagem, e com 7 mensagens: 1k de dados• Informações privadas sendo expostas
• Contatos• DOS potenciais, códigos maliciosos, etc
Modelo de segurança do MIDP 2.0• MIDlet suites requerem segurança• Cada MIDlet suite está atrelada a um único
domínio de proteção contendo as permissões• Restrições da API a funções fundamentais• Extensível a APIs desenvolvidas
independentemente (WMA, MMAPI, etc)
Tipos de permissão• Permissões Allowed
• Sem prompt para verificar se é válido• Permissões de usuário
• Garantidas com aprovação do usuário• Usuário escolhe a frequência de prompt:
• Blanket – válido até o usuário configurar o contrário• Session – válido para uma invocação• Oneshot – válido para uma chamada da API
• Um datagrama sendo enviado
Dois tipos de domínio de proteção• Untrusted domains
• Sandbox, como MIDP 1.0• Tipicamente, dispositivo pergunta ao usuário por
acesso• Trusted domains
• Dispositivo tem mecanismo para validar a suite• Pode permitir acesso sem prompt• Geralmente implementado usando criptografia de
chave pública para assinar o JAR
Modelo de segurança
Modelo de segurança – Cont.
Trusted signed applications• Descritor de aplicação inclui:
• Assinatura do JAR• Certificados necessários para verificar assinatura• Permissões requeridas pela aplicação
• Dispositivo autentica assinatura• Usando chave pública raiz do dispositivos• Cercado pelo domínio de proteção
Permissões no WTK• Atributos MIDlet-Permissions eMIDlet-Permissions-optdo painel Projetc | Settings
Assinando MIDlets• Assinar com keytool, JADtool e MEKeytool
pode ser complexo• WTK oferece assinar MIDlets via GUI
• Cria um par de chaves e um alias• Crie o certificado• Adicione um certificado de par de chaves ao JAD• Assine o JAR e adicione a assinatura ao JAD
Segurança em rede• HTTP e HTTPS necessários para MIDP 2.0• Datagrama – pouco overhead, mas inseguro• Socket – streams confiáveis• Socket seguro – stream confiável sobre
SSL/TLS• Conexão a porta serial• Wireless Messaging – WMAPI
Segurança em MIDP 2.0• HTTPConnection e HTTPSConnection• Possibilidade de utilizar sockets puros
(SecureConnection)• MIDP 2.0 define a interface SecurityInfo para
informações detalhadas
SecureConnection• Define uma conexão com sockets seguros• Uma conexão segura é estabelecida com
Connector.open() quando “SSL” é especificadoNa URI, por exemplo:
Connector.open(“ssl://host.com:70”);• A implementação escolhe entre:
• Protocolo TLS versão 1.0• Protocolo SSL versão 3.0
SecurityInfo• Define os métodos para acessar informação
numa conexão segura• Oferece o certificado, protocolo, versão, suite
de cifragem, etc. Uso:SecureConnection sc = (SecureConnection)
Connector.open(“ssl://host.com:70”);SecurityInfo info = sc.getSecurityInfo();System.out.print(“Protocol ” + info.getProtocolName);...
Push (ou AutoLaunch)
Aplicação de rede• Não é possível criar MIDlets do tipo servidor
• Limitações de plataforma:• Sem multi-threading• Sem processos daemon
• Limitações de recursos computacionais• Segurança
• Solução – conexão offline ao servidor• Confia num proxy para cuidar da primeira
invocação• Conexão inbound
PushRegistry• MIDP 2.0 define um mecanismo de push
• MIDlets podem ser acordados por eventos externos• Push Registry é manuseado pelo AMS• Duas maneiras de se registrar:
• Estática: MIDlet-Push-<n> no JAD• Dinâmica: PushRegistry.registerConnection()
Esquema geral
MMAPI
MMAPI em MIDP 2.0• MIDP 2.0 Media API é um subconjunto da
Mobile Media API (JSR 135)• Somente Sons
• Pacotes:• javax.microedition.media• java.microedition.media.control
Áudio em MIDP 2.0• Implementações têm que suportar geração de
tons e WAV• Tipos adicionais são opcionais
• Para geração de tons:• Manager.playTone();
• Para playback de algum som em formato WAV, crie um objeto Player
• O objeto Player tem os métodos start/stop/pause
Exemplos de código• Geração de tons:
try{Manager.playTone( ToneControl.C4 , // nota
5000, //ms100); //volume
} catch(MediaException mee) {}• Playback com looping
try{Player p = Manager.createPlayer(http://myMusicServer/music.wav);p.setLoopCount(5);p.start();
} ...
Exercício• Crie um MIDlet que toca associa um som a cada
tecla. Pode ser wav, midi, etc.
Interface Gráfica
Interface com o usuário• Popup ChoiceGroup
• Novo tipo: POPUP• Alerts podem ter comandos• Comandos podem ser associados a Item• Layout para Item• Custom Items• Classe Spacer
Items• É possível setar tamanhos esperados• Comandos agora podem ser associados a Items
• ItemCommandListener• Default command
• SetDefaultCommand• Custom Items
• A coqueluche de MIDP 2.0• Sobrecarrega o método paint
• Layout• Várias opções de layout
Exercício• Crie um custom item que cada vez que é
selecionado, realiza um tipo de pintura diferente. Ex.: uma seta que pisca de vermelho e azul
Game API
Game API• Conjunto com 5 classes que simplificam o
desenvolvimento de jogos 2D• GameCanvas• Layer• Sprite• TiledLayer• LayerManager
• Provêem 2 importantes funcionalidades• GameCanvas• Estruturação do jogo em camadas
GameCanvas• Subclasse de Canvas• Fornece offscreen buffer
• Somente 1 classe extende de GameCanvas• Armazena o estado de pressionamento das teclas,
podendo serem consultados a qualquer momentoint keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) { sprite.move(-1, 0); }
Loop de jogo com Canvaspublic class MicroTankCanvas extends Canvas implements Runnable {
public void run() { while (true) {
// Update the game state. repaint();
// Delay one time step. }
}
public void paint(Graphics g) { // Painting code goes here.
}
protected void keyPressed(int keyCode) { // Respond to key presses here.
}}
Loop de jogo com GameCanvaspublic class MicroTankCanvas extends GameCanvas implements Runnable {
public void run() { Graphics g = getGraphics();while (true) {
// Update the game state. int keyState = getKeyStates();// Respond to key presses here.// Painting code goes here. flushGraphics(); // Delay one time step.
}}
}
Exercício• Crie uma aplicacao que consiste de um cursor e
é possível movimentá-lo.
Layer• Representa um elemento visual do jogo• Possui posição relativa à tela (x,y) além de
dimensões (largura, altura)• Método paint a ser implementado• Em um dado momento pode estar visível ou
não
Layer - Métodos• int getHeight()• int getWidth()• int getX()• int getY()• paint(Graphics g)• setVisible(boolean visible)
TiledLayer
TiledLayer – cont.
TiledLayer - métodos• TiledLayer (int columns, int rows,
Image image, int tileWidth, int tileHeight) • int getCell (int col, int row) • paint (Graphics g) • setCell (int col, int row, int tileIndex)
LayerManager• Gerencia uma série de layers• Define a ordem na qual os layers são
renderizados e em qual região da tela• Simplifica o processo de renderização• Define regiões em relação ao eixo-z
LayerManager – cont.
LayerManager - métodos• void append (Layer l) • Layer getLayerAt (int index) • void insert (Layer l, int index) • paint (Graphics g, int x, int y) • setViewWindow (int x, int y, int width,
int height)
Sprite• Elemento visual do jogo que pode ser
renderizado a partir de um ou mais frames• Possui métodos para rotação, colisão e
animação• Pixel de referência
Pixel de Referência
Exercício• Utilize as classes TiledLayer e Sprite para criar
o efeito de um jogo de tanque.• Lembre-se que já vimos como é o loop de um jogo
simples• Os sprites e as figuras do tiled layer vão ser
fornecidos.
PlatformRequest• javax.microedition.midlet.MIDlet.platformRequest()• Facilidade para acessar serviços externos:
• Numeros• Suites MIDlet em enderecos http
• Método não-bloqueante• Não enfileira chamadas• Ex.:
• platformRequest(“http://www.cin.ufpe.br/~ela/jornada/myGame.jad”);
• platformRequest(“+358-555-1234567”);
Suporte no WTK• Adiciona ao system.config
• com.sun.midp.midlet.platformRequestCommand: “ENDERECO DO BROWSER”
Wireless Messaging API
Wireless Messaging API – JSR 120• Acesso padrão a mensages• WMA foi desenhada para rodar em qualquer
configuração• Endereça as seguintes tecnologias:
• Short Message Service – SMS• Cell Broadcast Service – CBS
• Suporta mensagens multimidia, incluindo sons, imagens e texto
Wireless Messaging API – JSR 120• Baseada no Generic Connection Framework• Design da funcionalidade é parecida com
UDPDatagramConnection• Já que existem diferenças entre mensagens e
datagramas, WMA interfaces definidas em javax.wireless.messaging
• Dois modos de receber mensagens• Usando o metodo receive
• Bloqueia a Thread atual• Definindo um MessageListener
MessageListener• Implementa o ouvinte para receber objetos
mensagem• Define um único método
notifyIncomingMessage(), que é invocado cada vez que uma mensagem chega
• Para se registrar para mensagens, use o método MessageConnection.setListener()
Boas práticas
Boas práticas• Cuidado com exceções de segurança• Design para rede de um modo assíncrono• Use uma thread para ler• Use uma thread para escrever• Registro para autolaunch
Exceções de segurança• Não use getMessage(),o usuário não quer ver isso• Ofereça uma sugestão• Use imagens• Espere pela confirmaçãodo usuário
Desenhe para threads• I/O blocks numa threadSeparada• Exceções de I/O • Feche as conexões
Usando uma thread para ler• Mantenha thread ativa• Até ser mandado umstop• Ou ocorrer uma exceção
Use threads para enfileirar escritas• Use o open connection• Enfileire os dados a seremescritos• Use uma thread separadapara escrever
Usando uma thread para escrita• No método run, enfileireas chamadas• Desenfileire os dadosa serem escritos• Crie um datagrama parae mande-o
Checando autolaunch• Pegue uma lista das conexões ativas• Abra as conexões ativas• Manuseie I/O normalmente
Referências• Core J2ME• Site da Sun• Wireless Programming with J2ME: Cracking the
code, ISBN: 0-7645-4885-9
Agora que acabou
"Sem esforço não há progresso, mas com esforço também não há progresso”
Ryotan Tokuda, Mestre Zen
Alguém finalmente entendeu o que danado é isso????