Java - .NET - Games - PalmSource - Mercado - J2ME - Asp.NET
inas g á p 76
A revista do desenvolvedor Web e Wireless
J2ME - Introdução
Primeiros passos na criação de aplicações móveis com Java
ASP.NET passo a passo Desenvolvimento Web com .NET
Edição 01 . Ano 01 . R$ 11,90
Jogos para celular passo a passo
Discussão
Internet para dispositivos móveis
Aprenda a desenvolver um game completo em Java
Dreamweaver MX Construa sites dinâmicos em minutos!
Mini-curso Pocket PC
Desenvolvimento de aplicações móveis com .NET
Mobilidade o mundo na palma de sua mão
wm01.indb 1
7/1/2005 19:53:57
WebM
ANO I . Fevereir
Atendim
A DevM dimento
seu exem
exemplar
em conta
Aline Sa
webmobi
(21) 228
Kaline D
kalined@
(21) 228
Publicid
Para i
entre em
Luiz Clรก
publicida
Para fec
DevMedi
Gerente
Kaline D kalined@
Assisten
Jeff Wen
jeff@de
wm01.indb 2
7/1/2005 19:54:01
WebMobile Magazine ANO I . 01ª Edição Fevereiro/Março . 2005
Editorial
A
Editor Geral Rodrigo Spinola
no novo, revista nova! O DevMedia Group, líder no mercado de publicações para desenvolvedores com cerca de 77 mil leitores e publisher das revistas ClubeDelphi, Java Magazine, MSDN Magazine e SQL
editorwebmobile@devmedia.com.br
Magazine apresenta para você a WebMobile Magazine. Totalmente focada nas novas tecnologias que
Editores Técnicos Arilo Cláudio
têm transformado a maneira como lidamos com informação - o mundo web e wireless. Certamente mobilidade
acdn@cos.ufrj.br
é palavra de ordem em um futuro que já começa a acontecer. Alguns pontos que justificam a escolha do tema
Guinther Pauli
são: (1) potencial de geração de novos negócios com a tecnologia móvel; (2) próxima grande demanda de
guinther@devmedia.com.br
desenvolvimento de aplicações e; (3) quantidade atual de dispositivos móveis no mercado já é grande e tende
Rafael Barcelos
a ser muito maior. Outro fator que demonstra a relevância do assunto foi o recente evento organizado pela
Barcelos@cos.ufrj.br
Redatores desta edição Clóvis Teixeira, Eduardo Bottcher, Eduardo Peixoto, Juliano Carniel, Lenke Pavetits, Márcio Alexandroni, Renato Haddad, Renato Iida, Thomas Erl.
DevMedia, o WebMobile TechWeek, que foi um sucesso de público. Contando com mais de 400 pessoas entre congressistas, palestrantes e pessoal de apoio, o evento serviu de encontro para a maior discussão sobre web e wireless já realizado no Brasil. Para trazer a você um conteúdo de ponta, montamos um corpo editorial de primeiríssima linha, a exemplo do que já acontece nas demais publicações do grupo. Isso trará a você, leitor, um ótimo canal para ficar
Tradução Técnica Raphael Har-Zahav
antenado com as tendências e novas tecnologias. Nesta edição contamos com uma boa variedade de artigos sobre: .NET, J2ME, WebServices, desenvolvimento de jogos, mercado mobile no Brasil, desenvolvimento de
Jornalista Responsável Kaline Dolabella
aplicações para PocketPC e sincronismo no Palm.
kalined@terra.com.br
Gostaria também de convidá-lo a visitar nosso portal, www.portalwebmobile.com.br. Lá você encontrará as
Capa e Ilustrações Felipe Natividade Machado
novidades do mundo mobile além de artigos de especialistas nos diversos temas abordados na revista. Aproveite para participar do concurso “Entre para o Mundo Mobile” promovido pelo Grupo DevMedia em parceira
Felipe@phdesign.com.br
com o Instituto Nokia de Tecnologia. Para concorrer aos prêmios (celulares Nokia e contratos remunerados
Diagramação e Direção de Arte Jaime Peters Junior
para se tornar um redator da WebMobile Magazine), os participantes têm duas opções: escrever um artigo sobre mobilidade ou desenvolver uma aplicação para celular.
Jaime@phdesign.com.br
Então, o que está esperando? Entre conosco no mundo mobile. Com certeza você vai gostar muito da WebMo-
Tarcisio Bannwart
bile Magazine. Desejo uma ótima leitura. Torço também para que tenha um ano novo de sucesso, felicidade
Tarcisio@phdesign.com.br
e, principalmente, muita paz. Um abraço e Feliz 2005!!!
WEB www.portalwebmobile.com.br
Rodrigo Oliveira Spínola editorwebmobile@devmedia.com.br
Distribuição Fernando Chinaglia Dist. S/A Rua Teodoro da Silva, 907 Grajaú – RJ – 20.656-900
Índice
Atendimento ao Leitor A DevMedia conta com um departamento exclusivo para o atendimento ao leitor. Se você tiver algum problema no recebimento do seu exemplar ou precisar de algum esclarecimento sobre assinaturas, exemplares anteriores, endereço de bancas de jornal, entre outros, entre
04. Conexão em movimento
46. Introdução às tecnologias Web Services: SOA, SOAP, WSDL e UDDI Parte1
por Lenke Pavetits
por Thomas Erl
08. News por Rodrigo Spinola
em contato com: Aline Saldanha – Atendimento ao Leitor webmobile@devmedia.com.br (21) 2283-9012 Kaline Dolabella – Gerente de Marketing e Atendimento
54. Desenvolvimento de jogos J2ME/MIDP para celular
11. Introdução ao J2ME
por Eduardo Peixoto e Renato Iida
por Juliano Carniel e Clóvis Teixeira
22. Construindo sua primeira aplica ção para POCKET PC com .NET por Renato Haddad
kalined@terra.com.br (21) 2283-9012
por Marcio Alexandroni
72. Entrevista - Marcelo Nunes de Carvalho
37. Tutorial ASP NET
por Rodrigo Oliveira Spínola
por Eduardo Bottcher
Publicidade
67. Sincronismo no Palm: comunicação e tecnologias
Para informações sobre veiculação de anúncio na revista ou no site entre em tcontato com:
Fale com o Editor!
Ícones Internos
Luiz Cláudio Barreto
É muito importante para a equipe saber o que você está achando
publicidade@devmedia.com.br Para fechar parcerias ou ações específicas de marketing com a
Atenção
Download
Editorial
Figura
Jogos
DevMedia, entre em contato com: Gerente de Marketing e Atendimento Kaline Dolabella kalined@terra.com.br Assistente de Marketing Jeff Wendell
Entrevista Links
Livros
News
Nota
Tabela
Listagem
jeff@devmedia.com.br Realização
da revista: que tipo de artigo você gostaria de ler, que artigo você mais gostou e qual artigo você menos gostou. Fique a vontade para entrar em contato com os editores e dar a sua sugestão! Se você estiver interessado em publicar um artigo na revista ou no site WebMobile, entre em contato com os editores, informando o
Minibriografia
Quadro
Tutoriais
título e mini-resumo do tema que você gostaria de publicar: Rodrigo Spinola - Editor da Revista editorwebmobile@devmedia.com.br Alfredo Ferreira - Editor do Site alfredo@clubedelphi.net
Projeto Gráfico
WebMobile 3 wm01.indb 3
7/1/2005 19:54:25
Conexão em movimento por Lenke Pavetits
P
edras que rolam não criam limo. O refrão de Bob Dylan é a nova lei da informática. Nada de soluções fixas, a palavra de ordem é mobilidade. Comunicação em movimento, soluções em andamento. O mercado para desenvolvedores em aplicativos móveis é grande, pouco explorado e com soluções tanto para pequenas empresas como para grandes. De acordo com Marcio Venzi, gerente de desenvolvimento de negócios da Nokia, os dois institutos de pesquisa da empresa no Brasil, um em Manaus, outro em Brasília, estão fomentando o mercado nacional. “Temos contratado empresas nacionais. A idéia é trazer tudo da internet fixa para a móvel”. A grande aposta, de acordo com Venzi, ainda é a música. A empresa está investindo em um aparelho celular estilo Ipod. O problema a ser resolvido é o custo da transmissão de dados já que o preço médio do megabyte transferido é de R$ 5,00 e o tamanho médio, em qualidade de CD, é de cinco megabytes, só de tráfego. Isso sem contar direitos autorais. No momento, a Nokia está articulando uma parceria com a IBM para lançar, simultaneamente no Brasil e na Europa, um SmartPhone com wifi de fábrica e softwares da IBM voltados para o mercado corporativo. Traduzindo, o dono do celular poderá baixar seus emails da empresa em trânsito. “Já funciona em edge - um link da rede GSM que transmite 44 kilobytes/segundo. No aparelho de terceira geração, a transmissão é acima de 500 kilobytes/ segundo”, explica Venzi. A fábrica de macarrão Scala automatizou sua força de vendas através de aparelhos de celular. Utilizando um telefone Nokia que roda o sistema operacional Symbian, os vendedores conseguem enviar os dados através de be4 1º Edição
wm01.indb 4
7/1/2005 19:54:54
Mercado
aming, blue tooth ou MMS. “O representante da empresa está sempre passeando com o legado da empresa. Alguns celulares têm banco de dados e em alguns casos as vendas podem ser feitas até em lugares sem sinal”, explica a coordenadora da área corporativa da TIM, Silvia Paladino. A tal da mobilidade é mesmo o negócio do momento. Grande parte dos garçons do país já trabalha com a comandadeira. Espécie de pocket PC de mão, o dispositivo transfere as anotações do garçom direto para a cozinha. Mais que isso, é possível melhorar o relacionamento de marketing do restaurante com o cliente. “Ele poderá trabalhar com histórico de pedidos, como ‘o senhor vai querer seu chope escuro de sempre?’ ou definir a abordagem a ser feita. Cliente identificado, o garçom poderá saber se ele prefere atendimento formal ou informal”, enumera Rubens Marques Chaves, diretor executivo da empresa Connect que tem vendido seu produto em João Pessoa e pelo Nordeste em geral. A empresa carioca Snack Control também opera nesse segmento. A Snack Control desenvolveu um software Windows para seu ‘snackmobile’, que captura o pedido do cliente na mesa e envia à produção sem sair do local de atendimento. De acordo com o site da empresa, a geringonça é perfeita ‘como papa-fila em fast food’. A ferramenta é, na verdade, útil para qualquer contato com o público. A Connect vendeu o sistema para os agentes de saúde da prefeitura de João Pessoa. “Os agentes de saúde sairão com um palm para coletar informações das famílias acompanhadas por eles. Ele armazena todo o histórico dos membros das famílias, vacinas, doenças, etc.”, explica Rubens. O projeto ainda não está finalizado. Atualmente, funciona em caráter experimental em poucas unidades, mas a prefeitura já adquiriu 800 pockets PC. “No congresso nacional de saúde ocorrido em Natal não vimos nada semelhante nem em conversas com o pessoal do Ministério da Saúde”, revela Rubens sobre o ineditismo do produto. Tanta tecnologia precisa, obviamente, de desenvolvedores.
Incentivo ao mercado desenvolvedor O Ministério da Cultura criou um concurso de jogos para estimular o mercado. A primeira fase, já encerrada, foi de coleta de idéias. A segunda foi de triagem desse material. Entre as 500 idéias enviadas, 36 foram escolhidas. Aí começa a terceira fase. As empresas vão escolher uma das idéias, projetar jogos em cima do conceito escolhido e daí sairão oito projetos ganhadores que receberão R$ 30 mil para criar uma demo. Além do Ministério da Cultura, outras entidades também têm feito sua parte. A Vivo trabalha com 30 desenvolvedores, repartidos meio a meio entre nacionais e internacionais, e os nacionais fazem bonito. Estão à frente dos internacionais no desenvolvimento e adaptação de aplicativos. A empresa promoveu o concurso Downloads Brew 2004 em julho oferecendo como prêmio kits de celulares, uma viagem para o CTIA Wireless (www.wirelessit. com/general/schedule.cfm) e a oportunidade de uma parceria comercial. Apesar disso, o evento só reuniu 246 inscritos. Ri-
cardo Walter Hildebrand, 23 anos, cientista da computação, de Florianópolis, venceu na categoria Play VIVO com o game multiplayer Tank Mission II. Um jogo com 33 níveis onde os usuários controlam um tanque de guerra em uma batalha. O pernambucano Tiago Guedes Barros, 24 anos, criou um serviço que controla um PC através do celular usando um VNC Server - Virtual Network Computing. O paulista Marco Aurélio Cotic Lino, 26, desenvolveu o game Truco premiado pela junção interface áudio-visual e desempenho e, o carioca Marcio Vivas da Silva, um biólogo marinho de 38 anos, inventou o game Final Boss Racer 3D de corrida de naves. A WebMobile, em conjunto com o Instituto Nokia de Tecnologia (INDT) também criou um concurso para estimular o mercado de desenvolvedores para aplicativos móveis. O regulamento e a inscrição podem ser feitos no endereço https:// portalwebmobile.locaweb.com.br/portalwebmobile/mobilidade/. O sócio da LocZGames e diretor da ABRAGAMES (Associação Brasileira das Desenvolvedoras de Jogos Eletrônicos), Carlos Estigarribia, acredita que o problema do mercado não está na quantidade da mão de obra disponível. “Não falta desenvolvedor. O problema é que as empresas não têm forças sozinhas para lutar por incentivos e combater a pirataria. Daí surgiu a ABRAGAMES, que tem em sua missão a criação de um plano diretor para indústria brasileira de jogos”, diz. A pirataria atinge o ponto-chave de qualquer produto: a idéia criadora. Copiada a idéia, os piratas reproduzem os jogos em qualquer plataforma. Sua empresa, LocZ, começou em 1997 fazendo jogos para CD ROM, migrou para sites e campanhas publicitárias e desde 2001 decolou com jogos para aplicativos móveis. O carro-chefe de vendas é o City Knights, um game de luta que trouxeram da Finlândia. A importação de jogos de empresas americanas e européias e a localização desses jogos para a tecnologia e gosto brasileiro dividem espaço com a criação de jogos em Brew e Java para as operadoras Vivo, Tim e Claro. “Desenvolvimento decolou para gente, é o que está crescendo mais”, comemora. Para atender a demanda, a LocZ emprega quatro pessoas no escritório do Rio, três na filial de São Paulo e mantém um representante em Miami. Quando precisa, a LocZ contrata funcionários por temporada. “O grande celeiro é a PUC-Rio, onde tem o pessoal mais forte”, aponta. Uma pesquisa da Associação Nacional de Entidades Promotoras de Empreendimentos Inovadores (Anprotec) já define outro celeiro: o Nordeste. Em 2003 havia uma concentração de 24 incubadoras em operação na região, subindo para 37 em 2004. Um aumento de 55%. Em pesquisa recém-divulgada, a Anprotec estima um crescimento de 37% do número de incubadoras em relação a 2003, passando de 207 para cerca de 280 incubadoras de empresas em operação. Com base nesse aumento, a pesquisa prevê que as 280 incubadoras estão apoiando cerca de 1.700 empresas incubadas, já lançaram no mercado outras 1400 e geram cerca de 28 mil postos de trabalho por todo o país. O presidente da entidade, José Eduardo Fiates, acredita que as soluções wireless são profundamente customizadas e, por isso, as empresas nacionais têm um WebMobile 5
wm01.indb 5
7/1/2005 19:54:58
do Windows. Possui Outlook, Media Player, Real Player Mpeg4, grande mercado a ser desbravado. “As oportunidades sempre escoisas que habilitam o usuário a ler e responder seus e-mails de tão nas fronteiras, isso pode ser um desafio numa empresa grande forma sincronizada, ouvir músicas, ver e gravar vídeos e assistir ou em nichos de mercado ainda não atendidos representados por televisão. Leonardo Tolomelli ( empresas de médio e pequeno porte que nem 1) da Misempre são a prioridade de grandes empresas”. crosoft acredita que o produto da TIM vai Fiates, porém, detecta como principal entrave facilitar a vida do cliente comum que gosta ao desenvolvedor a percepção de mercado. “Parde usufruir de tecnologia. Razão pela qual a Microsoft vai lançar uma campanha de ticularmente em segmentos de desenvolvimento incentivo à criatividade do desenvolvedor. mais avançado, na ponta, isso acaba se tornan“Faremos uma campanha focada para os que do ainda mais complicado porque a análise de estão cadastrados no site www.microsoft. mercado fica mais complexa. A Anprotec está com/brasil/msdn. Vamos oferecer o aparelho atenta para o mercado wireless e nasceu exatacom preço subsidiado para desenvolvedores mente com missão de tentar eliminar ou minicom kit e CD explicando o desenvolvimento mizar as deficiências iniciais do empreendedor”, do SmartPhone, um outro CD em inglês com tranqüiliza. No XIV Seminário Nacional de Paro software que é necessário para fazer desenques Tecnológicos e Incubadoras de Empresas volvimento e um DVD, o Mobile Developers realizado na segunda semana de novembro em Pernambuco, um painel foi direcionado especiConference, realizado em março desse ano em San Francisco com quase 200 palestras. É ficamente para empreendedores da área. Empre1. Leonardo Tolomelli. um excelente material de estudo”, avalia. sas atuando com sistemas wireless na parte de Silvia Paladino, coordenadora da área coranálise de demanda, características de processamento de chamadas, suporte às operadoras, infra-estrutura de porativa da TIM, cita alguns canais que já ‘passam’ no telefone da internet banda larga e até empresas que já mandam resultados de operadora: Band climatempo, Sat 2000, Band Sport e Bandnews. exames médicos desta forma participaram do debate. Por essas qualidades é que o gerente de desenvolvimento de neA Sollipsis, com sede em João Pessoa, do paraibano Herval gócios da Nokia diz que o SmartPhone não é um telefone, mas um Freire é um exemplo concreto do que a Anprotec busca. Cresceu conceito. “Ele vem desde a década de 90, o primeiro SmartPhone sob a asa protetora da Connect e ganhou vida própria indo dida Nokia foi o 9210i. Foi o primeiro com recursos como e-mail, acesso a internet, mensagens”, relembra. A novidade dos apareretamente ao mercado sem auxílio da incubadora. Uma legítima lhos novos é a inserção de um software de recepção de streaming. spin off. Agora, com um ano de mercado, presta consultorias em projetos de empresas de São Paulo, Rio de Janeiro e Manaus, e Diferente dos métodos tradicionais em que é preciso baixar o hoje faz parcerias com a própria Connect. Juntas desenvolveram arquivo para assistir ou ouvir, o streaming permite que o arquivo um produto de AFV com funções de controle de estoque para palm seja visualizado enquanto está sendo baixado. Essa diferença gera várias possibilidades: pode ser descartado após a exibição, não que é utilizado atualmente por nove clientes com mais três clienocupa tanta memória, já que só que é importante para o usuátes em fechamento. O diretor executivo da Connect explica que rio é armazenado e, principalmente, não consome tantos minutos a empresa tem trabalhado exclusivamente com Palms. Atendem restaurantes com a comandadeira, chamada por eles de garçom quanto os sistemas tradicionais que obrigam a perda de tempo eletrônico, trabalham com companhias industriais, de distribuipara baixar e depois para visualizar. Como as operadoras cobram por pacote de dados enviados, o ção e de comércio de móveis na parte de vendas e agora estão streaming devora a franquia de dados contratada. Venzi, da Nokia, dando ênfase ao estoque online. “Até pouco tempo atrás estávaexplica que a tendência na Europa é disponibilizar um pacote mos limitados pela infra-estrutura das operadoras móveis locais, específico para TV, mas este pacote ainda depende de questões pois eles trabalhavam com minutagem e isso tornava a solução de legislação. É que, segundo ele, o streaming é o embrião da TV inviável. Agora, eles estão migrando essa infra-estrutura para o digital. Aquela dos sonhos, interativa, estilo Jetsons em que a GSM/GPRS permitindo ao vendedor tirar um pedido e, caso esteja programação se adapta a você e não você a ela. Essa tarefa está de acordo com as normas da empresa, faturar e imprimi-lo na mais próxima do que se imagina e vem sendo executada no Brasil expedição”, afirma Rubens. pela Fundação Certi com financiamento da União Européia. O projeto chamado Instinct está sendo desenvolvido por 24 parceiros Televisão e celular no mundo inteiro, sendo cinco deles no Brasil, está estimado em A televisão é outro eletrônico que está evoluindo para a mo50 milhões de euros e será realizado com os padrões europeus bilidade. A TIM, em parceria com a Microsoft, lançou no mercado um SmartPhone. O celular high end vem com uma versão reduzida DVD, GPRS, EDEG e UMPS. 6 1º Edição
wm01.indb 6
7/1/2005 19:55:00
Mercado
O objetivo do projeto é disponibilizar a TV digital para as classes C e D. Isso mesmo, fazer com que gente com menos grana precise comprar um único aparelho para poder se comunicar, opinar, comprar, interagir e, por tabela, assistir o jogo de futebol pelo ângulo que quiser, baixando as informações estatísticas que julgar importante e fazer o download do gol do time do coração. “É um projeto de seis anos dividido em três fases. Estamos na metade da primeira fase e fazendo a primeira apresentação dele no mundo. Quem promoveu esse projeto no Brasil foi Walter Duran do laboratório Philips da Amazônia”, explica o coordenador pela parte da Certi, Ricardo Teixeira. No momento, os pesquisadores da Certi, em Florianópolis, da Universidade do Estado do Amazonas, da USP, do instituto de pesquisa Cesar e da Philips estão definindo a viabilidade técnica do projeto em face da proporção continental de nosso país. “A primeira intenção é testar em áreas controladas com foco em tornar mais acessível para o público feminino. O que chamamos, de brincadeira, o cenário da Maria”, diz Teixeira.
Jogos + celulares No ranking do catálogo de aplicativos para download em celular no mundo, a Vivo divide a posição com a Verizon (cerca de 300 aplicativos), SKT Coréia (cerca de 400 aplicativos), China Unicom e NTT DOCOMO, todas CDMA. Em solo nacional, a Vivo lidera. Em um ano e meio - de março do ano passado até novembro de 2004 - a operadora ampliou de 10 para 200 os recursos disponíveis. Apenas em setembro de 2004 foram mais de 1 milhão de aplicativos e conteúdo baixados pelos 25 milhões de clientes que compõem a carteira da operadora. “O Vivo Downloads é um serviço muito bem sucedido porque incentiva a convergência de indústrias no celular, transformando-o num mini computador; em que vídeos, jogos, imagens e tons são baixados no celular como no PC, com a vantagem de utilizar os aplicativos em qualquer lugar”, afirma Luís Avelar ( 2), vice-presidente executivo de Marketing e Inovação da empresa, antevendo o papel da mobilidade no futuro próximo. De acordo com o gerente de conteúdo de dados da operadora, André Mafra, o perfil do usuário que baixa aplicativos se divide. “Um grupo é composto por adolescentes entre 09 e 17 anos que utilizam os celulares dos pais em horas livres para baixar e jogar e o outro é 2. Luís Avelar. formado por jovens adultos entre 23 e 30 anos com perfil financeiro independente que gostam de celulares high-tech e serviços de última geração para uso pessoal”. A oferta de serviços é diversificada em jogos, entretenimento, conteúdo adulto, produtividade, conteúdo noticioso e messaging,
mas a preferência dos usuários fica mesmo com os jogos. Estes representam 40% dos serviços baixados e o campeão de download é o jogo Penalti, da Wiz. Divididos nas modalidades ação, aventura, lógica, cartas, esporte e puzzle, a transformação de um simples aparelho de telefone em uma lan house móvel é resultado do sucesso de jogos como Collapse, Lode Runner, Moon Patrol, Buger Time, Pitfall, Solitaire, Tony Hawks Underground. Hollywood também invade o gosto popular com o surgimento de games inspirados em novos e antigos sucessos do cinema: ‘Senhor dos Anéis’ e ‘X-Men’ convivem harmoniosamente com ‘Volta ao mundo em 80 dias’, inspirado no clássico livro de Júlio Verne. É na categoria de jogos para multiplayers que os conceitos de mobilidade e de globalização se fundem. Dá para jogar Penalti 2 ou Bejeweled na fila do banco em Cingapura enquanto o adversário enfrenta um engarrafamento em São Paulo. Se depender do esforço da Abragames, o sujeito na fila do banco em Cingapura estará se divertindo com um joguinho brasileiro. “Estamos lutando para aumentar o número de associados e assim conseguir que esse mercado no Brasil fique sério o bastante para exportarmos software”, prega o diretor da entidade Carlos Estigarribia. O paraibano Herval Pereira, da Sollipsis, que representa algumas empresas na área de jogos para celular e está fechando uma venda para o Chile, assina embaixo. “Hoje em dia, a exportação é quase zero, provavelmente apenas quatro empresas fazem isso no Brasil hoje. China, Índia e Austrália já têm uma receita grande de criar e exportar jogos”. A política pública de incentivo da Coréia do Sul é o sonho dos desenvolvedores brasileiros de jogos. O bom desempenho do mercado sul-coreano em 2003 - US$ 3,3 bilhões – é resultado da ação conjunta da associação local dos desenvolvedores de jogos eletrônicos e do governo que os apóia e incentiva, inclusive com benefícios fiscais. Nos países desenvolvidos, o setor de jogos já fatura mais que algumas bilheterias de cinema. Em manifesto enviado ao governo federal, a Abragames apregoa sua futura participação no cenário econômico. “Para o Brasil, os jogos eletrônicos não só representam o segmento onde mais resultado pode ser obtido com pouco investimento, mas também a chance do país de estar na frente da corrida de geração de conteúdo digital, aliado a um potencial de exportação superior a qualquer outro conteúdo audiovisual. Finalmente, deve-se comentar que a área tem como contribuir e muito para o Brasil atingir a sua ousada meta de 2 bilhões de dólares de exportação de software em 2007.” Se a meta do Brasil é exportar US$ 2 bilhões em software, o que você está esperando para pegar uma fatia desse mercado? WebMobile 7
wm01.indb 7
7/1/2005 19:55:02
News
por Rodrigo Spinola
Lançamento Tablett A Tablett traz ao Brasil o Gmini400 da Archos. Este Personal Digital Entertainer (PDE) permite reunir, reproduzir e organizar cerca de 5 mil músicas, 200 mil fotos e visualizar 80h de vídeos em MPEG4, além de baixar games e arquivar dados no seu HD de 20 GB. Seu valor está em torno R$2.990,00. Fonte: www.terra.com.br
BMW lança capacete com conexão sem fio à Internet A empresa alemã BMW acaba de lançar um capacete para os motoqueiros que são fanáticos por internet. O System V conta com tecnologia Bluetooth que permite a conexão sem fio à Web. Além de contar com recursos óbvios como interconexão com celulares habilitados para Bluetooth, o System V também permite que o motoqueiro possa conversar com outro - algo que não deve ser muito recomendável em se tratando de altas velocidades sobre duas rodas. Maiores detalhes podem ser encontrados no site http://addict3d.org/index. php?page=viewarticle&type=news&ID=3498. Fonte: www.terra.com.br
Nokia fez, no Brasil, lançamento mundial do 9500 Communicator Por questões estratégicas, a Nokia antecipou para dezembro, no Brasil, o lançamento mundial do celular 9500 Communicator, que estava previsto para janeiro de 2005. O novo modelo permite ao usuário enviar mensagens, acessar e-mail e aplicações corporativas. O 9.500 suporta simultaneamente as tecnologias GSM/Edge e Wi-Fi, ou seja, trata-se de um computador de bolso e smart phone mais completo e compacto da indústria atualmente - afirmou Venzi (gerente de desenvolvimento de negócios da Nokia). Fonte: O Globo
8 1º Edição
wm01.indb 8
7/1/2005 19:55:09
News
Novidades no mundo mobile Depois dos lançamentos do Tungsten T5 pela PalmOne, dos modelos Hx e Rz da HP, do Axim X50 da Dell, não se esperava mais lançamentos significativos no final de 2004, mas houve algumas questões interessantes que podem significar novas tendências para o mercado em 2005. Depois de vários meses de espera, a PalmOne finalmente lançou o smartphone Treo 600 no Brasil. Paralelamente, outras empresas nacionais já começam a lançar acessórios nacionais para o novo smartphone, como a Portare, que lançou uma nova linha de capas. O que se espera é que o Treo 650 (que em breve será lançado nos Estados Unidos) não demore tanto para ser lançado no Brasil.
desktop, informa o The Wall Street Journal. Entre as novidades oferecidas pelo buscador, estão respostas para perguntas diretas – pescadas nos verbetes da enciclopédia Microsoft Encarta – e um sistema que identifica automaticamente a localização geográfica do usuário e apresenta os resultados que estão mais próximos dele. A ferramenta também permite fazer buscas específicas de notícias e imagens. A versão beta do mecanismo de busca está disponível em inglês (http://beta.search. msn.com/). Fonte: InfoExame - Brasil
Fonte: GentePalm.com.Br
Windows Mobile ultrapassa Palm OS, diz Gartner Pela primeira vez, o sistema operacional Windows Mobile (antigo Windows CE, a versão para PDAs do sistema da Microsoft) ultrapassou, em vendas, o Palm OS da PalmSource. A informação é do Gartner. No terceiro trimestre, foram entregues pelas fabricantes aos distribuidores de todo o mundo quase 2,86 milhões de PDAs, um crescimento de 13,6% com relação ao ano anterior. Segundo o instituto, o Windows Mobile estava presente em 48,1% de todos os equipamentos vendidos no período, enquanto os handhelds Palm OS representaram apenas 29,8% do total - no terceiro trimestre do ano passado, o sistema da PalmSource tinha 46,9% das vendas. Fonte: InfoExame - Brasil
Skype e Siemens levam VoIP para telefone sem fio Os usuários do serviço de telefonia VoIP do Skype não precisam mais passar horas em frente ao computador. Em vez disso, podem fazer e receber ligações por meio de telefones sem fio da Siemens. Um adaptador Gigaset M34, conectado na saída USB do computador do usuário, comunica-se com a base do telefone, que passa a fazer e receber ligações via internet rápida. A novidade, por enquanto disponível apenas na Europa, funciona em seis modelos de telefone sem fio Gigaset recém-lançados pela Siemens, que custam entre 65 e 260 dólares. Fonte: InfoExame - Brasil
Microsoft apresenta ferramenta de busca Depois de 18 meses de desenvolvimento, a Microsoft apresentou uma ferramenta de busca na internet, que vai competir por esse mercado com o Google. A idéia da nova ferramenta é combinar busca na internet e anúncios. A companhia também está trabalhando numa tecnologia para localização de informações no
Motorola abre centro mundial de software no Brasil A Motorola abriu no Brasil seu primeiro centro mundial de integração e verificação de software que dará suporte a todos os modelos de aparelhos fabricados pela empresa no mundo. O centro receberá investimentos de US$ 20 milhões nos próximos 15 meses. O centro abriga cem funcionários, a maioria desenvolvedores de software, e foi inaugurado na sede da companhia no país, em Jaguariúna, interior de São Paulo. O centro vai verificar o desempenho dos diferentes aplicativos que fazem parte de um telefone celular, como envio de mensagens, download de arquivos e execução de músicas. “Agora poderemos verificar o funcionamento de todas as partes em conjunto, evitando problemas que possam ser gerados com o uso de mais de uma função ao mesmo tempo”, afirmou a diretora de pesquisa e desenvolvimento da Motorola do Brasil, Rosana Fernandes. “Com a complexidade dos telefones aumentando cada vez mais, os recursos dos aparelhos têm que funcionar em conjunto”, explicou. Com as atividades de testes e de integração de softwares concentradas no Brasil, outras regiões onde a Motorola opera podem se voltar mais ao desenvolvimento de novos aplicativos. Rosana citou como exemplo a Índia, onde a empresa tem um centro de softwares multimídia. O Brasil continuará a produzir programas de transmissão de mensagens curtas para os modelos da empresa. Fonte: Reuters
WebMobile 9
wm01.indb 9
7/1/2005 19:55:10
WebMobile Tech Week A
conteceu nos dias 26 e 27 de novembro em São Paulo o WebMobile Tech Week. Considerado o maior evento de web e wireless já realizado no Brasil, reuniu mais de 400 pessoas entre congressistas, palestrantes e pessoal de apoio, que se dividiram em seis salas simultâneas. Realizado pelo Grupo DevMedia e patrocinado pela Nokia e Microsoft, o evento foi o pré-lançamento da revista WebMobile. As palestras foram concorridas, assim como os intervalos do coffeebreak, momento ideal para os comentários sobre os assuntos abordados no evento. O WebMobile Tech Week foi realizado com objetivo de apresentar para o mercado as novas tecnologias para o desenvolvimento web e wireless. Entre os temas, tiveram destaque as palestras sobre J2ME, desenvolvimento de jogos para celular, Windows Mobile e as palestras gerenciais, que discutiram o mercado de mobilidade. Durante os dois dias de realização foram ministrados 2 keynotes, 54 palestras técnicas, 7 mini-cursos e 3 Ask the Experts, sempre focados no desenvolvimento web e wireless. Contamos com a participação de mais 40 palestrantes, todos com larga experiência no mercado. Confira a cobertura completa do evento no endereço www.portalwebmobile.com.br/mobile.
Em vários momentos do evento tivemos encontros de palestrantes e congressistas no Stand da Microsoft. Ao lado: Maycol Romeli, Renato Haddad, Alexandre Tarifa, entre outros.
No Stand da Nokia, havia alguns dos seus últimos lançamentos para demonstração ao publico.
10 1º Edição
wm01.indb 10
Recepção do evento, onde foi realizado o cadastramento e entrega do material.
O Stand da DevMedia, além de ter sido um local de referência para que todos pudessem degustar e adquirir os produtos do grupo, foi ponto de encontro de congressistas, palestrantes e toda equipe do evento. Na foto, Jeff Wendell, Gladstone Matos, Kaline Dolabella e Edison Costa.
Salão do Coffee-breaK
Auditório completamente lotado na palestra de abertura.
7/1/2005 19:55:26
Java
T
odos já ouviram falar da tecnologia Java. E com a evolução dos aparelhos celulares, dos PDA’s e das tecnologias de comunicação, Java também ganhou importância no mundo dos aparelhos móveis, disponibilizando uma plataforma segura e muito bem fundamentada para programadores e fabricantes de celulares. A tecnologia Java subdivide-se em três grandes partes: J2EE, J2SE e J2ME. O Java 2 Micro Edition (J2ME) é uma API Java voltada para microaplicativos que rodam em microdispositivos assim como os celulares e PDA’s. É sobre essa tecnologia que este artigo tratará, buscando demonstrar de uma forma prática o desenvolvimento de aplicações J2ME, desde a instalação do ambiente de desenvolvimento até a construção de uma aplicação simples, porém bem mais “sofisticada” do que um simples HelloWorld.
Introdução ao J2ME
Introdução ao
J2ME
por Juliano Carniel e Clóvis Teixeira
O J2ME, assim como quase toda tecnologia Java, é regulamentada pelo JCP (Java Comunity Process). Entretanto, existem várias empresas de grande porte por trás do J2ME, como: Nokia, Motorola, IBM, Intel, Sony, Siemens. Java 2 Micro Edition (J2ME) é subdividido em duas importantes camadas: Configuration e Profile. Além dessas, existem ainda as API’s opcionais, algumas disponibilizadas por fabricantes, ou mesmo por versões mais novas da tecnologia. As Configurations provêem os serviços mais básicos para que as aplicações possam rodar, tais como: sistemas de comunicação, a segurança interna da Virtual Machine e o acoplamento com o dispositivo. Existem dois tipos de Configurations: a CDC (Connected Device Configuration), que é usada em dispositivos um pouco maiores como: set-top boxes (aparelhos de TV por assinatura) e sistemas de telemetria de carros, os quais possuem um processamento razoável e uma memória um pouco maior. a CLDC (Conected Limited Device Configuration), que é usada por dispositivos com pouca memória e um processador relativamente fraco, como é o caso dos celulares, PDA’s e Pagers. Já os Profiles provêem uma série de API’s padrões que combinados com uma configuration, no nosso caso o CLDC, provêem um serviço completo para que as aplicações possam ser executadas. Existem vários tipos de Profiles, contudo gostaria de destacar dois deles: (1) o MIDP (Mobile Information Device Profile) e (2) o PDAP (Personal Digital Assistant Profile) usado para PDA’s. Com relação ao MIDP, existem atualmente duas versões: a 1.0 e a 2.0. A versão do MIDP1.0 está WebMobile 11
wm01.indb 11
7/1/2005 19:55:28
integrada praticamente em todos os celulares atuais. Quanto ao MIDP2.0, existem atualmente vários celulares no mundo com essa tecnologia, que só tende a ganhar espaço, pois sua compatibilidade com a versão 1.0 é total. Entretanto, no Brasil existem apenas alguns que começaram a ser inseridos no mercado a partir do início de 2004. As aplicações em J2ME, principalmente para celulares (que são as mais produzidas), costumam ser chamadas de MIDlet’s pelo fato delas obrigatoriamente sempre herdarem (extends) de MIDlet (como veremos a seguir). O MIDP exige dispositivos com os seguintes requisitos mínimos: Mínimo de 160kB de memória não-volátil para Java; Um processador de 16 bits ou 32 bits com um clock de no mínimo 16MHz; 32KB de memória volátil para tempo de execução; Pelo menos 192KB livres para Java; 8KB de memória não-volátil para armazenamento de dados; Uma tela de pelo menos 96x54 pixels; Capacidade de entrada de dados seja por teclado (do celular), teclado externo ou mesmo touch-screen; Possibilidade de enviar e receber dados em conexão possivelmente intermitente e banda reduzida. Os aparelhos que suportam J2ME trabalham basicamente com dois tipos de arquivos, os com extensão jad (Java Application Descriptor) e os de extensão jar (Java Archive). O arquivo .jad é um arquivo de descrição do aplicativo e dentro dele há algumas informações referentes ao fabricante, versão, link pra o .jar, entre outras. Já o arquivo .jar é o aplicativo propriamente dito, todas as classes compiladas estão lá dentro, bem como as imagens usadas nas aplicações. O arquivo .jad é necessário apenas para fazer download do aplicativo direto pelo celular via web. Se for usado algum outro meio de transferência de aplicativos, em geral, ele não será exigido.
usada para se ter uma referência de mais baixo nível à tela, ou seja, manipularmos diretamente os gráficos apresentados. Já a classe Screen possui várias subclasses como Alert, List, TextBox e Form. Dessas, a classe Form é usada como container para que se possa adicionar outros componentes, que são chamados de Itens, como: ChoiceGroup, ImageItem, Gauge, TextField, StringItem, TextField. Combinando-se esses itens podemos obter uma interface amigável, entretanto, é importante precaver-se contra o uso excessivo de itens adicionados a um mesmo Form, por questões estéticas e de facilidades de uso. Gostaria de destacar também que o J2ME, assim como o resto da tecnologia Java, possui um GarbageCollector. Porém, esse método não é executado de forma automática, é preciso, dependendo da aplicação, chamá-lo para a liberação de memória.
Instalando e configurando o ambiente Neste artigo usaremos a IDE NetBeans que pode ser baixada no site www.netbeans.org e o módulo do NetBeans chamado NetBeans Mobility que também pode ser baixado no próprio site do NetBeans. Você irá instalá-lo normalmente como qualquer programa. A partir de agora veremos um pequeno tutorial sobre importação de projetos do Wireless Toolkit para o NetBeans e a criação de um novo projeto nesta IDE. O Wireless Toolkit (WTK) é uma plataforma gratuita para a execução de aplicativos em J2ME (já vem com alguns emuladores) que pode ser encontrada para download no próprio site da Sun. O WTK não contém um editor próprio para os programas, apenas requer que você adicione a ele o projeto para poder rodar. O NetBeans, plataforma adotada para esse tutorial com o seu plugin NetBeans Mobility, já contém o WTK integrado a ele.
Importando um projeto do Wireless Toolkit Com o NetBeans aberto, vá em File ->New Project. Na tela “Choose Project” iremos escolher a Categoria “Mobile”. O que nos dará as opções mostradas na 2.
Componentes do J2ME Todos os celulares, além do seu teclado numérico (ou qualquer que seja o método de entrada de dados), possuem teclas especiais chamadas de SoftKeys ou SoftButtons que se adaptam às diversas aplicações. A essas teclas são associados os commands que interagirão com o usuário. Estes commands são definidos pelo programador, embora ele não saiba exatamente onde estarão localizados na interface com o usuário. Somente em tempo de execução o programa saberá onde alojar cada command, conforme a característica (CommandType) definida para ele. Algumas dessas características podem ser: ok, back, exit, screen, etc. Esses commands devem ser adicionados a um objeto que deve herdar de Displayable. Conforme pode ser visto na 1, existem duas classes que herdam diretamente de Displayable: Canvas e Screen. Canvas é
1. Herança de classes.
12 1º Edição
wm01.indb 12
7/1/2005 19:55:31
Java
Caso você já tenha o WTK instalado e com aplicações “desenvolvidas” nele, você poderá migrá-las para o NetBeans. Para isso escolhemos a Opção: “Import Wireless Toolkit Project” e apertamos “Next”. Feito isto é apresentada a tela para selecionar o projeto desenvolvido no WTK. Em seguida haverá uma tela para colocarmos o caminho de diretórios de onde o seu WTK (Wireless Toolkit) encontra-se. Colocado o caminho do diretório, aparecerá uma lista de todos os projetos que há no WTK especificado, então basta selecionarmos o projeto desejado e apertar “Next”, como podemos ver na 3. Feito isto, teremos de escolher o nome do projeto e o endereço onde queremos que ele fique. Na mesma tela temos uma opção “Set as Main Project” que se selecionado tornará o projeto importado como o projeto principal do NetBeans (ver 4). Na próxima tela ( 5), escolheremos a plataforma de desenvolvimento, que por padrão é J2ME Wireless Toolkit. Após esta seleção, escolhemos ainda em que tipo de emulador queremos que nossa aplicação seja executada. Na configuração do dispositivo, escolhemos se ele vai emular CLDC1.0 ou CLDC1.1 (CLDC1.0 é o padrão de mercado atual). E por fim, o Profile que poderá ser MIDP1.0 ou MIDP2.0 (como já vimos o MIDP1.0 existe em maior número). Apertamos “Finish” e temos o projeto criado. Vale lembrar ainda, que ele não usa o projeto que estava sendo utilizado pelo desenvolvedor com o WTK, ele copia os arquivos do projeto para o diretório que escolhemos. Logo, o que for alterado no NetBeans não será alterado no seu projeto no WTK.
2. Tela de novo projeto de Mobile.
3. Tela de especificação da localização do WTK.
Criando um novo projeto Para criarmos um novo projeto, repita os mesmos passos que fizemos no tópico anterior, porém agora escolha “Mobile Application” ( 2) e aperte “Next”. Isso nos leva a uma nova tela chamada “Project Name and Location”. Nesta nova tela vamos escolher o nome do projeto e sua localização em disco (Figura 6). Esta tela nos dará ainda mais duas opções: · Set as Main Project: o que faz com que esse projeto seja tido como o principal pelo NetBeans. · Create Hello MIDlet: essa opção faz com que o NetBeans crie pra você a classe principal (MIDlet) pronta para ser executada no emulador. Nesta classe já são implementados todos os métodos que são necessários para um MIDlet rodar. Se você nunca programou em J2ME essa opção é recomendada. Após ter selecionado as opções aperte “Next”. Uma nova tela é mostrada: “Plataform Selection”. Nesta tela, como vimos na importação de projetos ( 5), temos que escolher a plataforma de desenvolvimento J2ME. Primeiro escolhemos qual plataforma de emulação trabalhar, que por padrão é o WTK. Escolheremos então o aparelho emulador. Depois escolha a configuração do dispositivo: CLDC1.0 ou CLDC1.1, e por fim o profile: MIDP1.0 ou MIDP2.0. Apertamos “Finish” e temos o projeto criado.
4. Especificação do nome e localização do Projeto para o NetBeans.
Executando o seu projeto no emulador Para executar seu projeto, basta você clicar no botão Run Main Project na barra de ferramentas, ou apertar a tecla F6 (isso se o projeto tiver sido definido como “Main Project”). Se ele não for, você pode torná-lo “Main Project”, bastando para isso clicar com o botão direito do mouse no nome
5. Especificação da Plataforma a ser utilizada para o projeto.
WebMobile 13
wm01.indb 13
7/1/2005 19:55:35
do projeto na janela “Projects” e escolher a opção “Set Main Project” conforme ilustrado na 7. Você também pode executá-lo clicando com o botão direito do mouse sobre o nome do projeto e escolhendo “Run Project”. Esta última forma independe se o projeto é “Main Project“ ou não.
Criando o projeto ExemploWebMobile Depois de termos visto como criar projetos e como utilizar nossa IDE, vamos agora aprender como programar um pouco de J2ME. Neste artigo iremos desenvolver uma aplicação que vai um pouco além de um simples Hello World, visto que isso a própria IDE já cria. Nossa aplicação abordará a estruturação de uma aplicação em J2ME, mostrando os principais componentes que podem ser utilizados, e também alguns fluxos de telas. Inicialmente iremos criar um novo projeto, porém dessa vez, um projeto vazio. Para isso, seguiremos os passos descritos no tópico “Criando um novo projeto”, mas dessa vez não iremos selecionar a opção “Create Hello MIDlet” na tela “Project Name and Location” ( 6). Feito isto, nosso segundo passo é criar uma classe que herda de MIDlet (extends MIDlet). Para isso, clicamos com o botão da direita do mouse no nome do projeto (ExemploWebMobile), escolhemos a opção New-> MIDlet. Aparecerá então uma tela onde iremos escolher o nome da MIDlet e o nome da classe MIDlet conforme 8. Chamaremos essa MIDlet de “ExemploWebMobile” assim como o nome da classe principal que irá herdar de MIDlet. Podemos ainda especificar o ícone para a aplicação, bastando para isso que você tenha uma figura de um tamanho pequeno (16x16, podendo variar) dentro do diretório de sua aplicação. Podemos também neste passo atribuir essa MIDlet a um Package. Caso não usássemos Package, o próprio NetBeans adicionaria essa classe a um default Package. Em nosso caso, criaremos a MIDlet e todas as outras classes dentro de um Package chamado “br.com.webmobile”. Apertamos “Finish” e temos uma classe básica herdando de MIDlet e alocada dentro do Package criado. Tendo criado o projeto, agora vamos realmente ao que interessa: a implementação das classes de exemplo para que possamos conhecer mais de J2ME. Dê uma olhada na 1. Ela apresenta nosso arquivo ExemploWebMobile.java. Note que o NetBeans já adicionou os dois imports necessários para que possamos fazer nossa aplicação. No primeiro pacote, javax.microedition.midlet.*, temos a super classe da qual herdamos e no segundo, import javax.microedition.lcdui.*, temos todos os componentes gráficos que poderemos utilizar em nossas aplicações. Essa nossa classe herda (extends) de MIDlet, o que a torna o aplicativo principal (válido) para a Virtual Machine de J2ME. Como não selecionamos a opção HelloMIDlet na criação do projeto, a nossa classe principal não vem com a interface de Command, a CommandListener. Então, mãos à obra... A primeira coisa que devemos fazer é implementar a interface CommandListener na nossa classe MIDlet. Para isso colocamos do lado de extends MIDlet, a declaração implements CommandListener. Devemos também implementar o método commandAction(Command c,Displayable d) para tratar os eventos dos Commands como pode ser visto na linha 83 da 1.
6. Especificação do nome e localização do projeto.
7. Selecionando nosso projeto como Principal.
8. Criando uma nova MIDlet.
14 1º Edição
wm01.indb 14
7/1/2005 19:55:39
Java
1. Código da classe ExemploWebMobile.
this.list = new List(„Menu“,
39:
List.IMPLICIT, itens, null); 1: /**
40:
2: * Classe que herda de MIDlet, o que a torna aplicação J2ME,
41:
//adiciona-se o command Sair a list
3: * e classe principal para a aplicação.
42:
this.list.addCommand(this.cmdSair);
4: * Implementa CommandListener que define que ela controlará
43: 44:
/**
5: */
45:
* seta a List como Listener de commands e define-se
6:
46:
* quea própria classe tratará dos eventos de
7: package br.com.webmobile;
47:
* command, pois ela que implementa a Interface
9: import javax.microedition.midlet.*;
48:
*/
10: import javax.microedition.lcdui.*;
49:
this.list.setCommandListener(this);
11:
50:
ações dos commands
CommandListener
8:
12: public class ExemploWebMobile extends MIDlet implements CommandListener
private Display display; // Irá receber uma referencia ao display do aparelho
15:
private Command cmdSair;
` }
52: 53:
12: { 14:
51:
/**
54:
* Método herdado de MIDlet o qual é executado
55:
* logo após o construtor da aplicação
56:
*/
// Comando para sair da Applicação 16:
private List list; //lista que será usada como menu principal
17:
57:
public void startApp()
58:
{
59:
// coloca-se a instancia de Display da VM em um
//Display para podermos manipulá-lo.
objeto
18: 19:
public ExemploWebMobile()
60:
20:
{
61:
this.display = Display.getDisplay(this);
62:
// definimos a List como a tela a ser mostrada
21:
/**
63:
22:
* O texto „Sair“ é o label do Comando.
64:
23:
* A opção EXIT foi usada para que a VM possa colocar
65:
this.display.setCurrent(this.list); }
o command onde normalmente aparece o botão
66:
de EXIT das aplicações nativas do celular
67:
* Método usado quando a aplicação entra em mode de
68:
* pausa,seja por uma ligação recebida,
69:
* normalmente guarda-se o estado atual da aplicação
70:
* para que quando ela volte esteja com o estado
71:
*/
24:
*
25:
* fazendo com que isso torne a aplicação padrão com
/**
ou qualquer outra ação do celular
qualquer celular. 26:
* O terceiro parâmetro é a ordem dos Commands caso
27:
*/
haja mais de um do mesmo tipo.
28:
igual ao anterior ao pause
this.cmdSair = new Command(„Sair“, Command.EXIT, 0);
29: 30:
String itens[] = {„Itens“, „Alerts“} ; //lista de itens do menu(List)
72:
public void pauseApp()
73:
{
74:
}
31:
/**
75:
32:
* A opção IMPLICIT foi definida pois assim ela age
76:
33:
* como se fosse um command. As opções da lista devem
77:
34:
* ser escolhidas pela tecla de SELECT do celular
78:
35:
* A opção de null foi definida por que não iremos
79:
public void destroyApp(boolean unconditional)
36:
* usar imagens para os itens da lista, caso fosse
80:
{
81:
}
usado seria necessário um array de Image, 37:
* uma Image para cada opção.
38:
*/
/** * Método usado para finalizar a aplicação */
WebMobile 15
wm01.indb 15
7/1/2005 19:55:40
Continuação 82: 83:
public void commandAction(Command c, Displayable d)
84:
{
106:
// cada case representa a posição da
107:
case 0:
opção dentro do List, começando com 0
85:
//quando o command selecionado for o Sair
108:
86:
if(c == this.cmdSair)
109:
87:
{
110:
88:
this.destroyApp(true);
111:
89:
//notifica a VM que a aplicação foi destruida
112:
90:
this.notifyDestroyed();
113:
91:
}
114:
92: 93:
new ExemploFormItens(this); break;
case 1: new ExemploListAlerts(this); break; }
115: /**
116:
94:
* Verifica qual dos itens da lista foi
117:
95:
* selecionado, e se foi através
118:
da tecla de Select do celular.
} }
/**
119:
* Método que será usado pelas outras classes para
96:
* Pode-se usar o parâmetro Displayable para
120:
* se definir objeto que será mostrado na tela.
97:
* verificar se foi o command de determinada tela
121:
* Se for passado null, a tela principal será
*/
que foi selecionado, porém não precisa ser usado
novamente mostrada
98:
* caso você tenha certeza que determinado command
122:
99:
* é único e pertence somente àquela tela
123:
public void setDisplayable(Displayable d)
100:
*/
124:
{
101:
if(d == null)
125:
102:
if(c == List.SELECT_COMMAND && d == this.list)
126:
103:
{
127:
104:
switch(this.list.getSelectedIndex())
128:
105:
{
129:
this.display.setCurrent(this.list); else this.display.setCurrent(d); }
130:}
Entretanto, antes de começarmos a falar do nosso exemplo, vamos aprender o que são os três métodos abstratos que devem estar presentes nas classes que herdam de MIDlet: public void startApp() (linha 57 da 1): é o método que será chamado no início de execução do aplicativo. Ele será chamado logo depois do construtor da classe. Geralmente aqui é definido o componente que será mostrado na tela. public void pauseApp() (linha 72 da 1): é o método que será chamado quando houver uma interrupção na execução do aplicativo por parte do sistema operacional do aparelho, por exemplo, o recebimento de uma ligação, mensagem de bateria fraca, etc. Aqui deve-se criar um meio de congelar(pause) a aplicação para que ela possa ser recuperada corretamente depois da interrupção. public void destroyApp(boolean b) (linha 79 da 1): é o método chamado quando o aplicativo é fechado. Aqui se podem colocar códigos para persistir alguma informação que você queira recuperar nas próximas vezes que abrir o aplicativo. É importante lembrar que esses três métodos devem estar presentes em qualquer classe que herde de MIDlet. Porém, não
precisam conter código dentro deles, a não ser o startApp, que é onde chamamos um componente Displayable para a tela. Sabendo disso, podemos prosseguir para o nosso exemplo. A tela inicial do nosso exemplo é uma List, com duas opções, Itens e Alerts, onde estaremos mostrando exemplos de uso de Itens e de Alerts respectivamente. Para criarmos essa tela inicial vamos precisar de pelo menos um Command, que é o comando para sairmos da aplicação. Podemos ver no código da 1 que declaramos um Command cmdSair (linha 15), e no construtor inicializamos esse Command (linha 28). Criamos então um array de string com as opções e passamos como parâmetro para o construtor da List (linha 39). Criada a List, adicionamos os Commands a ela e definimos que a List capture eventos de Command com o método setCommandListener (linha 49). Feito isso, terminamos o construtor da classe. Agora vamos definir a nossa List como a tela inicial. Fazemos isso no método startApp. Para esse nosso exemplo não iremos colocar código nos métodos pauseApp e destroyApp, já citados acima. Agora vamos direto ao método da interface CommandListener, o commandAction (linha 83). Nele nós fazemos os testes para
16 1º Edição
wm01.indb 16
7/1/2005 19:55:42
Java
verificar que command foi ativado, para realizarmos o procedimento desejado para cada opção. A seguir (linha 123), criaremos um método que possa ser acessado por todas as classes do aplicativo a fim de definir o componente Displayable a ser mostrado na tela. Com isso terminamos a classe principal. As classes que iremos implementar agora será a próxima a ser utilizada pelo sistema durante a utilização da aplicação. Ou seja, implementaremos agora a classe ExemploFormItens, que se refere a primeira opção da List implementada na 1, conforme demonstrado na 9. A classe ExemploFormItens (apresentada na 2) é inicializada dentro do método commandAction da classe principal ( 1, linha 108). Nesta classe são usados vários componentes UI (User Interface) do J2ME, mais especificamente Form, StringItem, TextField, DateField e ChoiceGroup. Os componentes criados nesta classe são adicionados a um formulário ( 2, linhas 54-57) o qual será mostrado na tela. Temos comandos para voltar e, para gravar o que foi selecionado e preenchido. Não fizemos a validação dos dados para deixarmos a aplicação mais simples. Acompanhe no código da 2 para saber como são inicializados os componentes e como são adicionados ao formulário. O resultado da 2 é demonstrado na 10. Ao ser apertado o comando cmdGravar, será inicializada a classe ExemploResultado apresentada na 3, linhas 73-77 da
9. Aplicativo rodando no emulador com a classe ExemploWebMobile.
2. Passamos como parâmetro na sua chamada uma referência à classe principal e a classe ExemploFormItens para que os componentes selecionados possam ser recuperados na próxima tela. A classe ExemploResultado.java faz com que as opções e campos da tela anterior sejam mostradas como uma espécie de relatório. O resultado da implementação da 3 pode ser vista na 11. Ao apertar o comando Voltar, seremos redirecionados para a tela principal do aplicativo. Agora que já passamos pela implementação dos Itens, vamos aos Alerts. A classe ExemploListAlerts apresentada na 4 será inicializada no método commandAction (linha 112, 1) da classe principal (ExemploWebMobile). Nesta classe serão apresentados outros tipos de componentes, o Alerts. E para isso é criada uma lista (linhas 24-27) de diferentes tipos de alerta, um objeto Alert (linha 36) e um comando para voltarmos à tela principal (linha 21). O objeto alerta criado no construtor terá suas propriedades modificadas de acordo com a opção da List escolhida pelo usuário. Cada escolha de opção é tratada no método commandAction da interface CommandListener implementada nessa classe. Para esse tratamento, fazemos um switch (linhas 70-115) para podermos saber qual alert ativar de acordo com a opção (item da lista) selecionada. O resultado da 4 pode ser visualizada na 12. Assim finalizamos nosso exemplo sobre como manipular os componentes de interface com usuário do J2ME.
10. Aplicação rodando a classe ExemploFormItens.java.
11. Visualização da classe ExemploResultados.java.
WebMobile 17
wm01.indb 17
7/1/2005 19:55:46
2. Código da classe Exe FormItens. 1:
package br.com.webmobile;
37:
import javax.microedition.lcdui.*;
38:
this.itDtField = new DateField(“Data”,
2: 3:
DateField.DATE);
4:
39:
//opções que irão aparecer na lista
5:
public class ExemploFormItens implements CommandListener
40:
String itens[] = {“Opcao 1”, “Opcao 2”, “Opcao 3”};
6:
{
41:
7:
private ExemploWebMobile main; //referencia a MIDlet principal
42:
//EXCLUSIVE indica que será análogo a um RadioGroup
43:
this.itChGrp = new ChoiceGroup(“”,ChoiceGroup.
8:
private Command cmdVoltar;
9:
private Command cmdGravar;
44:
10:
private Form form; //form que será usado como container
45:
//adiciona-se os commands ao FORM
46:
this.form.addCommand(this.cmdVoltar);
47:
this.form.addCommand(this.cmdGravar);
48:
//seta o FORM como listener de commands,
49:
//e diz que quem vai tratar vai ser a própria classe
50:
this.form.setCommandListener(this);
para os Itens 11:
private StringItem itString; //StringItem (label:text) simples string de texto
12:
public TextField itTextField; //análogo ao JTextField do swing
13:
public DateField itDtField; //como um TextField porém
14:
public ChoiceGroup itChGrp; //lista que pode ser
abre um calendário
adicionada a um container 15:
//pode ser como checkbox ou radio
16:
EXCLUSIVE, itens, null);
51: 52:
//adiciona-se os itens ao form (append sempre coloca
53:
//o item no final da lista)
54:
this.form.append(this.itString);
55:
this.form.append(this.itTextField);
56:
this.form.append(this.itDtField); this.form.append(this.itChGrp);
17:
public ExemploFormItens(ExemploWebMobile princ)
57:
18:
{
58:
19:
this.main = princ;
59:
//main é referencia a ExemploWebMobile que contém a
20:
this.cmdVoltar = new Command(“Voltar”, Command.BACK,
60:
//e seta-se qual objeto vai agora ser mostrado na
21:
this.cmdGravar = new Command(“Gravar”, Command.OK,
61:
this.main.setDisplayable(this.form);
10:
referencia ao display
0);
0); 22:
tela do celular
62:
}
63:
23:
// o Form possui vários construtores com parâmetros
64:
public void commandAction(Command c, Displayable d)
24:
// diferentes, no caso abaixo passamos somente o
65:
{
25:
// Título do Form.
66:
//se o command apertado for o Voltar
26:
this.form = new Form(“Form com Itens”);
67:
if(c == this.cmdVoltar)
68:
{
27: 28:
29:
// StringItem é basicamente uma String no formato
69:
// label:valor
70:
this.itString = new StringItem(“Aplicativo”, ”WebMobile”);
this.main.setDisplayable(null); }
71: 72:
//se o Command apertado for o Gravar, que chama
30:
outra classe.
31:
// Caixa de texto que vem com label embutido.
73:
if(c == this.cmdGravar)
32:
// o terceiro parâmetro é o tamanho maximo do campo
74:
{
33:
// o quarto é o tipo do campo, uma esécie de máscara.
75:
//pode-se implementar por exemplo uma gravaçao
34:
this.itTextField = new TextField( 76:
new ExemploResultado(this.main,this);
“Telefone”,””,20,TextField.PHONENUMBER); 35: 36:
desses dados em RMS
77: // Campo para data ou hora, vai depender do segundo parâmetro passado
78:
} }
79:}
18 1º Edição
wm01.indb 18
7/1/2005 19:55:48
Java
36:
3. Código da classe ExemploResultados.
this.formResultados=new Form(„Resultados“);
37: 38:
1:
package br.com.webmobile;
2: 3:
import javax.microedition.lcdui.*;
4:
import java.util.*;
6:
public class ExemploResultado implements CommandListener
7:
{ private Form formResultados;
private StringItem telefone,data,opcao; //itens que mostrarão os dados
10:
// que aparece na tela no formato label:valor
41:
this.telefone=new StringItem(„Telefone:“,
42:
this.data=new StringItem(„Data:“,data);
43:
this.opcao=new
private Command cmdVoltar; //command para voltar para a tela principal
11:
private ExemploWebMobile main;
12:
private ExemploFormItens efi;
//referencia a tela principal da MIDlet
//referencia a tela anterior de onde vieram os dados
this.efi.itChGrp.getSelectedIndex()));
44: 45: 46:
//os itens com os dados são adicionados ao form
47:
this.formResultados.append(this.telefone);
48:
this.formResultados.append(this.data);
49:
this.formResultados.append(this.opcao);
50: 51:
//command definido como BACK para que possa ficar
52:
this.cmdVoltar=new Command(„Voltar“,
no padrão do celular
13: 14:
Command.BACK,0); public ExemploResultado(ExemploWebMobile prin, ExemploFormItens efi)
15:
54:
//adiciona-se o comando e ativa o Form para
55:
this.formResultados.addCommand(this.cmdVoltar);
56:
this.formResultados.setCommandListener(this);
capturar eventos this.main=prin;
17:
this.efi=efi;
18:
57: /**
20:
* É necessário tratar a data porque
21:
* se ela nao for preenchida ela vem como null
22:
* Abaixo são recuperados os dados do formulário * anterior
23:
*/ String data;
25:
if(this.efi.itDtField.getDate()!=null)
26:
{
27:
Calendar date=Calendar.getInstance();
28:
date.setTime(this.efi.itDtField.getDate());
29:
data=date.get(Calendar.DAY_OF_MONTH)+“/“+(date. get(Calendar.MONTH)+1)+
30:
„/“+date.get(Calendar.YEAR);
31:
}
32:
else
33:
{
34:
58:
//é definido qual objeto aparecerá
59:
this.main.setDisplayable(this.formResultados);
na tela do celular
60:
}
61:
24:
35:
53:
{
16:
19:
StringItem(„Opção:“,
this.efi.itChGrp.getString( //form que será usado para se mostrar os dados
9:
//Como já vimos, o StringItem é um componente
40:
this.efi.itTextField.getString());
5:
8:
39:
62:
public void commandAction(Command c,Displayable d)
63:
{
64:
/**
65:
* se o command Voltar for selecionado a tela
66:
* a list principal da MIDlet
* mostrada será
67:
*/
68:
if(c==this.cmdVoltar)
69:
{ this.main.setDisplayable(null);
70: 71: 72: data=“Data não selcionada“;
} }
73: }
}
WebMobile 19
wm01.indb 19
7/1/2005 19:55:50
4. Código da Classe ExemploListAlerts. 1:
//adiciona-se o command a list
40:
this.list.addCommand(this.cmdVoltar);
41:
//define-se a list como sendo listener de
42:
this.list.setCommandListener(this);
package br.com.webmobile;
commands
2: 3:
39:
import javax.microedition.lcdui.*;
43:
4:
44:
//seta-se o objeto que será mostrado na tela
5:
public class ExemploListAlerts implements CommandListener
45:
this.main.setDisplayable(this.list);
6:
{
46:
7:
private ExemploWebMobile main;
8:
private Command cmdVoltar;
}
47:
//referencia a tela principal
//command que será usado para voltar a tela principal
48:
public void commandAction(Command c, Displayable d)
49:
{
50:
/**
9:
private List list; //list que será usado como Menu
51:
* se o command Voltar for selecionado a tela
10:
private Alert alert;
52:
* mostrada será a list principal da MIDlet
//alert que será usado para criação dos exemplos 11:
53:
private Image logo=null; //imagem que será mostrada nos alerts.
12:
*/
54:
if(c == this.cmdVoltar)
55:
{ this.main.setDisplayable(null);
56:
13:
public ExemploListAlerts(ExemploWebMobile princ)
57:
14:
{
58:
15:
this.main = princ;
16: 17:
}
59: /**
/**
60:
* Verifica qual dos itens da lista foi
* que ele possa ser posto na tela de
61:
* da tecla de Select do celular.
19:
* acordo com o padrão do celular
62:
* Após verficação seta-se o tipo do alerta que
20:
*/ 63:
* ficará na tela do usuario
64:
* obs: Tempo em milisegundos.
65:
* É importante lembrar que as características
66:
* apresentadas por
18:
21:
* Definiu-se o tipo do command como BACK, para
selecionado, e se foi através
será mostrado e qual o tempo que ele
this.cmdVoltar = new Command(„Voltar“, Command.BACK, 0);
22: 23:
//itens que serão mostrados na lista como opções
24:
String itens[] = {„Alert Alarm“, „Alert Confirmation“, „Alert Error“,
25:
Alert Info“, „Alert Warning“, „Alert Modal“
26:
//novamente não usamos imagens
27:
this.list = new List(„List“,
para os itens da lista
List.IMPLICIT, itens, null); 28:
cada tipo de alert vai
depender da implementação MIDP de cada aparelho. };
67:
*/
68:
if(c == List.SELECT_COMMAND && d == this.list)
69:
{
70:
switch(this.list.getSelectedIndex())
71:
{
29:
// Carrega imagem .png para usar nos alerts
72:
30:
try
73:
this.alert.setString(
31:
{ 74:
this.alert.setType(AlertType.ALARM); this.alert.setTimeout(2000);
„Mensagem de Alarme para o usuario!“); this.logo=Image.createImage(„/Logo.png“);
32: 33:
}
75:
34:
catch(Exception e ){}
76:
35: 36:
77: this.alert = new Alert( „Exemplo de Alertas“, „Mensagem Padrão“,
37: 38:
case 0:
this.logo, AlertType.ALARM );
this.main.setDisplayable(this.alert); break;
78: 79: 80:
case 1: this.alert.setString(„Mensagem de Confirmação para o usuario!“);
20 1º Edição
wm01.indb 20
7/1/2005 19:55:51
Java
Continuação
99: case 4:
100: 81:
this.alert.setType(AlertType.
101:
this.alert.setString(„Mensagem de
this.alert.setTimeout(2000);
102:
this.alert.setType(AlertType.WARNING);
this.main.setDisplayable(this.alert);
103:
this.alert.setTimeout(2000);
CONFIRMATION); 82: 83: 84:
break;
87:
case 2: this.alert.setString(
106:
108:
// Este alerta ficará na tela até que
this.alert.setString(
this.alert.setType(AlertType.ERROR);
89:
this.alert.setTimeout(2000);
109:
this.main.setDisplayable(this.alert);
110:
94:
o usuário aperte um botao
com tempo infinito!“);
case 3: this.alert.setString( „Mensagem de Info para o usuario!“);
111:
this.alert.setType(AlertType.WARNING);
112:
this.alert.setTimeout(Alert.FOREVER);
this.alert.setType(AlertType.INFO);
115:
this.alert.setTimeout(2000);
116:
this.main.setDisplayable(this.alert);
117:
break;
Conclusão Há muitos outros componentes que não vimos neste exemplo. Portanto, se você quiser conhecer mais sobre o J2ME, você deve estar sempre com a documentação ao seu lado. Se você tem o WTK instalado, a documentação está na pasta “/docs”, ou você poderá achá-la no site da própria Sun Microsystems®. Pratique bastante e até uma próxima vez!
break;
114:
96:
98:
this.main.setDisplayable(this.alert);
113:
95:
97:
„Mensagem de Alerta para usuario,
break;
92: 93:
case 5:
107:
88:
91:
break;
105:
„Mensagem de Erro para o usuario!“);
90:
this.main.setDisplayable(this.alert);
104:
85: 86:
Alerta para o usuario!“);
} } }//fim do metodo
118: }//fim da classe
Juliano D. Carniel (juliano@portaljava.com) Desenvolvedor da plataforma Java, e com experiência de dois anos em J2ME e SuperWaba, para soluções coorporativas, de mobilidade e integração de sistemas. Co-autor da Apostila de J2ME divulgada no PortalJava, do qual é um dos Administradores. Palestrante em eventos de Java, como o WebMobile.
Clovis Teixeira (clv@portaljava.com) Desenvolvedor Java com experiência de dois anos em J2ME e Superwaba. Co-autor da Apostila de J2ME divulgada no PortalJava, do qual é também Moderador. Desenvolvedor de Games em J2ME – Já desenvolveu vários jogos e demos e atualmente lidera uma equipe de programadores e designers no desenvolvimento de games para o PortalJava (www.portaljava.com).
Faça o download no site: www.portalwebmobile.com.br/revista/ed1 12. Lista de Alerts e o resultado do alert selecionado.
WebMobile 21
wm01.indb 21
7/1/2005 19:56:04
22 1º Edição
wm01.indb 22
7/1/2005 19:56:12
Construindo sua primeira aplicação para POCKET PC com .NET Pocket PC
por Renato Haddad
I
ntrodução
O mundo móvel tem avançado no mercado de desenvolvimento de aplicações de forma a agregar valor às aplicações existentes. O acesso à informação em qualquer lugar ou hora tem conquistado vários segmentos que precisam dos dados na palma da mão, por exemplo, equipe de vendas, corretores de bolsa de valores, gerente de contas, etc. O fato da informação estar armazenada em um dispositivo móvel não significa que ela não possa ser atualizada, pelo contrário, a informação deverá estar sempre atualizada de acordo com a necessidade da aplicação, por exemplo, quando você for fechar um negócio em dólares, é preciso saber a cotação naquele instante.
Com a chegada dos telefones celulares na década de 90, o mundo percebeu que haveria uma mudança radical nos meios de comunicação. E isto realmente ocorreu em favor da tecnologia. Haja visto que atualmente o número de celulares já ultrapassou o número de linhas fixas. Evoluindo para um cenário de aplicações móveis, o uso de SMS (Short Message Service) tornou-se uma forma barata e simples de integrar informações. Hoje em dia já dispomos em diversos pontos do mundo os aparelhos chamados Access Point (ponto de acesso), o qual provêem sinais de rede. O alcance do sinal varia de 100 a 150 metros, mas estudos já estão sendo concluídos para que o sinal chegue a 75 km. Com isso, teremos uma rede sem fio (Wi-Fi Wireless Fidelity) paralela e todo equipamento que estiver preparado para receber este sinal Wi-Fi estará na rede. Os dispositivos incluem notebooks, Pocket PCs, smartphone, celulares, Phone-Edition, DVD, televisão, etc. Outra tecnologia que está se destacando é o bluetooth, que permite a conexão a um dispositivo até uma distância 10 metros. Mas, não confunda Wi-Fi com bluetooth. São objetivos diferentes, o Wi-Fi provê sinal de rede e o bluetooth apenas um sinal de comunicação limitado. Neste tutorial iremos desenvolver um projeto voltado ao Pocket PC, onde mostrarei como criar um projeto, formulários, controles, menu, acesso a banco de dados e deploy de uma aplicação. No tocante ao banco de dados, cabe ressaltar que se você já estiver conectado a uma rede Wi-Fi, significa que você já tem acesso a qualquer dado existente na rede, seja TCP/IP ou http. Com isso, os dados não ficarão armazenados no Pocket, mas sim, as consultas serão efetuadas diretamente no banco de dados da empresa. No entanto, por questões de aprendizado, mostrarei como você pode criar um banco de dados no Pocket PC utilizando o SQL Server CE e manipular alguns desses dados. A plataforma utilizada neste treinamento é a .NET Compact Framework, que é um subconjunto da plataforma .NET completa. Contém funcionalidades específicas para estes tipos de dispositivos móveis e ao mesmo tempo é rico na linguagem, integração de dados via XML Web Services e outros recursos presentes no .NET.
Ferramentas A ferramenta mais utilizada para desenvolver aplicações para WebMobile 23
wm01.indb 23
7/1/2005 19:56:19
Pocket PC e Smartphone é o Visual Studio .NET 2003. Ele contém todos os requisitos para o desenvolvimento, debug e deploy. Para desenvolver estes tipos de aplicações não é preciso ter o hardware (Pocket ou Smartphone), pois o VS.NET 2003 dispõe de emuladores. No caso de Pocket PC, o emulador instalado é o padrão, no entanto, você pode baixar no link www.microsoft. com/downloads/details.aspx?familyid=4953d34d-692f-4c87-ac69cb235dbdad1d&displaylang=en o Emulator Images for Windows Mobile 2003 Second Edition-based Pocket PC Development. Para conectar o VS.NET 2003 ao emulador ou ao dispositivo diretamente, você precisará do Microsoft ActiveSync 3.7.1 (www.microsoft. com/downloads/details.aspx?FamilyID=2eb5bd80-d52c-4560ae11-da92f2b229fa&displaylang=en). Este é o programa que se encarregará de transferir qualquer tipo de dado para o Pocket PC. Você deve ter a base (craddle) do Pocket PC conectada via USB ao seu computador e pronto, o ActiveSync se encarrega do restante. As linguagens utilizadas podem ser Visual Basic. NET, Visual C# ou C++. Cabe ressaltar que muitos desenvolvedores usavam o Visual Basic Embedded, no entanto, esta linguagem não é mais suportada. Agora é um novo mundo, nova plataforma, novas linguagens. O sistema operacional destes dispositivos são oriundos do WinCE 4.2 e nos dispositivos são conhecidos como Pocket PC 2003 ou Windows Mobile. Portanto, observe com muita atenção quando você comprar um dispositivo qual é o SO. Se for Pocket PC 2002, não compre, pois possuem certas funcionalidades que não são suportadas. Neste caso quem se encarrega de atualizar a ROM é o fabricante, então, deixe isto para ele. Em termos de desenvolvimento é válido dizer que você pode desenvolver uma aplicação em Pocket PC 2003 e instalar no 2002. Salvo casos de features que só executam no 2003, o restante irá rodar.
Interfaces com Usuários (UI) Criar uma interface (UI) sempre foi um desafio em qualquer tipo de aplicação. A começar pelo tamanho da tela, os tipos de controles, a forma de navegar e interagir com a aplicação. No caso de Pocket PC é preciso analisar cuidadosamente o local, o operador e as interferências com o meio. Dependendo do uso, isto significa montar uma UI completamente customizável com o usuário. Imagine um local com uma incidência solar diretamente na tela do Pocket, o reflexo da luz, ou por outro lado, em uma sala escura de exames de radiologia. Enfim, com o tempo você aprenderá a contornar e entender melhor a UI. A interação com o usuário ocorre com uma caneta touch screen através da qual o usuário faz todas as operações, desde digitação (exceto os Pockets com teclado), selecionar controles e qualquer tipo de operação. É válido dizer que ainda não é usual encontrar em aplicações para Pocket o reconhecimento de voz, mas em breve teremos boas novidades na área. Vistos estes conceitos iniciais, veremos a partir de agora em um passo a passo como desenvolver uma aplicação para Pocket
PC na linguagem C#.
Projeto Novo Abra o Visual Studio .NET 2003, selecione File / New / Project (Ctrl + Shift + N) e digite os dados (ver 1): Project Types: Visual C# Projects Templates: Smart Device Application Name: tutorialPocket Location: C:\Projetos\WebMobile
1.
Clique no botão OK e será exibida uma nova janela (ver 2) contendo opções para Pocket PC, Windows CE ou Smartphone. Selecione Pocket PC e em tipos de projetos, Windows Application. Note ainda que a quantidade de emuladores disponíveis nesta janela depende da quantidade instalada na sua máquina. Clique no botão OK para criar o projeto. Note que a Solution chama-se tutorialPocket e que é criado o Form1.cs automaticamente (ver 3). Clique com o botão direito sobre o Form1.cs e exclua-o.
2.
24 1º Edição
wm01.indb 24
7/1/2005 19:56:23
Pocket PC
clique no ícone de Events (raio), selecione o evento GotFocus e clique duas vezes sobre ele (ver 5). Digite o seguinte código: private void txtNome_GotFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = true; }
Faça o mesmo para o txtSenha: private void txtSenha_GotFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = true; }
3.
Para criar qualquer formulário durante todo o artigo, abra o Solution Explorer, clique com o botão direito sobre tutorialPocket e selecione Add / Add Windows Form, informe o nome e clique no botão Open.
Controles e Propriedades Os controles existentes para Pocket PC são similares aos de uma Windows Application, no entanto, nem todos possuem as mesmas características, por exemplo, o ListBox não permite seleções múltiplas, o Datagrid não permite alterações no conteúdo das células nativamente, entre outras. Para começar, adicione um formulário chamado frmLogin. Selecione o menu View / Toolbox para exibir a caixa de ferramentas (Ctrl + Alt + X), arraste para o formulário os controles da 1. Após isso, pressione F4 para exibir a janela de propriedades e para cada controle configure. Agora inclua os controles MainMenu e InputPanel. Estes controles são específicos para montar um menu e para exibir o InputPanel quando o usuário precisar digitar algo no teclado virtual do Pocket. Cabe ressaltar que este teclado deverá ser exibido via programação conforme o contexto. A 4 apresenta o formulário com os controles inseridos. Selecione o formulário e configure as propriedades: BackColor (192, 192, 255), minimizeBox = False e Text = Controle de Acesso. O minimizeBox = False fará com que toda vez que o formulário for fechado através do controle (X) na janela da aplicação, este projeto não fique na memória do Pocket, evitando assim ter que liberar a aplicação da memória quando não estiver em uso. Veremos isto em maiores detalhes no momento do deploy.
Códigos O primeiro passo é exibir o InputPanel assim que um determinado TextBox receber o foco e ocultá-lo quando perder o foco. Selecione o txtNome, exiba as propriedades (F4),
Para ocultar o InputPanel o processo é idêntico, no entanto ocorre no evento LostFocus. Assim, insira os respectivos códigos para os controles. private void txtNome_LostFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = false; } private void txtSenha_LostFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = false; }
4. 1 PictureBox
Image: insira uma imagem conforme o logo da sua empresa SizeMode: normal/stretch/center
2 Labels
Text: Nome Text: Senha
2 TextBox 1 Button
Name: txtNome
Text: branco
Name: txtSenha
PasswordChar: *
Name: btnAcessar
Text: Acessar
Text: branco
1.
WebMobile 25
wm01.indb 25
7/1/2005 19:56:27
Para o botão btnAcessar, digite o código da 1 que irá verificar se todos os dados necessários foram digitados. Perceba que usei a classe System.Text.StringBuilder para concatenar strings. Use e abuse desta classe, pois foi criada para esta finalidade e é muito mais rápido que qualquer ou5. tro meio de concatenação que você conheça. Todos os códigos de UI já estão definidos, restando agora o código para rodar a aplicação. Para isto, localize o trecho de código chamado “#region Windows Form Designer generated code” o qual é padrão em toda aplicação C#. Logo abaixo deste trecho, digite o seguinte código para executar a aplicação, o qual irá abrir o formulário frmLogin declarado no argumento do Run. static void Main() { Application.Run(new frmLogin()); }
Para verificar se existem erros, você pode selecionar o menu Build / Build Solution. Se for exibida esta mensagem “Build: 1 succeeded, 0 failed, 0 skipped” na janela de output, significa que foi gerada a DLL com sucesso e é só distribuir aos clientes. No entanto, como iremos rodar com o emulador, o meio mais rápido é presssionar F5 ou o menu Debug / Start. Será exibida uma janela com todas as opções de emuladores existentes. Selecione o Pocket PC 2003 Emulator e clique no botão Deploy (ver 6). Se for a primeira vez que o emulador for aberto, é possível que ocorra um erro de comunicação com o mesmo. A dica é: faça o deploy sempre com o emulador aberto. Para isto, existe uma barra de ferramentas de Device onde você pode abrir em qualquer momento o emulator que desejar. Para exibir a respectiva barra, clique com o botão direito em qualquer barra de ferramentas e selecione Device. Enfim, se ocorreu algum erro, faça novamente o deploy e note que a aplicação é aberta exatamente no formato que você criou. Caso tenha o Pocket conectado ao computador via ActiveSync e queira fazer o deploy no mesmo, selecione Pocket PC Device. Note que quando os TextBoxes recebem o foco, o teclado é exibido automaticamente (ver 7). Dando continuidade ao 6.
desenvolvimento de nossa aplicação, adicione um novo formulário (Add / Add Windows Form) chamado frmVendas. Configure as propriedades BackColor (192, 192, 255), minimizeBox = False e Text = Vendas. Exiba a Toolbox e adicione o controle TabControl. Este controle pode ter diversas TabPages, e neste projeto iremos inserir duas. Em propriedades (F4), selecione a TabPages e note que é exibido um botão construtor (...) para a Collection de páginas (ver 8). Clique neste botão, em seguida no Add e Text, e digite: Vendas; repita o passo e adicione a Tab Financiamento. Veja o formulário com as duas páginas inseridas (ver 8). A partir de agora você pode inserir quantos controles forem necessários em cada página. A vantagem do TabControl é justamente a de reunir diversos controles afins no mesmo formulário. Futuramente, quando você vier a carregar dados nestes controles e notar que na abertura do formulário a performance está lenta, será possível adicionar os controles em tempo de execução. Na guia de Vendas, adicione os seguintes controles: 2 Labels e 2 ListBox (Name: lstFab e lstModelos). O funcionamento se dará da seguinte forma: quando o formulário for carregado será exibida a lista de fabricantes no lstFab. Quando o usuário selecionar um fabricante, então, via código iremos pesquisar todos os modelos de veículos disponíveis para venda. Selecione a lstFab e nas propriedades Items digite uma lista com os fabricantes existentes na loja. Clique no botão OK e note
7.
8.
26 1º Edição
wm01.indb 26
7/1/2005 19:56:32
Pocket PC
1.
2.
private void btnAcessar_Click(object sender, System.EventArgs e)
private void lstFab_SelectedIndexChanged(
{
object sender, System.EventArgs e) if (txtSenha.Text.Trim() != string.Empty &
{
txtNome.Text.Trim() != string.Empty)
// define um array para montar a lista de modelos
{
ArrayList aModelos = new ArrayList(); System.Text.StringBuilder msg =
// verifica qual fabricante foi selecionado e para
new System.Text.StringBuilder();
// item é montada uma lista de modelos
msg.Append(“Caro “);
switch (lstFab.SelectedItem.ToString())
msg.Append(txtNome.Text.Trim());
{
msg.Append(“ seu acesso está autorizado!!!”);
case “GM”:
MessageBox.Show(msg.ToString(),”Pocket PC”);
aModelos.Add(“Blazer Executive 2003”);
}
aModelos.Add(“S10 4 portas 2004”);
else
aModelos.Add(“Omega 2003/4”);
{
aModelos.Add(“Corsa Hatch 2003/4”); MessageBox.Show(“Digite todas as informações”,”Pocket PC”);
break;
txtNome.Focus();
case “VOLKS”:
}
aModelos.Add(“Audi A4 2002/3”);
}
aModelos.Add(“Passat 2004”); aModelos.Add(“Golf 2004/5”); aModelos.Add(“Audi A8 0km”); aModelos.Add(“Santana 0km”);
que a lstFab já contém todos os items (ver 9). Já a lista de modelos depende do fabricante selecionado. Dê um duplo clique no lstFab e note que é criado o evento onde o código apresentado na 2 deverá ser digitado. Na guia de Financiamentos adicione os controles apresentados na 2. O formulário deverá ficar com a aparência da 10. Agora dê um duplo clique no botão Calcular para montar a fórmula que calcula o valor da prestação referente ao financiamento do veículo. Esta é apenas uma fórmula matemática de cálculo onde são passados os parâmetros digitados pelo usuário. No entanto, existe uma particularidade para chamar a fórmula PMT (Pagamento). Como ela depende de uma classe do Visual Basic, precisamos referenciar a respectiva classe. Para isso, selecione
break; case “FORD”: aModelos.Add(“Explorer 2002”); aModelos.Add(“Mondeo 2003”); break; case “FIAT”: aModelos.Add(“Marea 2002”); aModelos.Add(“Marea Weekend 2003”); aModelos.Add(“Palio Adventure 0km”); break; case “MITSUBISHI”: aModelos.Add(“Pajero Full 0km”); aModelos.Add(“Pajero Sport 2003”); aModelos.Add(“Pajero Sport 2003”); aModelos.Add(“Pajero TR4 2005”); aModelos.Add(“L200 Sport HDE”); break; case “CITROEN”: aModelos.Add(“C3 2005”); aModelos.Add(“C5 2004 e 2005”); aModelos.Add(“Picasso 2002/3/4”); break; } // classifica a lista aModelos.Sort(); // define a origem da lstModelos que é o array montado lstModelos.DataSource = aModelos; }
9.
WebMobile 27
wm01.indb 27
7/1/2005 19:56:35
PictureBox
Image: sua figura SizeMode: normal/stretch/center
Labels
Text: Valor / Entrada / Juros / Parcelas
TextBox
Name: txtValor / txtEntrada / txtJuros Text: branco
NumericUpDown
Name: numParcelas Maximum: 50 Minimum: 1
Button
Value: 1
Name: btnCalcular Text: Calcular
Label
Name: lblValor (configure as propriedades Forecolor Font: size e bold) 2.
o menu Project / Add References, selecione a classe Microsoft. VisualBasic e clique no botão OK (ver 11). Como esta classe ficará na lista de References do Solution Explorer (ver 12), você poderá utilizá-la em qualquer parte do projeto. Cabe ressaltar que uma das grandes vantagens da plataforma .NET é a independência de linguagem. Neste nosso exemplo temos um projeto em C# usando uma classe em VB.NET. Em seguida, digite o código do botão que captura os valores digitados e invoca a fórmula PMT para calcular o valor da prestação do financiamento (ver 3). Note que como o usuário irá fornecer os respectivos valores, é preciso exibir o InputPanel. Para isso, adote a mesma estratégia do formulário anterior com os comandos apresentados na 4. O resultado do funcionamento do que elaboramos neste passo pode ser visto na 13. Este formulário será executado apenas se o usuário conseguir fazer o login corretamente no formulário frmLogin. Sendo assim, abra novamente o código do botão Acessar do frmLogin e inclua o código em negrito para instanciar e abrir o formulário de vendas (ver 5).
10.
11.
3. private void btnCalcular_Click(object sender, System.EventArgs e) { double juros = Convert.ToDouble(txtJuros.Text) /100; Int32 parcelas = Convert.ToInt32(numParcelas.Text); double valor = Convert.ToDouble(txtValor.Text); double entrada = Convert.ToDouble(txtEntrada.Text); if (entrada > 0) { valor -= entrada; } double resultado = - Microsoft.VisualBasic.Financial.Pmt(juros,parcelas,valor,0, Microsoft.VisualBasic.DueDate. EndOfPeriod); lblValor.Text = string.Format(“R$ {0:n2}”, resultado); }
28 1º Edição
wm01.indb 28
7/1/2005 19:56:40
Pocket PC
gem, selecione-a e clique em Remove. Ao finalizar, clique em OK para montar todo o Container do objeto ImageList1. Os botões de navegação servirão para navegar no Container. Para isto, digite o código apresentado na 6. Note que é verificado o índice do Container e é invocada uma rotina para exibir a foto no controle picFotos. Não se esqueça de inicializar a variável índice no início das declarações: Agora salve o projeto e execute-o no emulador (ver 18).
Oficina Quando um cliente chega à concessionária de veículos ele pode solicitar alguns serviços extras para o seu carro. Neste formulário iremos prover meios para que o atendente possa disponibilizar uma série de serviços para o cliente. Todos estes dados serão montados em uma matriz e exibidos em um controle ListBox. Em seguida, quando o cliente solicitar um serviço, este será transferido para outra ListBox de serviços contratados. Cabe ressaltar que para efeito de manutenção na ListBox é preciso criar os botões para excluir um item ou limpar todo o conteúdo. Outra possibilidade que daremos ao cliente é adicionar um novo serviço não disponível na lista. Portanto, criaremos uma UI para que o serviço seja informado e incluído na lista de serviços contratados. Para isto, adicione um novo formulário (Add / Add Windows Form) chamado frmOficina contendo os controles apresentados na 4. O formulário deverá ficar semelhante ao apresentado na 19. Altere as propriedades do formulário, sendo: MinimizeBox = False e Text = Oficina. Note que neste formulário há um controle TextBox e um Button (Incluir Novo Serviço) sobreposto à lstServContratados. A idéia aqui é fazer com que toda vez que o cliente contratar um serviço que não conste na lista, ou seja, o usuário terá que digitar, o controle lstServContratados fique oculto até que este novo serviço seja digitado. Assim, no momento da montagem da estrutura deste formulário, você pode sobrepor os controles. Ainda assim, note que na tabela anterior de controles, tanto o btnIncluir quanto o txtNovoServico estão com a propriedade Visible igual a False. O passo agora é montar a matriz com todos os serviços a serem oferecidos ao cliente. Pressione F7 para exibir a janela de códi-
12.
13.
Agora pressione F5 para executar o formulário e testá-lo. Após o login é exibida uma mensagem ao usuário informando que o acesso está autorizado. Em seguida é montada a ListBox com os fabricantes e ao selecionar um item é montada a outra ListBox com todos os modelos do respectivo fabricante selecionado (ver 14). Para calcular o financiamento de um veículo, clique na guia Financiamento, informe os devidos valores e clique no botão Calcular para efetivar a fórmula de cálculo (ver 15).
Imagens O Pocket PC contém um controle PictureBox para exibir uma determinada imagem. No entanto, é possível montar um container de imagens armazenadas em um controle para permitir uma navegação neste container. Como o formulário frmVendas contém o TabControl, selecione-o, exiba as propriedades (F4) e na propriedade TabPages, adicione uma nova chamada Fotos (ver 16). Insira os controles apresentados na 3. A partir da Toolbox, arraste o controle ImageList para o formulário. Exiba as propriedades e em Images clique em Add para cada imagem que você quiser inserir (ver 17). Neste exemplo, temos várias fotos de veículos da concessionária. Assim, os clientes poderão ver mais detalhes dos carros diretamente no Pocket. Caso queira remover uma ima-
14.
WebMobile 29
wm01.indb 29
7/1/2005 19:56:44
1 PictureBox
4.
Name: picFotos Size: 216, 200
private void txtValor_GotFocus(object sender, System.EventArgs e)
SizeMode: StretchImage 2 Button
{ inputPanel1.Enabled = true; }
Name: btnProximo
Text: >>
Name: btnAnterior
Text: <<
3.
private void txtEntrada_GotFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = true; }
private void txtJuros_GotFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = true; }
private void txtValor_LostFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = false; }
private void txtEntrada_LostFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = false; }
private void txtJuros_LostFocus(object sender, System.EventArgs e) { inputPanel1.Enabled = false; }
5. private void btnAcessar_Click(object sender, System.EventArgs e) { if (txtSenha.Text.Trim() != string.Empty & txtNome.Text.Trim() != string.Empty) { System.Text.StringBuilder msg = new System.Text.StringBuilder(); msg.Append(“Caro “); msg.Append(txtNome.Text.Trim()); msg.Append(“ seu acesso está autorizado!!!”); MessageBox.Show(msg.ToString(),”Pocket PC”); frmVendas frm = new frmVendas(); frm.ShowDialog(); } else { MessageBox.Show(“Digite todas as informações”,”Pocket PC”); txtNome.Focus(); } }
15.
16.
gos, localize o a sessão InicializeComponent() e digite o código da 7. Note que a relação de serviços pode ser digitada em qualquer ordem. No final, o método Sort se encarrega de classificar todos os itens em ordem crescente. O DataSource informa qual será a origem do objeto lstServOferecidos. Como é uma lista fixa, então é preciso defini-la anteriormente, mas uma outra possibilidade que veremos futuramente no treinamento é que estes dados podem vir diretamente de um banco de dados do servidor da empresa ou direto do SQL Server CE ou de um arquivo XML. Ao final, a propriedade SelectedIndex = 0 faz com que nenhum item seja selecionado, ou seja, o cliente terá efetivamente que selecionar um determinado item para contratá-lo. Neste caso, o botão Contratar irá verificar se algum item está selecionado, e caso verdadeiro, transfere o item para a lista de serviços contratados (lstServContratados). Dê um duplo clique no botão e digite o código da 8. A 20 apresenta o funcionamento do que acabamos de implementar na aplicação. O botão Excluir permite excluir da lista de contratados um determinado item. Para implementar esta funcionalidade, dê um duplo clique no botão e digite o código da 9. O botão Limpar Seleção deverá limpar todos os itens selecionados na lista de contratados. Note que antes de efetivar a exclusão, é questionado ao usuário se ele deseja realmente excluir todos os itens (ver 21). Veja o código deste botão na 10. Em casos onde o cliente queira um serviço que não esteja na lista, este terá que ser informado no TextBox e adicionado à lista. Para prover esta funcionalidade,
30 1º Edição
wm01.indb 30
7/1/2005 19:56:47
Pocket PC
servicos.Add(“Polimento com cera”);
6.
servicos.Add(“Calibragem dos pneus”); servicos.Add(“Alinhamento dos pneus”);
private int indice = -1;
servicos.Add(“Balanceamento de rodas”); private void btnProximo_Click(object sender, System.EventArgs e)
servicos.Add(“Troca de óleo”);
{
// classifica a lista if (indice >= imageList1.Images.Count - 1)
servicos.Sort();
{
// atribui como fonte de dados lstServOferecidos.DataSource = servicos;
indice = 0;
// desmarca todos os itens
}
lstServOferecidos.SelectedIndex = 0;
else }
{ indice +=1; }
8.
MostraImagem(indice); }
private void btnContratar_Click(object sender, System.EventArgs e) {
private void MostraImagem(int indice)
// verifica se algum item está selecionado
{
if (lstServOferecidos.SelectedIndex >= 0) picFotos.Image = imageList1.Images[indice];
{
Text = “Imagem “ + (indice + 1).ToString() + “ de “ +
// adiciona o item a lista
imageList1.Images.Count.ToString();
lstServContratados.Items.
}
Add(lstServOferecidos.SelectedItem); }
private void btnAnterior_Click(object sender, System.EventArgs e)
}
{ indice -=1;
9.
if (indice < 0) { indice = imageList1.Images.Count -1;
private void btnExcluir_Click(object sender, System.EventArgs e) {
}
// verifica se algum item está selecionado
MostraImagem(indice);
if (lstServContratados.SelectedIndex >= 0)
}
{ // remove o item selecionado da lista
7.
lstServContratados.Items.RemoveAt( lstServContratados.SelectedIndex);
public frmOficina() {
} }
// // Required for Windows Form Designer support
10.
// InitializeComponent();
private void btnLimpar_Click(object sender, System.EventArgs e) {
//
// pergunta se tem certeza da exclusão
// TODO: Add any constructor code after
if (MessageBox.Show(“Exclui todos os serviços
InitializeComponent call
contratados?”, “Pocket PC”) == DialogResult.OK)
//
{
// define o array de serviços oferecidos
// limpa toda a lista
ArrayList servicos = new ArrayList();
lstServContratados.Items.Clear();
servicos.Add(“Serviço de entrega”); servicos.Add(“Lavação completa”); servicos.Add(“Brilho total da pintura”);
} }
WebMobile 31
wm01.indb 31
7/1/2005 19:56:50
2 Label
Text: Oferecidos
2 ListBox
Name: lstServOferecidos
5 Button
Name: btnContratar
Text: Contratar
Name: btnExcluir
Text: Excluir
Name: btnIncluir
Text: Incluir Novo Serviço
1 TextBox
Contratados
Name: btnLimpar
Text: Limpar Seleção
Name: btnNovo
Text: Novo Serviço
Name: txtNovoServico
private void menuItem3_Click(object sender, System.EventArgs e)
lstServContratados
{ frmOficina frm = new frmOficina(); frm.ShowDialog();
Visible: False }
Faça o mesmo para a opção Vendas:
Visible: False
1 MainMenu
private void menuItem2_Click(object sender, System.EventArgs e)
1 InputPanel
{
4.
frmVendas frm = new frmVendas(); frm.ShowDialog(); }
Para a opção Sair, digite o código para fechar o formulário: private void menuItem4_Click(object sender, System.EventArgs e) { Close(); }
17.
digite o código para o botão Novo Serviço o qual irá ocultar a lstServContratados, exibir o txtNovoServico, o InputPanel e o btnIncluir e colocar o foco no txtNovoServico (ver 11). Com este mecanismo conseguimos montar uma UI mais inteligente. Uma vez que o usuário tenha digitado o novo serviço, é preciso inserir o mesmo à lista. Digite o código do botão Incluir Novo Serviço para esta finalidade (ver 12). Note que é verificado se algo foi digitado no txtNovoServico. O método Text captura o texto digitado e o Trim retira os possíveis espaços em branco tanto à direita quanto à esquerda da expressão. Em seguida, se houver um texto digitado, o item é adicionado à lstServContratados. No final, os controles que foram ocultados são exibidos e vice-versa, para assim retornar a UI original. A 22 apresenta o funcionamento do que acabamos de implementar na aplicação. Pronto, este formulário de oficina está finalizado para ser executado. No entanto, antes de executá-lo é preciso realizar alguns ajustes no frmLogin.
Pelo funcionamento do frmLogin, o usuário só deve ter acesso aos menus de Vendas e Oficina caso esteja logado, portanto, configure a propriedade Enabled = False para os itens do menu (menuItem2 – Vendas e menuItem3 – Oficina). Altere o código do botão Acessar incluindo as linhas em negrito da 13 para habilitar os respectivos itens de menu para o usuário logado. Desta forma, você consegue controlar cada uma das opções de um MainMenu. Salve e execute o projeto. Note na 24 que as opções do menu ficam desativadas enquanto não houver um login válido.
Instalação O processo de instalação de uma aplicação no Pocket chama-se Deploy. Após todos os códigos testados e aprovados, você deverá distribuir a aplicação para ser executada em qualquer tipo de Pocket PC que contenha o sistema operacional Pocket PC 2003 ou Windows Mobile. No entanto, você tem várias opções, sendo: 1) Fazer o deploy direto no Pocket via ActiveSync; 2) Disponibilizar no servidor da empresa o arquivo de instala-
Menu Como já dispomos de três formulários neste projeto, frmLogin, frmVendas e frmOficina, vamos montar um menu para acessar as devidas opções. Abra o frmLogin, clique no controle MainMenu e crie um menu com as opções apresentadas na 23. Na opção Oficina, dê um duplo clique e digite o código para abrir o formulário frmOficina:
18.
32 1º Edição
wm01.indb 32
7/1/2005 19:57:34
Pocket PC
JBuilder 2005 A Evolução no Desenvolvimento JAVA O JBuilder representa um conceito revolucionário em ferramentas de desenvolvimento, onde se integram tecnologias de produtividade corporativa e individual, resultando em uma produção acelerada e de máxima qualidade. Um ambiente completo, com suporte consistente para todas as plataformas Java™ - seja Standard, Enterprise ou Micro Edition.
www.borland.com.br WebMobile 33
wm01.indb 33
7/1/2005 19:58:13
11.
MessageBox.Show(“Digite todas as informações”,”Pocket PC”);
private void btnNovo_Click(object sender, System.EventArgs e)
txtNome.Focus();
{ }
// inclui um serviço especial lstServContratados.Visible = false; txtNovoServico.Visible = true; inputPanel1.Enabled = true;
}
14.
btnIncluir.Visible = true;
------ Build started: Project: tutorialPocket, Configuration:
txtNovoServico.Focus();
Debug Pocket PC ------
} Preparing resources...
12.
Updating references...
private void btnIncluir_Click(object sender, System.EventArgs e)
Performing main compilation...
{ // verifica se algo foi digitado
Build complete -- 0 errors, 0 warnings
if (txtNovoServico.Text.Trim().Length > 0 )
Building satellite assemblies...
{
Visual Studio is ready to deploy tutorialPocket // adiciona o novo serviço a lista lstServContratados.Items.Add( txtNovoServico.Text.Trim());
------ Deploy started: Project: tutorialPocket, Configuration: Debug Pocket PC ------
}
Deploying to WWE PPC 2003 SE - SDK Emulator using Emulation
// apaga o conteúdo do textBox
Transport
txtNovoServico.Text = string.Empty;
Connected to WWE PPC 2003 SE - SDK Emulator (Pocket PC) running
txtNovoServico.Visible = false;
on WCE420X86.
inputPanel1.Enabled = false;
Copying files from ‘C:\Projetos\WebMobile\tutorialPocket\bin\
lstServContratados.Visible = true;
Debug’ to ‘\Program Files\tutorialPocket’
btnIncluir.Visible = false;
Copying tutorialPocket.exe Files in the package ‘netcf.all.wce4.x86.cab’ are more recent on
}
the device than on the development computer. Consider upgrading
13.
to the latest version. Files affected are: Microsoft.windowsce.forms.dll
private void btnAcessar_Click(object sender, System.EventArgs e) { if (txtSenha.Text.Trim() != string.Empty & txtNome.Text.Trim() != string.Empty) { System.Text.StringBuilder msg = new System.Text.StringBuilder(); msg.Append(“Caro “); msg.Append(txtNome.Text.Trim()); msg.Append(“ seu acesso está autorizado!!!”); MessageBox.Show(msg.ToString(),”Pocket PC”); menuItem2.Enabled = true; menuItem3.Enabled = true; } else {
Microsoft.visualbasic.dll System.data.dll System.net.irda.dll System.xml.dll System.windows.forms.datagrid.dll System.windows.forms.dll System.web.services.dll System.drawing.dll System.dll Mscorlib.dll Netcfagl1_0.dll Cgacutil.exe Mscoree1_0.dll Mscoree.dll
---------------------- Done ---------------------Build: 1 succeeded, 0 failed, 0 skipped Deploy: 1 succeeded, 0 failed, 0 skipped
34 1º Edição
wm01.indb 34
7/1/2005 19:58:20
Pocket PC
ção, onde o usuário faz o download e instala. Neste caso, é preciso que o usuário tenha o .NET Compact Framework; 3) Através do Internet Explorer do Pocket, o usuário acessa o executável no servidor da empresa e instala; 4) Copia para o Pocket via ActiveSync e instala. Cada processo tem suas particularidades, sendo que o único passo em comum é ge19. rar o Release. Para isso, com o projeto aberto, selecione a opção Release na barra de ferramentas Standard (ver 25). O Release não permite o uso do Debug futuramente e o produto final ficará mais enxuto para ser executado. Estando com o Pocket na base (cradle) e o ActiveSync rodando, selecione o menu Build / Deploy Solution. Na janela aberta selecione Pocket PC Device e clique em Deploy. Você não precisa se preocupar se o .NET Compact Framework está ou não instalado no Pocket porque o processo de instalação se encarrega disto. Você irá ver a instalação primeiro do .NET CF e depois a da sua aplicação. É importante notar que o local de instalação pode ser alterado conforme a sua necessidade. Veja nas propriedades do projeto que existe a opção Output File Folder que normalmente é \Program Files\Aplicação (neste caso \Program Files\tutorialPocket) ( 26). Para acessar estas propriedades, abra o Solution Explorer, clique com o botão direito sobre a Solution e selecione Properties. Veja na 14 o que acontece na janela de Output quando ocorre o Deploy. Note que são transferidos todos os arquivos e Dlls necessárias para rodar o aplicativo. Cabe ressaltar que o arquivo transferido .CAB que contém o
20.
.NET CF depende do tipo de processador encontrado no Device. Neste caso é o Xscale o qual transfere o arquivo ‘netcf.all. wce4.x86.cab’. Para abrir a aplicação no Pocket, selecione o menu Windows / Programs / File Explorer / My Device / Program Files / tutorialPocket (ver 27). Quando você fechar a aplicação clicando no botão X no canto superior direito, se a propriedade minimizeBox do formulário tivesse como True, o formulário não seria fechado, apenas minimizado. Qualquer outra tentativa de deploy ocasionaria um erro no VS.NET. Nestes casos é preciso retirar o aplicativo da memória através do menu Windows / Settings / System / Memory / Runnig Programs / Aplicativo / Stop. A outra forma de você instalar uma aplicação no Pocket é primeiro transferir e instalar o .NET CF e, em seguida, copiar a sua aplicação. Na estrutura de pastas do desktop, o .NET CF fica no endereço C:\Program Files\Microsoft Visual Studio .NET 2003\ CompactFrameworkSDK\v1.0.5000\Windows CE\. Dependendo do processador do seu Pocket PC, você instala ou o wce400\armv4\ netcf.all.wce4.armv4 ou o wce400\x86\netcf.all.wce4.x86. Cada arquivo está “vinculado” ao tipo de processador do fabricante do device. A outra forma utilizada de instalação é através do menu Build / Build Cab File, o qual gera na pasta do projeto todos os arquivos necessários para instalação da aplicação em qualquer tipo de processador. Obviamente, você deixa disponível o respectivo arquivo relacionado ao processador do dispositivo o qual a aplicação irá rodar. Via de regra, se o processador for Xscale o arquivo é o SuaApp.x86, se for ARM o arquivo é SuaApp.armv4. Todos os arquivos com extensão .CAB são os arquivos que deverão ser enviados ao usuário para instalar a aplicação no Pocket. Se você estiver com o Pocket na base, copie este arquivo para o Pocket e execute-o. Au-
21.
WebMobile 35
wm01.indb 35
7/1/2005 19:58:22
tomaticamente, a sua aplicação será instalada no Pocket e ficará disponível para rodar.
Conclusão
22.
Neste primeiro tutorial você foi introduzido ao mundo móvel através de uma aplicação simples e funcional, utilizando diversos recursos do dia a dia de um desenvolvedor. Foquei nos controles, códigos, métodos e propriedades para o propósito deste projeto exemplo. No próximo tutorial iremos montar um cenário com banco de dados SQL Server, onde o acesso será através de uma rede Wi-Fi (Wireless Fidelity – sem fio). Bons estudos e lembre-se: No Stress, think .NET!!!
Referências: www.microsoft.com/windowsmobile
23.
26.
24.
27.
Renato Haddad (rehaddad@msn.com) é Microsoft Most Valuable Professional .NET Mobile Devices, editor da revista MSDN Magazine Brasil, ministra treinamentos e palestras sobre .NETe autor de diversos livros e treinamentos em CD multimídia de ASP.NET, Visual Studio .NET 2003 e Aplicações Móveis para celulares e Pocket PC, tanto no Brasil como em outros países da América Latina.
Faça o download no site: www.portalwebmobile.com.br/revista/ed1 25.
36 1º Edição
wm01.indb 36
7/1/2005 19:58:26
A
Tutorial
ASP NET por Eduardo Bottcher
tecnologia ASP.NET, lançada pela Microsoft em 2002, pode ser considerada um marco histórico na área de desenvolvimento de aplicativos voltados para a web, pelo fato de ter sido uma linguagem idealizada, projetada e preparada para um mundo onde a Internet é parte fundamental do cotidiano das pessoas e das empresas. Além de trazer novos recursos que fazem de uma página web uma interface quase tão rica quanto um formulário convencional, a linguagem ASP.NET e seus conceitos são bastante simples de aprender. Por estes motivos é que em tão pouco tempo essa tecnologia ganhou um significativo espaço no mercado, e cada dia vem crescendo o número de empresas que passam a utilizá-la. Neste tutorial, vamos aprender como desenvolver um aplicativo em ASP.NET usando seu novo modelo de programação e veremos como utilizar seus novos recursos.
Configurando o ambiente Uma página ASP.NET é muito mais que uma simples página ou site estático, pois permite uma dinamicidade das informações contidas nessas páginas. Uma página desenvolvida em ASP.NET é um aplicativo .NET para ambientes web, ou seja, um programa que trabalha na arquitetura cliente-servidor utilizando a internet ou intranet como meio de comunicação dos dados e com interface baseada em HTML para trafegar os dados via protocolo HTTP. Para tornar possível este cenário, é necessário que esteja instalado um programa servidor de aplicações web na máquina que funcionará como servidor. Existem diversos servidores de aplicações disponíveis. Neste tutorial utilizaremos o IIS
37 1º Edição
wm01.indb 37
7/1/2005 19:58:28
Tutorial
(Internet Information Services). Sua instalação é simples e quaisquer configurações adicionais para rodar o ASP.NET serão gerenciadas pelo software de desenvolvimento que iremos usar. Também será necessário instalar o .NET Framework, que pode ser encontrado em (www.microsoft.com/downloads/details.aspx? FamilyID=262D25E3-F589-4842-8157-034D1E7CF3A3&displaylang =en). Este componente é o responsável pela execução e processamento das páginas ASP.NET. Como esse processamento é realizado no servidor, não é necessário instalar o .NET Framework nas máquinas clientes que vão acessar essas páginas. Para ambientes de desenvolvimento, a mesma máquina que será o servidor também funcionará como cliente, utilizando os endereços http://localhost ou http://127.0.0.1 para fazer referência à máquina local. Neste tutorial usaremos o Visual Studio.NET 2003 para desenvolver nossas aplicações. Embora você possa escrever suas páginas em outros programas como o Web Matrix (software gratuito disponível em www.asp.net/webmatrix) ou até mesmo no bloco de notas utilizando o .NET Framework SDK (www.microsoft. com/downloads/details.aspx?familyid=9B3A2CA6-3647-40709F41-A333C6B9181D&displaylang=en), o Visual Studio .NET é o mais recomendado, pois apresenta vários recursos que facilitam o dia a dia do desenvolvedor, proporcionando ganho de performance e diminuindo o tempo de desenvolvimento (veremos mais a frente alguns desses recursos).
os arquivo em pastas e ver quais as referencias externas que são feitas pelo projeto. Menu Bar ( 2B): localizada no topo da tela, contém ícones de atalho como copiar, recortar, colar, salvar, abrir, executar entre outros. ToolBox ( 2C): É a barra de ferramentas onde estão os objetos e elementos que eu posso adicionar na minha página. Ex: TextBox, Label, etc. Área de Trabalho ( 2D): Ë a região onde o código da página é visualizado e editado. É possível alterar a visualização para design ou ver o código HTML clicando os respectivos botões localizados na parte inferior dessa janela. Properties window ( 2E): É a janela na qual alteramos as propriedades como fonte, texto, vinculo de dados e o posicionamento dos objetos que estão na página.
Minha primeira página ASP.NET Para escrever nossa primeira página ASP.NET, abra o Visual Studio.NET e clique no Menu File New Project (ou a tecla de atalho Crtl+Shift+N). A 1 mostra a tela com as opções de Projeto. 1. Escolha a linguagem e o tipo de projeto. Nesta tela devemos escolher primeiramente qual linguagem iremos desenvolver nossa página. Neste Tutorial usaremos o VB.NET, mas nada impede que você escolha o C# ou outra linguagem compatível com o .NET Framework. Após escolher a linguagem na lista a esquerda da tela, selecione ao lado a opção ASP. NET Web Application, conforme apresentado na 1. Logo abaixo, no campo location, onde estiver escrito webapplication1, renomeie para TutorialASPNET, que será o nome do nosso projeto. Logo depois clique em OK. A 2 mostra a tela principal do Visual Studio.NET para o desenvolvimento de páginas ASP.NET. Antes de prosseguir vamos conhecer as D principais janelas do Visual Studio.NET: C Solution Explorer ( 2A): É onde visualizamos os arquivos que fazem par2. Tela Principal do Visual Studio.NET te do projeto, onde podemos organizar
B
A
E
WebMobile 38
wm01.indb 38
7/1/2005 19:58:31
Web Forms
Tipo de Controle
ID
Cada página ASP.NET também é chamada de Label lblLogin Web Form (formulário web), pois seu conceito Label lblSenha é muito parecido com um formulário de aplicaLabel lblMensagem ções desktop convencional, quer dizer, uma tela TextBox Txtlogin composta por diversos tipos de controles como TextBox Txtsenha caixas de texto, labels e botões, entre outros que Button Btnlogar servem de interação entre o usuário e o sistema. 1. Objetos da tela de Login No Visual Studio.NET, para adicionar um controle basta arrastá-lo da Toolbox para dentro do formulário web. Para o nosso primeiro exemplo, iremos fazer uma tela de login de um sistema, contendo campos para informar o login do usuário, a senha e um botão para efetuar o acesso. O primeiro passo é criar um novo Web Form. Para isso clique em File Add New Item. Na janela que irá aparecer, selecione o item Web Form, nomeie-o para MinhaPagina.aspx e clique em OK (ver 1).
Text
Visible
Login
True
Senha
ForeColor
True False
Red
True True Entrar
True
1 Quando criamos um novo projeto, já é criada por padrão uma página Web chamada WebForm1.aspx, que pode ser acessado pelo solution explorer. Está página está sendo criada apenas para demonstrar todo o processo.
A 1 contém a listagem dos objetos utilizados nesta tela e as propriedades que devem ser alteradas nesses objetos. A 3 apresenta o resultado da construção da nossa tela exemplo de login (ver 2).
2 Para que apareçam “*” na caixa de senha conforme o usuário vai digitando o valor de sua senha correta, coloque o valor “Password” na propriedade textmode do objeto Txtsenha.
Vamos analisar agora o HTML resultante desta tela. A 1 apresenta o código HTML da página gerada. Você pode visualizar este código clicando no botão HTML no canto inferior esquerdo da área de trabalho do Visual Studio.NET ( 2D). Basicamente, o código HTML de uma página ASP.NET é composto por tags HTML padrão e algumas tags que iniciam com “<asp: ”. Estas tags são chamadas de Web Controls, que são controles pertencentes ao .NET Framework e que tem seu comportamento gerenciado no servidor. Essas tags foram sendo adicionadas ao código conforme arrastávamos os objetos para a página. Por exemplo, a tag descrita abaixo representa o web control TextBox. <asp:TextBox id=”TextBox2” style=”Z-INDEX: 104; LEFT: 256px;
3. a tela de acesso a um sistema do nosso exemplo no navegador uma tag “<asp:textbox>” e sim sua correspondente, neste caso “<input type=text>”. Além de ter as propriedades comuns às suas tags HTML correspondentes, os web controls possuem outras propriedades que os tornam mais práticos e eficientes. Veja o exemplo abaixo. <asp:Label id=”lblmensagem” style=”Z-INDEX: 106; LEFT: 264px; POSITION: absolute; TOP: 296px” runat=”server” Visible=”False”> </asp:Label>
Um <asp:label> é um web control que exibe um texto na página. Quando acessado pelo cliente é representado pela tag <span>. Perceba que há uma propriedade Visible=”False” nesta tag que faz com que, quando a página seja carregada, esse texto não apareça. Este tipo de recurso, ou propriedade, não existe na tag <span>, e para ter esse efeito é necessário ao programador adicionar um estilo ou usar um JavaScript. No entanto, a página ASP.NET faz isso automaticamente. Ao carregar a página, o .NET Framework identifica essas propriedades e compatibiliza o código para criar um código HTML resultante que realiza o efeito desejado sem que haja esforço adicional por parte do desenvolvedor. Ainda no código desenvolvido para a tela de login, temos a seguinte tag que representa o web control do botão que irá validar o login e a senha do usuário.
POSITION: absolute; TOP: 192px” runat=”server”> </asp:TextBox> <asp:Button id=”Button1” style=”Z-INDEX: 105; LEFT: 256px;
Quando a página é exibida em um browser, cada web control é representado por uma tag HTML padrão, ou seja, não veremos
POSITION: absolute; TOP: 240px” runat=”server” Text=”Entrar” Width=”120px”></asp:Button>
39 1º Edição
wm01.indb 39
7/1/2005 19:58:33
Tutorial
Fazendo o Postback da página Quando criamos um formulário, é necessário indicar através da propriedade action da tag <form> o destino para o qual os dados serão remetidos. Existem dois destinos para onde esses dados podem ser encaminhados: para um e-mail usando o comando mailto: emaildesejado e, para uma outra página que contenha scripts que possam receber e processar os dados. Para evitar que se tenham dois arquivos, um com o formulário e outro que processe os dados, segmentando desnecessariamente o código (é claro que em alguns casos isso se faz necessário), colocamos o form e o código na mesma página, fazendo com que ao submeter o formulário a página envie os dados para ela mesma, e dê continuidade ao processamento da aplicação. Esta operação de enviar os dados de uma página para si mesma é chamada de Postback da página e é um recurso muito utilizado nos web forms. Enquanto em outras linguagens, quando fazemos Postback, precisamos de um código adicional para recuperar e repovoar os campos do formulário (os dados preenchidos são enviados, mas os valores nos campos do
formulário não são mantidos), um web form já faz isso automaticamente, visto que seus web controls são gerenciados no servidor, mantendo os dados da página sem que haja nenhum código adicional. Para que o Postback funcione é necessário que a página tenha a seguinte tag. <form id=”Form1” method=”post” runat=”server”></form>
Além disso, todos os controles que necessitem ter seus valores recuperados devem estar entre essas tags e devem ter sua a propriedade runat=”server”. Ë importante ressaltar que só é permitido apenas uma tag <form> com a propriedade runat=”server” por página.
3 Além de web controls, uma página ASP.NET também pode ter os chamados HTML Controls, controles HTML padrão, e os Web user controls, controles personalizados.
1. Código HTML da página de Login <%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”MinhaPagina.aspx.vb” Inherits=”TutorialASPNET.MinhaPagina”%> <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”> <HTML> <HEAD> <title>Tela de Login</title> <meta name=”GENERATOR” content=”Microsoft Visual Studio .NET 7.1”> <meta name=”CODE_LANGUAGE” content=”Visual Basic .NET 7.1”> <meta name=”vs_defaultClientScript” content=”JavaScript”> <meta name=”vs_targetSchema” content=”http://schemas.microsoft.com/intellisense/ie5”> </HEAD> <body MS_POSITIONING=”GridLayout”> <form id=”Form1” method=”post” runat=”server”> <asp:Label id=”Lbllogin” style=”Z-INDEX: 101; LEFT: 176px; POSITION: absolute; TOP: 152px” runat=”server” ForeColor=”Black”>Login </asp:Label> <asp:Label id=”lblsenha” style=”Z-INDEX: 102; LEFT: 176px; POSITION: absolute; TOP: 192px” runat=”server”>Senha </asp:Label> <asp:TextBox id=”Txtlogin” style=”Z-INDEX: 103; LEFT: 256px; POSITION: absolute; TOP: 152px” runat=”server”> </asp:TextBox> <asp:TextBox id=”Txtsenha” style=”Z-INDEX: 104; LEFT: 256px; POSITION: absolute; TOP: 192px” runat=”server”></asp:TextBox> <asp:Button id=”Btnlogar” style=”Z-INDEX: 105; LEFT: 256px; POSITION: absolute; TOP: 240px” runat=”server” Text=”Entrar” Width=”120px”> </asp:Button> <asp:Label id=”lblmensagem” style=”Z-INDEX: 106; LEFT: 264px; POSITION: absolute; TOP: 296px” runat=”server” Visible=”False”></asp:Label> </form> </body> </HTML>
WebMobile 40
wm01.indb 40
7/1/2005 19:58:34
CodeBehind
Programando a página
Cada Página ASP.NET é composta por um arquivo .aspx que contém o HTML da página e lida com a parte visual, e um arquivo .aspx.vb que contém toda a parte de programação. Esta separação de funcionalidade por arquivos é chamada de CodeBehind, ou código por trás de uma página. As páginas aspx de um site são passadas ao browser enquanto que os arquivos .vb são compilados em uma dll e controlam a execução da página. Para vincular qual arquivo .vb controla qual arquivo aspx, precisamos adicionar ao aspx uma diretiva. A linha abaixo mostra esse comando:
Uma vez que já vimos os principais conceitos que envolvem uma página ASP.NET, vamos continuar a implementação do nosso exemplo da tela de login. Vamos agora programar o evento do clique do botão para verificar se o login e a senha são válidos ou não. Para isso, na tela de design da página dê um duplo clique no botão e digite o código descrito na 3. Temos na 3 a rotina de clique do botão btnlogar. Iniciamos a programação com um bloco de tratamento de exceção try...catch. Ele funciona da seguinte maneira: caso aconteça algum erro durante a execução do código que está dentro do bloco try, o programa captura esse erro e faz seu tratamento na segunda parte da estrutura, na parte catch do bloco. Neste caso, estamos exibindo a mensagem de erro no objeto label lblmensagem e tornando-a visível, já que sua propriedade visible foi inicialmente definida como false. O código é simples. Fazemos um teste para verificar se o valor da caixa de texto txtlogin é “tutorial” e o valor da caixa de texto txtsenha é “123456”. Se for, criamos uma sessão chamada login com o valor de txtlogin e em seguida redirecionamos o usuário para outra página. Caso contrário, escrevemos a frase “Login inválido” na label lblmensagem e a deixamos como visível. Perceba que para fazer esta validação, a página deverá ir ao servidor, ou melhor, fazer um Postback. Portanto, nenhuma operação acima é realizada no cliente. É importante ressaltar também que se por acaso o login estiver errado, a página exibirá uma mensagem e veremos que o campo login continuará preenchido (o campo senha não, pois se trata de um campo do tipo password) devido à manutenção do seu estado que é feita no servidor.
<%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”MinhaPagina.aspx.vb” Inherits=”TutorialASPNET. MinhaPagina”%>
Esta linha é obrigatória em todos os arquivos aspx, pois nos fornece informações importantes sobre a página. Na diretiva Codebehind=”MinhaPagina.aspx.vb” estamos informando qual arquivo controlará esta página (no Visual Studio.NET esses dados já são preenchidos automaticamente). Outra vantagem do uso do CodeBehind é que profissionais de áreas diferentes podem trabalhar independentemente na mesma página sem que um interfira no trabalho do outro. Em outras palavras, o designer pode ficar codificando o HTML da página no arquivo aspx enquanto o programador se encarrega da programação no arquivo .vb. Como toda a plataforma .NET, uma aplicação ASP.NET é baseada nos conceitos de orientação a objetos. Cada web form é considerado uma classe, que é descrita no arquivo aspx.vb. Para indicar a classe que representa e descreve uma página aspx usamos a diretiva inherits. Assim um arquivo aspx passa a ser uma representação visual de uma classe bem definida, possibilitando ao sistema as operações clássicas de OO como herança, encapsulamento, sobrecarga, etc. A 2 mostra o código em vb criado pelo Visual Studio.NET para nossa tela de login (ver 4). No código da 2 temos a descrição da Classe MinhaPagina que herda da classe System.Web.UI.Page, a classe do .NET Framework que representa uma página web, além da declaração de seus métodos e atributos. Os atributos são os web controls daquela página. Temos ainda os métodos page_init e page_load, que são executados toda vez que a página é carregada ou faz Postback.
4 Quando o Visual Studio.NET cria o código da classe de uma página, ele automaticamente comenta algumas regiões do código com rápidas descrições sobre sua funcionalidade para situar melhor o programador.
Acessando um banco de dados A plataforma .NET trouxe uma série de inovações no que diz respeito ao acesso a banco de dados através da tecnologia ADO. NET ( 5). Veremos agora como fazer uma página ASP.NET acessar uma base de dados usando o ADO.NET, além de conhecer alguns componentes visuais específicos para manipulação de dados. Para isso vamos fazer o exemplo de uma página contendo um grid exibindo alguns dados da tabela de produtos. Usaremos como banco de dados o bom e velho Northwind em sua versão para Access que pode ser baixado em http://office.microsoft.com/downloads/2000/Nwind2K.aspx.
5. Tecnologia ADO.NET A tecnologia ADO.NET é sucessora da ADO, usada em quase todas as plataformas de desenvolvimento da Microsoft, como Visual Basic e ASP. A biblioteca de objetos do ADO.NET é parte integrante do .NET Framework e é responsável por prover acesso consistente a bases de dados, seja ela um SQL Server ou qualquer fonte de dados que possa ser acessada via padrões OLE DB ou ODBC. Além de possibilitar a manipulação dos dados, o ADO.NET conta com suporte integrado ao XML, acesso desconectado a bases de dados entre outros recursos.
41 1º Edição
wm01.indb 41
7/1/2005 19:58:35
Tutorial
2. Codebehind gerado pelo VS.NET para a nossa página aspx Public Class MinhaPagina Inherits System.Web.UI.Page #Region “ Web Form Designer Generated Code “
‘This call is required by the Web Form Designer. <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub Protected WithEvents Lbllogin As System.Web.UI.WebControls.Label Protected WithEvents Lblsenha As System.Web.UI.WebControls.Label Protected WithEvents Txtlogin As System.Web.UI.WebControls.TextBox Protected WithEvents Txtsenha As System.Web.UI.WebControls.TextBox Protected WithEvents Btnlogar As System.Web.UI.WebControls.Button Protected WithEvents lblmensagem As System.Web.UI.WebControls.Label
‘NOTE: The following placeholder declaration is required by the Web Form Designer. ‘Do not delete or move it. Private designerPlaceholderDeclaration As System.Object
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ‘CODEGEN: This method call is required by the Web Form Designer ‘Do not modify it using the code editor. InitializeComponent() End Sub #End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ‘Put user code to initialize the page here End Sub
End Class
3. Validando o login Private Sub btnlogar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnlogar.Click Try If txtlogin.Text = “tutorial” And txtsenha.Text = “123456” Then ‘verifica se os valores digitados estão corretos Session(“login”) = txtlogin.Text
‘Cria uma sessão chamada login
Response.Redirect(“PaginaDB.aspx”)
‘Redireciona para outra página
Else lblmensagem.Visible = True lblmensagem.Text = “Login inválido” End If Catch ex As Exception lblmensagem.Visible = True lblmensagem.Text = ex.Message.ToString End Try
End Sub
WebMobile 42
wm01.indb 42
7/1/2005 19:58:36
Seguindo os passos descritos anteriormente neste tutorial, crie uma nova página chamada PaginaDB.aspx. Adicione um objeto DataGrid que está na aba Web Forms da barra de ferramentas ToolBox e nomeie-o para “DGProdutos”. A 4 mostra como deve ficar a sua página. É necessário agora configurar nosso datagrid para exibir os dados corretamente. O Visual Studio.NET possui um assistente para alterar as propriedades do datagrid. Para acessá-lo, clique com o botão direito no grid e selecione Property Builder. A 5 apresenta a tela para configuração das propriedades de um datagrid. Na aba Columns, adicione as colunas de acordo com o que está descrito na 2. Desmarque a opção acima “create columns automatically at run time” para que possamos configurar manualmente as colunas. Para aplicar um layout no visual do grid, clique com o botão direto em cima dele, selecione auto format e escolha uma das opções disponíveis. Uma vez configurado o datagrid, vamos descrever o código para acessar o banco e exibir os dados no data5. Wizard para configuração do datagrid grid. A 4 mostra como fica o código HTML do aspx e na uma coleção de recordsets. Para valorar este dataset, adicionamos 5 temos o código do arquivo .vb. Todo o processo de acesso ao banco e exibição dos dados pelo a ele um novo datatable com os dados da query usando o método fill do objeto oledbdataadapter, informando também um nome ao controle ocorre no evento page_load da página (Linhas 17 a qual referenciaremos este datatable (Linha 27). Uma vez carrega31), ou seja, durante o carregamento da página. A primeira coisa realizada foi a criação de um objeto do tipo oledbconnection (Lido o dataset, precisamos fazer o bind dele no controle datagrid. nha 19) para se conectar ao banco, passando no seu construtor a Bind é a operação de ligar um controle a uma fonte de dados, ao invés de criar uma estrutura de looping que percorra o banco e string de conexão como parâmetro. Finalmente, na linha seguinte adicione os itens no controle um a um. Felizmente, quase todos (Linha 20) usamos o comando conn.open() para estabelecer a os web controls do ASP.NET suportam este recurso. Inicialmente conexão. Em seguida (Linhas 21, 22 e 23) criamos três novos definimos a fonte de dados atribuindo o nosso dataset à proprieobjetos: um oledbcommand, um oledbdataadapter e um dataset. dade datasource (Linha 28). Logo após informamos qual a tabela O command é o objeto que servirá de ponte entre o oledbadapter e o banco de dados. É nele também que definimos a string de condo conjunto de tabelas do dataset será exibida pelo grid, ou seja, o nome que definimos quando executamos o comando Fill, neste sulta através da propriedade CommandText, como vemos na Linha caso “Produtos” (Linha 29). Finalizamos executando o comando 24. Em seguida indicamos qual conexão o command irá usar (Lidatabind, para efetivamente realizar a operação de preencher o nha 25) e vinculamos o command ao adapter (Linha 26). grid com os dados do dataset (Linha 30). O dataset é o principal objeto do ADO.NET. Ele é uma coleCompile o projeto acessando o menu Build – Build Soloution, ção de objetos do tipo datatable e datarelations, permitindo a execute-o através do menu Debug – Start (ou F5) e já temos nossa representação em memória de um banco com suas tabelas e relapágina acessando uma base de dados. Vale ressaltar que a idéia cionamentos. Fazendo uma analogia com o ASP 3, um dataset é aqui não foi trazer todos os detalhes e recursos do ADO.NET, mas mostrar o necessário para fazer um acesso por página ASP.NET.
Conclusão O ASP.NET é um novo universo a ser estudado e admirado, tan-
4. Exibindo dados do banco de dados.
Tipo de Coluna
Header Text
Data Field
Bound Column
Produto
Productname
Bound Column
Preço Unitário
UnitPrice
Bound Column
Unidades em Estoque
UnitsInStock
2. Colunas do Datagrid
43 1º Edição
wm01.indb 43
7/1/2005 19:58:38
Tutorial
4. Código HTML da página contendo um objeto datagrid <%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”PaginaDB.aspx.vb” Inherits=”TutorialASPNET.PaginaDB”%> <!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.0 Transitional//EN”> <HTML> <HEAD> <title>index</title> <meta content=”Microsoft Visual Studio .NET 7.1” name=”GENERATOR”> <meta content=”Visual Basic .NET 7.1” name=”CODE_LANGUAGE”> <meta content=”JavaScript” name=”vs_defaultClientScript”> <meta content=”http://schemas.microsoft.com/intellisense/ie5” name=”vs_targetSchema”> </HEAD> <body MS_POSITIONING=”GridLayout”> <h2 align=”center”>Listagem de Produtos</h2> <form id=”Form1” method=”post” runat=”server”> <asp:datagrid id=”DGProdutos” style=”Z-INDEX: 101; LEFT: 184px; POSITION: absolute; TOP: 88px” runat=”server” Height=”240px” Width=”504px” HorizontalAlign=”Center” AutoGenerateColumns=”False” BorderColor=”#3366CC” BorderStyle=”None” BorderWidth=”1px” BackColor=”White” CellPadding=”4”> <SelectedItemStyle Font-Bold=”True” ForeColor=”#CCFF99” BackColor=”#009999”> </SelectedItemStyle> <ItemStyle ForeColor=”#003399” BackColor=”White”></ItemStyle> <HeaderStyle Font-Bold=”True” ForeColor=”#CCCCFF” BackColor=”#003399”></HeaderStyle> <FooterStyle ForeColor=”#003399” BackColor=”#99CCCC”></FooterStyle> <Columns> <asp:BoundColumn DataField=”Productname” HeaderText=”Produto”></asp:BoundColumn> <asp:BoundColumn DataField=”UnitPrice” HeaderText=”Pre&#231;o Unit&#225;rio”> </asp:BoundColumn> <asp:BoundColumn DataField=”UnitsInStock” HeaderText=”Unidades em Estoque”> </asp:BoundColumn> </Columns> <PagerStyle HorizontalAlign=”Left” ForeColor=”#003399” BackColor=”#99CCCC” Mode=”NumericPages”></PagerStyle> </asp:datagrid></form> </body> </HTML>
WebMobile 44
wm01.indb 44
7/1/2005 19:58:39
5. Código para acessar o banco de dados 1: Public Class PaginaDB 2: Inherits System.Web.UI.Page 3: #Region “ Web Form Designer Generated Code “ 4:
‘This call is required by the Web Form Designer.
5:
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
6:
End Sub
7:
Protected WithEvents DGProdutos As System.Web.UI.WebControls.DataGrid
8:
‘NOTE: The following placeholder declaration is required by the Web Form Designer.
9:
‘Do not delete or move it.
10:
Private designerPlaceholderDeclaration As System.Object
11:
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
12:
‘CODEGEN: This method call is required by the Web Form Designer
13:
‘Do not modify it using the code editor.
14: 15:
InitializeComponent() End Sub
16: #End Region 17: Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 18:
‘Put user code to initialize the page here
19:
Dim conn As New System.Data.OleDb.OleDbConnection(“Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” +
20:
conn.Open()
21:
Dim cmd As New System.Data.OleDb.OleDbCommand
22:
Dim adap As New System.Data.OleDb.OleDbDataAdapter
23:
Dim Ds As New DataSet
24:
cmd.CommandText = “Select * from Products order by productname”
25:
cmd.Connection = conn
26:
adap.SelectCommand = cmd
27:
adap.Fill(Ds, “Produtos”)
28:
DGProdutos.DataSource = Ds
29:
DGProdutos.DataMember = “Produtos”
30:
DGProdutos.DataBind()
Server.MapPath(“Nwind.mdb”) + “;Persist Security Info=False”)
31: End Sub 32: End Class
to por sua praticidade e como pela vastidão de novos recursos e implementações disponibilizadas. Este tutorial teve por objetivo ser uma referência para que você possa dar seus primeiros passos (ou seus primeiros vôos) na tecnologia. Existem diversas formas de se fazer a mesma coisa no .NET, a idéia aqui foi mostrar apenas uma opção, para que possamos evoluir gradativamente. Há muito mais por ser desbravado e explorado. Até a próxima.
Faça o download no site: www.portalwebmobile.com.br/revista/ed1
Eduardo Bottcher (eduardo@sqlmagazine.com.br) Pósgraduado em Programação Web pela Unicarioca. Ministra diversas disciplinas nos cursos de graduação e pós-graduação da Unicarioca e coordena o Unicarioca.NET, grupo acadêmico de alunos da faculdade para estudos da plataforma .NET e é co-líder do Grupo Go.NET. Trabalha como analista de sistemas na empresa de desenvolvimento Add Tech, é consultor de projetos, editor da revista SQL Magazine e revisor da MSDN Magazine.
45 1º Edição
wm01.indb 45
7/1/2005 19:58:40
Introdução às tecnologias Web Services: SOA, SOAP, WSDL e UDDI Parte1 por Thomas Erl
A
ntes de nos aprofundarmos nos conceitos e tecnologia de web services, vejamos um pouco sua evolução. No ano de 2000, a W3C (World Wide Web Consortium) aceitou a submissão do Simple Object Access Protocol (SOAP). Este formato de mensagem baseado em XML estabeleceu uma estrutura de transmissão para comunicação entre aplicações (ou entre serviços) via HTTP. Sendo uma tecnologia não amarrada a fornecedor, o SOAP disponibilizou uma alternativa atrativa em relação aos protocolos proprietários tradicionais, tais como CORBA e DCOM. No decorrer do ano seguinte, o W3C publicou a especificação WSDL. Uma nova implementação do XML, este padrão forneceu uma linguagem para descrever a interface dos web services. Posteriormente suplementada pela especificação UDDI (Universal Description, Discovery and Integration), que proporcionou um mecanismo padrão para a descoberta dinâmica (dynamic discovering) de descrições de serviço, a primeira geração da plataforma de Web services foi estabelecida. A 1 ilustra em alto nível o relacionamento entre estes padrões. Desde então, os web services foram adotados por vendedores e fabricantes num ritmo considerável. Suporte amplo da indústria seguiu-se à popularidade e importância desta plataforma e de princípios de projeto orientados a serviço. Isto levou à criação de uma segunda geração de especificação de Web services.
Web services e a arquitetura orientada a serviços (SOA) Entendendo serviços O conceito de serviços em uma aplicação existe faz algum tempo. Serviços, assim como componentes, são considerados blocos 46 1º Edição
wm01.indb 46
7/1/2005 19:58:59
Tutorial
Estas tecnologias não modificam a funcionalidade do núcleo de um serviço web, tanto como o faz sua habilidade para se representar e comunicar num modo padrão. Muitas das convenções de arquitetura expressadas neste artigo assumem que SOAP e WSDL fazem parte da estrutura de web services descrita. Além disto, é normal que um Web service seja: capaz de agir como o solicitante e o provedor de um serviço; registrado com um discovery agent através do qual possam ser localizados.
1. O relacionamento entre especificações de primeira geração.
de construção independentes, os quais coletivamente representam um ambiente de aplicação. No entanto, diferente de componentes tradicionais, serviços têm algumas características únicas que lhes permitem participar como parte de uma arquitetura orientada a serviços. Uma destas características é a completa autonomia em relação a outros serviços. Isto significa que cada serviço é responsável por seu próprio domínio, o que tipicamente significa limitar seu alcance para uma função de negócio específica (ou um grupo de funções relacionadas). Este enfoque de projeto resulta na criação de unidades isoladas de funcionalidades de negócio ligadas fracamente entre si. Isto é possível por causa da definição de uma estrutura padrão de comunicação. Devido à independência que esses serviços desfrutam dentro desta estrutura, a lógica de programação que encapsulam não tem necessidade de obedecer a nenhuma outra plataforma ou conjunto de tecnologias. XML Web services O tipo de serviço mais largamente aceito e bem sucedido é o XML Web service, que será daqui em diante chamado apenas de web service, ou simplesmente service. Este tipo de serviço possui dois requisitos fundamentais: comunica-se via protocolos internet (normalmente HTTP); envia e recebe dados formatados como documentos XML. A ampla aceitação do web service resultou no surgimento de um conjunto de tecnologias suplementares que se tornaram um padrão de fato. Assim ao desenvolver nossos web services devemos considerar o uso de tecnologias que: forneça uma descrição de serviço que, no mínimo, consista de um documento WSDL; seja capaz de transportar documentos XML utilizando SOAP sobre HTTP.
Numa conversação típica com um web service, o cliente iniciador do pedido é um web service também. Como mostrado na 2, qualquer interface exposta por este client service também o qualifica como um serviço a partir do qual outros serviços podem solicitar informação. Posto isto, web services não se encaixam no modelo clássico de cliente-servidor. Na verdade, eles tendem a estabelecer um sistema ponto-a-ponto, onde cada serviço pode atuar como cliente ou servidor.
Service-oriented architecture (SOA) Como mencionado anteriormente, adicionar uma aplicação com uns poucos web services não é nenhum problema. Esta integração limitada pode ser apropriada para uma experiência de aprendizado, ou para complementar a arquitetura de uma aplicação existente com uma peça de funcionalidade baseada em serviços que atende a um requisito específico do projeto. No entanto, isto não estabelece uma arquitetura orientada a serviço. Existe uma clara diferença entre: uma aplicação que usa web service; uma aplicação baseada numa arquitetura orientada a serviços. Uma SOA é um modelo de projeto com um conceito profundamente amarrado à questão do encapsulamento de aplicação. A arquitetura resultante estabelece essencialmente um paradigma de projeto, no qual web services são os blocos de construção chave.
2. Troca de papéis do Web services durante uma conversação.
WebMobile 47
wm01.indb 47
7/1/2005 19:59:02
Isto quer dizer que ao migrar a arquitetura da sua aplicação para uma SOA, estabelece-se um compromisso com os princípios de projeto de web services e a tecnologia correspondente, como partes fundamentais do seu ambiente técnico. Uma SOA baseada em XML web service é construída sobre camadas de tecnologia XML estabelecidas, focada em expor a lógica de aplicação existente como um serviço fracamente acoplado. Para apoiar este modelo, uma SOA promove o uso de um mecanismo de discovery por serviços via um service broker ou discovery agent. A 3 mostra como uma SOA altera a arquitetura multicamada existente, ao introduzir uma camada lógica que, através do uso de interfaces programáticas padrão (providas pelo web services), estabelece um ponto comum de integração. Esta camada de integração de serviços constitui a base para um novo modelo que pode se estender além do escopo de uma única aplicação, unificando plataformas legadas díspares em um ambiente aberto. Quando web services são utilizados para integração cruzada de aplicações (ver 4), elas se estabelecem como parte da infra-estrutura do sistema.
3. Uma representação lógica de uma arquitetura orientada a serviços.
4. Uma representação lógica de uma arquitetura de integração orientada a serviço.
É importante se conscientizar quanto ao acréscimo de complexidade de projeto introduzido pelo SOA. Mais ainda do que em um ambiente n-camada, projetistas de aplicação devem considerar de uma forma completa como a introdução de serviços vai afetar dados existentes e modelos de negócio. Na medida em que a utilização de serviços se diversifica, o significado dos requisitos de segurança e escalabilidade são amplificados. Ambientes orientados a serviço bem projetados tentarão vencer estes desafios com infra-estrutura adequada, ao invés de utilizar soluções sob medida, específicas de aplicação Os papéis e cenários ilustrados nas próximas duas seções estão limitados somente ao assunto web service. A estrutura de mensagens SOAP subjacente será explicada em separado, no próximo artigo desta série.
Papéis web service Serviços podem assumir diferentes papéis quando envolvidos em diversos cenários de interação. Dependendo do contexto pelo qual é visualizado, assim como o estado da tarefa rodando no momento, o mesmo web service pode trocar de papéis ou ser designado para múltiplos papéis simultâneos: Provedor de serviços Agindo como um provedor de serviços, um web service expõe uma interface pública através da qual pode ser chamado por solicitantes do serviço. Um provedor de serviços disponibiliza esta interface publicando uma descrição do serviço. Num modelo clienteservidor, o provedor de serviço pode ser comparado ao servidor. O termo “provedor de serviço” pode também ser usado para descrever a organização ou ambiente que hospeda (provê) o web service. Um provedor de serviço pode também agir como um solicitante de serviço. Por exemplo, um web service pode atuar como um provedor de serviço quando um solicitante de serviço lhe pede para executar uma função. Pode então atuar como um solicitante de serviço quando mais tarde contata o solicitante de serviço original (agora agindo como um provedor de serviço) para solicitar informação de status. Solicitante de serviço Um solicitante de serviço é o remetente de uma mensagem web service ou o programa de software solicitando um web service específico. O solicitante de serviço é comparável ao cliente dentro de um modelo cliente-servidor padrão. Solicitantes de serviços são às vezes chamados de consumidores de serviços. Um solicitante de serviço pode também ser um provedor de serviço. Por exemplo, num modelo de solicitação e resposta, o web service iniciador primeiro age como um solicitante de serviço ao requerer informações do provedor de serviço. O mesmo web service então, faz o papel de um provedor de serviço ao responder à solicitação original.
48 1º Edição
wm01.indb 48
7/1/2005 19:59:15
Tutorial
Intermediário O papel de intermediário é assumido pelo web service quando ele recebe a mensagem de um solicitante de serviço e a passa adiante para o provedor de serviço. Neste caso, ele pode também agir como um provedor de serviço (recebendo a mensagem) e como um solicitante de serviço (passando adiante a mensagem). Intermediários podem existir em muitas formas diferentes. Alguns são passivos e simplesmente re-transmitem ou roteam as mensagens, enquanto outros processam ativamente uma mensagem antes de repassá-la. Tipicamente, aos intermediários só é permitido o processamento e modificação do cabeçalho da mensagem. Para preservar a integridade da mensagem, seus dados não devem ser alterados. Remetente inicial Como o web service responsável por iniciar a transmissão da mensagem, remetentes iniciais também podem ser considerados solicitantes de serviço. Este termo existe para ajudar a diferenciar o primeiro web service que envia uma mensagem, dos intermediários também qualificados como solicitantes de serviço.
5. Um caminho de mensagem formado por três Web services.
Receptor final O último Web service a receber uma mensagem é o receptor final. Estes serviços representam o destino final de uma mensagem e também podem ser considerados provedores de serviço.
Interação web service Quando mensagens são passadas entre dois ou mais web services, uma variedade de cenários de interação pode acontecer. A seguir, termos comuns utilizados para identificar e etiquetar estes cenários serão apresentados. Caminho da mensagem A rota pela qual a mensagem viaja é o caminho da mensagem. Deve consistir de um remetente inicial e um receptor final e pode conter nenhum, um, ou mais de um intermediários. A 5 ilustra um caminho de mensagem simples. O caminho de transmissão atual percorrido por uma mensagem pode ser dinamicamente determinado por roteadores intermediários. A lógica de roteamento pode ser ativada em resposta à carga de requisitos de balanceamento, ou pode ser baseada nas características da mensagem e outras variáveis lidas e processadas pelo intermediário em tempo de execução. A 6 descreve como uma mensagem é enviada via um ou dois caminhos de mensagem possíveis, tal como é determinado pelo roteador intermediário. Padrão de troca de mensagens Serviços que interagem em um ambiente orientado a serviços tipicamente se enquadram em determinados padrões de troca de mensagens. Padrões típicos incluem: solicite e responda (request and response);
6. Uma mensagem dinamicamente determinada por um roteador intermediário.
publique e subscreva (publish and subscribe); fire and forget - um para um; fire and forget - um para muitos ou difusão; O padrão pedido e resposta é o mais comum quando se está simulando intercâmbio de dados síncronizados. Os demais padrões são usados principalmente para facilitar transferência de dados assíncrona. Correlação Correlação (Correlation) é a técnica utilizada para casar mensagens enviadas através de caminhos de mensagem diferentes. É comumente empregada num padrão de intercâmbio de pedido e resposta de mensagem, onde a mensagem de resposta deve estar associada à mensagem original que iniciou a solicitação. Embutir valores de ID sincronizados dentro de mensagens relacionadas é uma técnica frequentemente utilizada para conseguir correlação. Coreografia Regras que governam características de comportamento WebMobile 49
wm01.indb 49
7/1/2005 19:59:18
relacionadas à forma como um grupo de web services interagem podem ser aplicadas como uma coreografia (choreography). Estas regras incluem a seqüência na qual web services podem ser chamados, condições que se aplicam à seqüência que está sendo transportada e o padrão de uso que irá definir os cenários de interação permitidos. O escopo de uma coreografia está tipicamente amarrado ao de uma atividade ou tarefa (ver exemplo na 7). Atividade Padrões de intercâmbio de mensagens formam a base para atividades de serviços (também conhecidos como tarefas). Uma atividade consiste de um grupo de web services que interagem e colaboram para realizar uma função ou um grupo lógico de funções. A 8 mostra uma atividade de serviço simples. A diferença entre uma coreografia e uma atividade está no fato de que a atividade é geralmente associada com uma função de aplicação específica, tal como a execução de uma tarefa de negócio.
Descrição da estrutura de web services Um web service é descrito através de uma coleção de documentos de definição. Estes atuam como blocos de construção para uma descrição de serviço: Abstrato + Concreto = Definição de Serviço Definição de Serviço + Definições Complementares = Descrição de Serviço A
9 ilustra a relação entre esses documentos.
8. Uma atividade de serviço envolvendo três serviços.
Abstrato A descrição de uma interface web service, independente dos detalhes de implementação, é chamada de abstrato (abstract). Descrições deste elemento são fornecidas adiante neste artigo, como parte do tutorial do WSDL. Concreto Localização e informação de implementação específicas sobre um web service constituem as partes concretas (concrete) de um documento WSDL. Elas são representadas pelos elementos de ligação (binding), serviço (service) e ponto-de-término (endpoint ou port). Definição de serviço Geralmente, o conteúdo de um documento WSDL constitui uma definição de serviço (service definition) que inclui as definições da interface (abstrato) e da implementação (concreto). Descrição de serviço Frequentemente, uma descrição de serviço é um único documento WSDL que fornece uma definição de serviço. No entanto, pode também incluir vários documentos de definição adicionais que irão fornecer informações complementares.
Introdução aos web services de primeira geração A estrutura W3C para web services está fundamentada em três especificações XML fundamentais: Linguagem para definição de web service (Web Services Definition Language - WSDL); Simple Object Access Protocol (SOAP); Universal Description, Discovery, and Integration (UDDI). 7. A seqüência de interação de um grupo de serviços sendo comandados por uma coreografia.
Estes padrões de tecnologia, acoplados aos princípios de projeto orientado a serviço, formam um SOA fundamentado na
50 1º Edição
wm01.indb 50
7/1/2005 19:59:24
Tutorial
tecnologia XML. Esta arquitetura de web services de primeira geração permite a criação de web services independentes capazes de encapsular unidades isoladas de funcionalidades de negócio. Esta tecnologia tem também algumas limitações, que tem sido contempladas numa segunda geração de especificações. A seção a seguir, fornece um tutorial introdutório para a tecnologia WSDL. SOAP e UDDI serão vistos no próximo artigo da série.
Linguagem para definição de Web Services (WSDL) Web services devem ser definidos numa forma consistente para que possam ser descobertos e “interfaceados” com outros serviços e aplicações. A WSDL é uma especificação W3C que fornece a linguagem mais avançada para a descrição de definições de web services. A camada de integração introduzida pela estrutura de web services estabelece um padrão, universalmente reconhecido e com interface programática suportada. Tal como mostrado na 10, WSDL permite a comunicação entre essas camadas ao fornecer descrições padronizadas. A melhor forma de entender como é definido um web service e como ele é expresso por um documento WSDL, é caminhar através de cada construtor que coletivamente representa essa definição. Comecemos com o elemento definitions raiz, o qual age como o conteiner para a definição do serviço (ver 1). Uma definição WSDL pode conter coleções dos seguintes construtores primários:
9. Conteúdo de uma descrição de serviço.
Interface; Message; Service; Binding;
A 11 ilustra como os primeiros dois construtores representam a definição da interface de serviço e os últimos dois fornecem os detalhes de implementação do serviço. Definição de interface abstrata Interfaces de web services individuais são representadas por elementos interface WSDL. Estes construtores contêm um grupo de operações lógicas correlatas. Numa arquitetura baseada em componentes, um elemento interface WSDL é análogo à interface do componente. Uma operação, portanto, é equivalente a um método de componente, por representar uma única ação ou função. A 2 apresenta um exemplo de interface. Um elemento operation típico consiste de um grupo de mensagens de entrada e saída correlatas. A execução de uma operation requer a transmissão ou intercâmbio destas mensagens entre o serviço solicitante e o provedor de serviço. Mensagens operation são representadas por construtores message que são declarados sob os elementos definitions. Os nomes das mensagens são então referenciados nos elementos filho das operation input ou output (ver 3).
10. Documentos WSDL representando aplicações web services.
11. O conteúdo de um documento WSDL, tal como se relaciona com uma definição de serviço.
WebMobile 51
wm01.indb 51
7/1/2005 19:59:38
Um elemento message pode conter um ou mais parâmetros input ou output que pertencem a uma operation. Cada elemento part define um destes parâmetros. Ele fornece um conjunto nome/valor (name/value), junto com o tipo de dado associado. Em uma arquitetura baseada em componentes, um part WSDL equivale a um parâmetro de input ou output (ou um valor de retorno) de um método de componente (ver 4). A seguir, um breve resumo dos construtores fundamentais que podem ser montados para estabelecer uma definição de interface abstrata: Interfaces: representam interfaces de serviço e podem conter múltiplos operations; Operations: representam uma função web service e podem referenciar múltiplas messages;
Listagem 1. Uma definição de serviço, tal como é expressa pelo construtor definitions. <definitions>
Messages: representam uma coleção de parâmetros input ou output e podem conter múltiplas parts; Parts: representam parâmetros de dados operation tanto de chegada como de partida.
Definição concrete (implementação) Sobre os detalhes de implementação, usando os elementos descritos nesta seção, um documento WSDL pode estabelecer detalhes “concrete” de ligação para protocolos, tais como SOAP e HTTP. Dentro de um documento WSDL, o elemento service representa um ou mais pontos-de-término nos quais o web service pode ser acessado. Estes pontos-de-têrmino consistem de informações de localização e protocolo e são armazenados numa coleção de
<input name=”Msg1” message=”BookInfo” /> </operation> </interface> </definitions>
<interface name=”Catalog”> ... </interface>
Listagem 4. Um bloco de mensagem com um construtor part representando parâmetros operation.
<message name=”BookInfo”> ... </message> <service> ... </service> <binding name=”Binding1”> ... </binding> </definitions>
<definitions> <message name=”BookInfo”> <part name=”title” type=”xs:string”> Field Guide </part> <part name=”author” type=”xs:string”> Mr. T </part> </message> </definitions>
Listagem 2. Uma interface representada pelo elemento interface.
Listagem 5. O elemento ponto-de-término.
<definitions> <interface name=”Catalog”> <operation name=”GetBook”> ... </operation> </interface > </definitions>
<definitions> <service name=”Service1”> <endpoint name=”Endpoint1” binding=”Binding1”> ...concrete implementation details... </endpoint> </service> </definitions><definitions>
Listagem 3. O elemento input dentro do construtor operation referenciando um bloco de mensagem. <definitions> <message name=”BookInfo”> ... </message> <interface name=”Catalog”> <operation name=”GetBook”>
<message name=”BookInfo”> <part name=”title” type=”xs:string”> Field Guide </part> <part name=”author” type=”xs:string”> Mr. T </part> </message> </definitions>
52 1º Edição
wm01.indb 52
7/1/2005 19:59:41
Tutorial
elementos endpoint (ver 5). Agora que descrevemos como um web service pode ser acessado, precisamos definir os requisitos de chamada para cada uma das suas operations. Os elementos binding associam às operations informações de formato de protocolo e mensagem. O construtor operation que reside dentro do bloco binding é semelhante a sua contrapartida na seção interface (ver 6). A descrição de informação concrete dentro de um documento WSDL pode ser resumida assim: elementos service: hospedam coleções de pontoListagem 6. O elemento binding representando uma operation existente. <definitions> <service> <binding name=”Binding1”> <operation> <input name=”Msg1” message=”book” /> </operation> </binding> </service>
de-término representados individualmente por elementos endpoint; elementos endpoint: contem dados endpoint, incluindo endereço físico e informação de protocolo; elementos binding: se auto-associam a construtores operation; cada endpoint pode referenciar um elemento binding e, portanto, fornecer informação endpoint para a operation subordinada.
Conclusão Vimos nesse primeiro artigo o princípio de funcionamento dos web services bem como duas de suas tecnologias de base, SOA e WSDL. No próximo artigo, complementaremos o assunto apresentado aqui analisando as tecnologias SOAP e UDDI. Até lá.
Thomas Erl é consultor independente e arquiteto chefe da XMLTC Consulting em Vancouver, no Canadá. Ele é conhecido por seus trabalhos no modelo de escopo em camadas para XML e Web Services e, no framework de integração de Web Services (XWIF).
</definitions>
WebMobile 53
wm01.indb 53
7/1/2005 19:59:44
Desenvolvimento de jogos J2ME/MIDP para celular por Eduardo Peixoto e Renato Iida
54 1º Edição
wm01.indb 54
7/1/2005 19:59:52
Jogos
E
ste artigo apresenta uma introdução à programação de jogos para celular. Partindo de conceitos básicos de programação Java/MIDP, você será capaz de, ao final do artigo, construir seu próprio jogo Arcade. Iremos apresentar um estudo de caso de um jogo feito exclusivamente para o artigo, entitulado “Mobile Invaders”. Como o nome sugere, é um jogo baseado no Space Invaders do Atari 2600, onde o jogador controla uma nave que tem que destruir as naves adversárias antes que elas se aproximem. É um jogo bastante interessante pois, além de divertido, ilustra bem os conceitos de criação de jogos.
Tipos de jogos Para desenvolver um jogo de sucesso é preciso ter conhecimento não apenas sobre programação. É necessário ter uma visão de mercado, não apenas do mercado de jogos MIDP, mas do mercado de jogos para dispositivos móveis em geral, incluindo outras tecnologias. É importante saber o que faz com que um jogo tenha chances de entrar no mercado. Em suma, conhecer vários jogos ajuda você a ter idéias para desenvolver o seu próprio jogo - é interessante saber em quais pontos outros jogos acertaram e erraram. Um ponto que facilita na criação e concepção de um jogo é sua classificação. Isso vai auxiliar no game design e na programação em si. Vamos conhecer alguns tipos de jogos: Arcade: jogos clássicos dos anos 80, como Asteroids, Space Invaders e Pac-Man; Carta: simulam um jogo específico de cartas como Poker ou Truco; Puzzle: privilegiam o raciocínio rápido, como Tetris e Shapes and Collumns; Jogos de tabuleiro: simulam os antigos jogos de tabuleiro como Xadrez e Damas; Aventura em texto: jogos totalmente em texto, em que um cenário é descrito e o jogador tem uma lista de decisões possíveis; Aventura gráfica: basicamente é a evolução da aventura em texto. São mostradas figuras estáticas ou dinâmicas de cenários e o jogador pode interagir com elas, como Space Quest; Side scrollers: conhecidos como “de plataforma”, são jogos 2D em que o personagem tem que pular buracos e atirar em inimigos, como Sonic e Super Mario; RPG: em geral possuem uma história complexa, onde o personagem evolui durante o jogo e pode interferir em toda a história. Exemplos são as séries Ultima e Final Fantasy. Essa classificação serve para o desenvolvedor definir as regras do jogo, o público alvo e a plataforma alvo. Essas escolhas devem ser consistentes. É difícil, por exemplo, obter sucesso se você quiser fazer um jogo 3D para um celular simples, pois ele
provavelmetne ficará muito lento e a jogabilidade muito prejudicada. Outro fato que ajuda é ter um grupo de jogadores com o perfil alvo para testar e fazer sugestões sobre o jogo, como nível de dificuldade, arte ou interface. Outro ponto que gostaríamos de citar é que alguns jogos misturam mais de um elemento, ficando essa decisão por conta do game designer.
Conceitos de jogos Para que o leitor possa acompanhar melhor o artigo, introduziremos alguns conceitos aqui. Curva de aprendizagem: é o tempo que um jogador necessita para assimilar os comandos e as regras do jogo. Existem principalmente duas abordagens utilizadas para permitir que o jogador aprenda as regras e os comandos: (1) através da criação de uma fase do jogo, conhecida como tutorial, onde os comandos e as regras são explicitamente demonstrados e (2) através da criação de fases iniciais com níveis de dificuldade baixos. Essas abordagens facilitam a despertar o interesse do jogador. Tempo de vida do jogo: quantas horas em média um usuário vai continuar jogando este jogo antes de perder o interesse por ele. Fator de replay: quantas vezes o jogador vai jogar novamente, mesmo já tendo terminado o jogo. Sprite: é um elemento básico visual que pode ser renderizado a partir de um ou vários frames de uma imagem. Estes vários frames podem ser utilizados para fazer a animação do sprite. Normalmente corresponde a um objeto na tela do jogo, como um inimigo, o personagem principal, ou um tiro. FPS (frames per second): significa quadros por segundo. Define quantos quadros são mostrados ao usuário em um segundo de jogo. Para jogos em celulares, o mínimo aceitável são 10 quadros por segundo. Quanto maior a quantidade de quadros por segundo, maior é o processamento requerido. Plataforma-alvo: celular ou conjunto de celulares que serão capazes de rodar o jogo. Público-alvo: pessoas às quais o jogo se destina. Turno de jogo: conjunto de atividades que o jogo faz a cada frame de jogo. Entre atividades típicas, estão repintar a tela, verificar os pontos do jogador ou colisões entre os sprites.
Processo de criação Para a construção de jogos temos uma série de passos que devem ser seguidos para facilitar seu desenvolvimento e sua viabilidade. Nesse artigo, dividimos esses passos em oito etapas para facilitar o entendimento: pesquisa, público-alvo, plataformaalvo, regras, layout, arte, codificação e teste. Esse processo é apresentado como uma cascata de etapas (ver 1), mas durante o desenvolvimento ele é iterativo e incremental.
WebMobile 55
CRÉDITOS 00 wm01.indb 55
7/1/2005 19:59:57
Uma forma de definir as regras é avaliar e analisar os jogos atuais semelhantes ao que será construído e tentar criar uma regra nova para tornar o jogo diferente. Além disso, procurar detectar a razão desses jogos terem ficado conhecidos (ou não) também pode dar boas idéias. Claro que isso não exclui a possibilidade de você ter uma idéia diferente, ou juntar idéias de jogos de tipos diferentes. Para o Mobile Invaders definimos o seguinte: uma nave controlada pelo jogador, que tem a possibilidade de atirar até três tiros simultâneos, com o objetivo de destruir os inimigos na tela. Existem 18 inimigos na tela, em três fileiras de seis inimigos cada, com a possibilidade de atirar até dois tiros simultâneos (no total). O jogador perde se as naves inimigas chegarem muito próximo do final da tela ou se ele for atingido por um tiro e vence se ele destruir todas as naves inimigas.
Layout do jogo
1. Diagrama do processo de criação.
Público-alvo e plataforma-alvo Essas duas etapas estão interligadas. A definição desses dois elementos é necessária para saber se o jogo é viável ou não. Se forem definidos um público-alvo muito restrito e uma plataforma-alvo com poucos celulares, o jogo provavelmente vai vender pouco. Além disso, deve ser feita a análise de mercado para o lançamento do jogo. Por exemplo, se o tempo de desenvolvimento for de um ano, deve-se prever qual a melhor plataforma para o próximo ano. A queda de preços é acelerada e celulares populares podem ser substituídos por mais rápidos e com mais recursos. Para nosso estudo de caso, definimos: O público alvo é o de jogadores eventuais, ou seja, aqueles que vão jogar na fila do banco, ou enquanto esperam uma carona. A curva de aprendizagem deste jogo é muito pequena, pois o jogo tem poucos comandos e um objetivo muito simples e fácil de entender. O fator de replay deste tipo de jogo é grande, pois você sempre tem a motivação de conseguir uma pontuação maior que seu recorde anterior (ou maior que a de seu amigo). A plataforma alvo escolhida foi a série 60. Esta plataforma compreende celulares Nokia (3650, N-Gage, 6600), Siemens (SX-1), Panasonic (X700), entre outros. Essa plataforma é uma família de smartphones, que utilizam o sistema operacional Symbian. Entretanto, um detalhe técnico (explicado mais adiante) irá determinar que o jogo conforme implementado só poderá rodar em aparelhos série 60 da Nokia.
Regras do jogo Com um tipo de jogo definido, começa a definição das regras. Essa etapa será a base para as etapas futuras do desenvolvimento.
Definida a plataforma alvo, sabe-se o tamanho da tela e a capacidade de cores do aparelho. Temos também as regras e quais são os sprites necessários e suas ações. Agora vamos criar um layout de tela para saber o tamanho que os sprites irão ocupar na tela. Como ainda não foi definida a arte, você pode criar este layout com figuras geométricas simples. Isso irá inclusive orientar o artista, pois os desenhos dos sprites deverão seguir estes tamanhos. Este layout também auxilia para descobrir quantos objetos cabem na tela do jogo. Uma técnica que pode ser utilizada por jogos mais complexos é a do storyboard. Nela, faz-se uma seqüência de diagramas que mostram a movimentação do personagem, o posicionamento dele com os inimigos, como fica a cena de tiro, etc. Essa técnica facilita bastante o trabalho em jogos mais complexos. Para o Mobile Invaders, definimos o seguinte: três tamanhos de objetos: a nave do jogador, as naves inimigas e o tiro (que é o mesmo para o jogador e para os inimigos). Fizemos então uma tela de testes de 176 X 208 pixels (uma das telas possíveis para um série 60). A partir daí, fizemos algumas tentativas para acertar o tamanho dos sprites. Inicialmente, pensamos que o inimigo pudesse ter 20 X 20 pixels, porém poucos inimigos iriam caber na tela. Foi acertado então um inimigo de 15 X 15, uma bala de 7 X 10, e uma nave de 20 X 30. A 2 mostra o resultado desta tela, que foi passada para a artista desenhar os sprites.
Arte do jogo Outro ponto importante é definir a arte do jogo. O formato para as figuras deve ser .png (portable network graphics) para ficarem compatíveis com o MIDP 1.0. A maioria dos celulares tem uma capacidade de cores reduzida (4096 cores ou, no máximo, 65536). Usar uma paleta de cores reduzida ajuda a manter o tamanho das figuras reduzidas e diminuir alteração de cor na tela do celular. Uma vantagem do uso do png é que ele suporta transparência de pixels. Assim, apesar da nave estar armazenada em uma imagem retangular, ela não é retangular, possuindo uma forma
56 1º Edição
wm01.indb 56
7/1/2005 20:00:00
Jogos
mais complexa. Adicionando transparência aos pixels que não pertencem à nave, nada precisa ser feito quando a imagem for colocada na tela: a nave irá aparecer em cima do que antes existia naquele ponto, e os pixels transparentes serão ignorados. Além do formato e da cor utilizada na arte do jogo, deve-se ter atenção com a resolução utilizada para criá-los. Desenhos que foram criados em alta resolução podem ficar impossíveis de se utilizar caso sejam reduzidos no momento de aplicá-los ao jogo. Isso pode gerar tantos ajustes que pode ficar mais fácil recriar a arte. Para nosso jogo definimos o seguinte: com base na 2 feita pelos desenvolvedores, a artista desenvolveu a arte mostrada na 3.
Implementando o jogo Daqui para frente nos concentraremos apenas nos detalhes de implementação do Mobile Invaders. O programa utilizado para criar o código foi o NetBeans 3.6 e o J2ME Wireless Toolkit 2.2 Beta (WTK). No WTK, foi instalado o emulador específico da plataforma-alvo, o Series 60 MIDP Concept Beta 0.3.1 (ver 1). A forma de integração entre esses softwares se encontra explicada nos links e em um documento que acompanha o código do artigo, disponível no site da WebMobile. As classes desenvolvidas podem ser divididas em dois grupos: classes de apoio e classes de jogo. O primeiro conunto é responsável por funções iniciais como menus, splash screens e inicializar a arte do jogo. O outro grupo está diretamente relacionado à parte jogável do Mobile Invaders, como a lógica do jogo e os sprites. A classe que conecta esses dois grupos é o MIDlet (MobileInvadersMidlet). O ciclo de vida do jogo pode ser visto na 4. Esse ciclo foi representado por uma máquina de estados onde cada estado foi denominado com a classe mais importante para a atividade. Além disso, existe um texto associado a cada estado para explicar que ações estão relacionadas ao estado. Quando o jogador inicia o jogo ele na verdade inicia o MIDlet do jogo. Este Midlet cria os objetos necessários e passa o display
para o MenuCanvas. Este, por sua vez, faz o processo de mostrar as splash screens e, em seguida, mostrar o menu. Quando o jogador clica em play o método iniciaJogo() do Engine é chamado, criando os objetos necessários e iniciando a thread do GameCanvas, que agora tem o display. Quando o jogador clica em back o jogo volta a mostar o MenuCanvas na tela e, se ele clica em exit neste menu, ele volta para o Midlet para destruir a aplicação.
1. Instalando o emulador e executando o exemplo. O Mobile Invaders foi criado utilizando o Wireless ToolKit (WTK)versão 2.2 beta 2 e o emulador Nokia Serie 60 Concept vesão 0.3.1. Para instalar o WTK, faça o download do site: http://java.sun.com/ products/j2mewtoolkit/download-2_2.html. Depois basta executar e seguir as instruções na tela. Feito isto, será necessário instalar o emulador. Seu download pode ser efetuado a partir do site: www.forum.nokia.com/main/0,6566,034-243,00.html. Para tornar disponível o emulador dentro do WTK é preciso mudar o diretório do Nokia Concept para o diretório <diretório raiz do WTK>\wtklib\ devices . Isto tem que ser feito durante a instalação, quando o instalador solicita o diretório onde você deseja instalar o programa. Depois, para executar o exemplo, faça o download do arquivo do site da revista e descompacte para o diretório <diretório raiz do WTK>\ apps. Em seguida, basta abrir o KToolbar do WTK, selecionar a opção Open Project, selecionar o Mobile Invaders e executá-lo utilizando o emulador Concept. 2. MIDP 1.0 ou MIDP 2.0? MIDP (Mobile Information Device Profile – Perfil de informação do dispositivo móvel) é um conjunto de bibliotecas (denominado perfil) que atuam como uma extensão ao J2ME, acrescentando novos recursos a esta linguagem. A primeira versão (MIDP 1.0) fornece as API’s básicas para interface com o usuário (GUI), persistência de dados, conexão http entre outras coisas. A nova versão (MIDP 2.0) oferece recursos como conexão segura, recursos multimídia, além de uma melhoria nas API’s já existentes. Para desenvolvimento de jogos, a nova versão oferece a Game API, que amplifica a capacidade gráfica do MIDP de várias maneiras. A maioria dos aparelhos encontrados no Brasil hoje possuem a versão MIDP 1.0, que foi um dos fatores que influenciou nossa escolha por seu uso. 3. Dica
2. Layout de tela do jogo.
3. Arte do jogo.
Para conseguir utilizar toda a tela do celular em MIDP 1.0 nos celulares Nokia é preciso utilizar uma classe proprietária denominada FullCanvas. A forma de usála é muito similar ao Canvas de MIDP 1.0. Assim como o Canvas do MIDP 1.0, o FullCanvas é uma classe abstrata que lida com interface gráfica de baixo nível. Para utilizá-lo em seu programa, deve-se importar o pacote proprietário e estender a classe, sobrescrevendo o método paint(Graphics graphics). Quase todas as outras empresas fornecem API`s proprietárias para resolver este problema. Uma limitação desse uso é que o jogo só vai rodar nos celulares que possuem essa API (celulares Nokia). Então, para portar o jogo para outro celular essa classe deve ser substituída, colocando em seu lugar a API proprietária respectiva. Isso significa, infelizmente, que deve ser gerado um arquivo jar para
WebMobile 57
wm01.indb 57
7/1/2005 20:00:02
4. Diagrama de estados do jogo.
cada marca. Em MIDP 2.0 essa limitação de não usar a tela toda pela classe Canvas foi resolvida com o método setFullScreenMode, possibilitando seu uso em aparelhos de todas as marcas.
Classes de apoio Iniciamos criando a classe necessária para qualquer aplicativo J2ME (MIDlet), e duas classes de apoio (GameFactory e MenuCanvas). O diagrama que reflete as classes construídas é mostrado na 5. No caso do Mobile Invaders, o MIDlet tem uma função muito simples: criar os objetos e chamar o MenuCanvas. As funções usuais, como escutar os comandos do usuário, são responsabilidade dos objetos canvas criados, que são o GameCanvas e o MenuCanvas, e por isso este MIDlet não implementa CommandListener. A classe GameFactory é responsável por colocar as imagens na memória para os outros objetos acessarem. Isso é feito em três etapas para tornar o carregamento do jogo mais rápido. A primeira etapa acontece na instanciação do objeto e as outras duas são feitas quando os métodos loadImages1() e loadImages2() são chamados. A classe responsável por controlar o tempo de splash screen e chamar os métodos da GameFactory é o MenuCanvas. Na 1 temos parte da classe MenuCanvas e seu método doSplashScreen(). Caso o jogo possua mais menus (opções, high score, créditos) é interessante que estes sejam criados na classe MenuCanvas (ou em outras classes de apoio) e não na classe GameCanvas (responsável pelos gráficos do jogo). Isto por que se todas as funções estiverem agregadas em apenas um canvas, os métodos paint() e keyPressed se tornariam muito grandes e complexos para o entendimento e manutenção do código.
Classes de jogo Agora serão apresentadas as classes responsáveis por controlar e desenhar a tela de jogo. Serão mostrados exemplos sobre os principais pontos de implementação, mostrando trechos de código seguidos de uma breve explicação.
Classe Sprite Elaboramos uma classe abstrata Sprite com os métodos de colisão e movimento já implementados, e dois métodos abstratos desenhaSprite() e atualizar() que devem ser sobrescritos por suas subclasses. O diagrama representando a classe Sprite e suas subclasses é mostrado na 6. Os atributos da classe Sprite são explicados na 7.
5. Diagrama das classes de apoio.
58 1º Edição
wm01.indb 58
7/1/2005 20:00:08
Jogos
1. Código que gera as splash screens do Mobile Invaders. Este segmento encontra-se na classe MenuCanvas //Método que carrega as splash screens. //Carrega algumas imagens por vez, enquanto mostra a splash //screen, para acelerar o processo. public void doSplashScreen() {
long inicio,tempo;
inicio = System.currentTimeMillis(); mobileInvadersMidlet.gameFactory.loadImages1(); splashScreen2 = mobileInvadersMidlet.gameFactory. splashScreen2; menu = mobileInvadersMidlet.gameFactory.menu; tempo = System.currentTimeMillis() - inicio;
6. Diagrama da classe Sprite e suas subclasses. Alguns métodos e atributos não foram mostrados para simplificar a visualização.
if (tempo < 2000) { try { Thread.sleep(2000 - tempo); } catch (InterruptedException ioe) { } }
inicio = System.currentTimeMillis(); telaAtual = SPLASH_SCREEN_2; repaint(); serviceRepaints(); mobileInvadersMidlet.gameFactory.loadImages2(); tempo = System.currentTimeMillis() - inicio; if (tempo < 2000) { try { Thread.sleep(2000 - tempo); } catch (InterruptedException ioe) { }
7. Atributos da classe Sprite.
}
telaAtual = MENU;
nem todos os sprites de jogo se movem nas duas direções. Para movimentar o sprite, portanto, faz-se uma chamada ao método:
repaint(); serviceRepaints(); }
Movimentação Por se tratar de um jogo 2D, existe um plano cartesiano XY, onde os eixos X e Y têm origem no canto superior esquerdo, como mostra a 7. O eixo Y está na vertical e aumenta de cima para baixo, enquanto o eixo X está na horizontal e aumenta da esquerda para direita. O método de movimentação da classe Sprite apenas move a origem do sprite de uma coordenada para outra. Para movimentar um sprite no jogo, são usados dois atributos, velocidadeX e velocidadeY, que pertencem a subclasse que herda de Sprite, pois
sprite.moverPara(sprite.x + sprite.velocidadeX, sprite.y + sprite.velocidadeY);
Assim, a velocidadeY determina quantos pixels o sprite vai se mover na direção Y, sendo o sinal a direção desse movimento (positivo para baixo, negativo para cima), e da mesma forma acontece com o eixo x (com o sinal positivo denotando velocidade para a direita e negativo para a esquerda). O código da 2 mostra como é implementada a movimentação dos sprites na tela
Colisão Para simplificar o entendimento, o método de detecção de colisão definido é bastante simples. Utilizando os parâmetros de posição e tamanho (x, y, largura e altura) da classe Sprite, foi WebMobile 59
wm01.indb 59
7/1/2005 20:00:12
2.Código de movimentação da classe Sprite. Este segmento encontra-se na classe Sprite. //Método que muda a posição do sprite. public void moverPara(int x,int y) { this.x = x; this.y = y; }
criado um método que checa se os dois sprites, considerados como retângulos, se intersectam em algum ponto da tela. Isso gera imperfeições principalmente no personagem, pois a nave não ocupa toda a área do retângulo. A 3 mostra como foi implementado. A Game API, do MIDP 2.0, fornece uma classe Sprite com métodos de colisão mais elaborados, que fazem inclusive colisão considerando os pixels transparentes da imagem.
Os sprites de jogo Na nossa implementação três classes herdam diretamente de Sprite: Bullet, Enemy e Personagem. Elas se referem aos três elementos existentes no jogo. Todas as naves inimigas existentes na tela são objetos da classe Enemy, e todas as balas existentes no jogo (tanto as disparadas pelo jogador quanto as disparadas pelos inimigos) são objetos da classe Bullet. A classe Bullet tem uma variável do tipo Sprite (dono) que se referencia a quem disparou a bala. A classe Personagem tem dois novos atributos básicos: explodindo e counter, que são usados para gerenciar a explosão (feita de forma bem simples, popularmente utilizada no Atari 2600, apenas piscando o sprite). Ela possui também referências ao engine e ao midlet. A referência ao engine (analisado mais abaixo) é utilizada para ler as variáveis leftPressed e rightPressed, que indicam que o jogador pressionou essas teclas, e para fazer mudanças no ambiente do jogo, como colocar uma nova bala ou mesmo terminar o jogo. Essa rotina de atualização e de relacionamento com a engine é apresentada na 4. A classe Enemy tem os mesmos atributos e referências que a classe Personagem, acrescida de mais cinco novos atributos: linha, counterY, random, velocidadeY e velocidadeX. A variável linha corresponde à linha que este objeto pertence nas fileiras de inimigos, e é usada para controlar a direção da variável velocidadeX de todos os inimigos desta fileira, de modo que quando o inimigo da ponta alcançar o fim da tela e voltar, todos os da fileira também mudem de direção. A variável counterY é utilizada para controlar a variável velocidadeY, de modo que os inimigos não desçam rápido demais. Todas essas rotinas devem ser chamadas em todo turno de jogo, e são executadas quando o método atualizar(), mostrado na 5, é chamado.
O disparo do inimigo foi feito de forma bastante simples. Pegase um número aleatório (gerado pela função random.nextInt()) e verifica-se se os 7 bits menos significativos são menores que 10. Caso positivo, o inimigo coloca uma bala em jogo (se o número máximo de balas na tela ainda não tiver sido alcançado). A classe Bullet possui dois atributos específicos: velocidadeY e uma referência ao objeto Sprite que a disparou (dono). A variável velocidadeY muda conforme o sprite que a disparou (se o jogador disparou, a bala sobe, senão, a bala desce). É importante observar que a classe Bullet não tem todos os seus parâmetros inicializados pela construtora - ao invés disso foi utilizado um método setBullet() para inicializar estes parâmetros. Isto porque os objetos Bullet são reutilizados dinamicamente, tendo sido criados no início do jogo e depois realocados para uso sob demanda, para evitar a criação de novos objetos durante o jogo. Essa reutilização traz duas vantagens: aumenta a performance do jogo, evitando chamadas ao new(); e diminui a dependência do código com o Garbage Collector, pois você não precisa que ele destrua os objetos para liberar memória, você mesmo controla o uso desses objetos. O comportamento da bala é definido pelo Sprite que a disparou. Se ela foi disparada por um inimigo, sua velocidadeY será positiva (isto é, ela estará descendo), enquanto se ela tiver sido disparada pelo jogador esta velocidade será negativa (isto é, ela estará subindo). O método atualizar() da classe Bullet faz o movimento da bala e detecta se ela saiu da tela de jogo, momento no qual ela é desativada e o objeto se torna disponível para reuso.
Engine O Engine é a classe responsável pela lógica do jogo. Todos os outros objetos do jogo se relacionam através dele como mostra o diagrama de classes da 8. Existem algumas constantes que configuram o jogo (número de inimigos na tela, máximo de balas, entre outros). A criação dessas constantes facilita um ajuste posterior no jogo, somente modificando seu valores. Por exemplo, para aumentar a quantidade de inimigos por linha, é necessário somente mudar o valor inicial da constante ENEMIES_PER_LINE. O método iniciaJogo() é responsável por criar os objetos que serão usados no jogo. Basicamente, ele cria um objeto Personagem, um array de Bullet e um array de Enemy. Além disso, ele inicia as variáveis do jogo como número de balas do inimigo, quantidade de inimigos e a variável booleana de gameover. Depois disso, ele passa o display para o GameCanvas e inicia a thread do jogo, por uma chamada ao método start() de GameCanvas. O código desse método é mostrado na 6. O método turnoDeJogo() da classe engine é chamado pelo GameCanvas todo turno para atualizar os objetos ativos e detectar a colisão. A sequência deste método é bastante simples.
60 1º Edição
wm01.indb 60
7/1/2005 20:00:14
Jogos
Inicialmente, ele atualiza os objetos ativos (na ordem – personagem, balas, inimigos) por uma chamada ao método atualizar() destes objetos. Em seguida, ele checa se a direção de movimento horizontal de cada linha de inimigos é a mesma para cada um e, se não for, modifica o sinal da velocidade dos demais inimigos ativos nesta linha. Por fim, ele faz a checagem das colisões entre as balas disparadas pelo jogador com os inimigos e entre as balas disparadas pelos inimigos com o jogador. Note que não é feita a checagem entre as balas disparadas pelos inimigos com os outros inimigos – os inimigos não podem matar uns ao outros! Se uma bala disparada pelo jogador atingiu um inimigo, tanto a bala quanto o inimigo são destruídos. Se uma bala disparada pelo
inimigo atingir o jogador, o jogo termina. Toda essa sequência de passos mostrados na 7 (bem como o repaint da tela) é feita a cada turno de jogo, como pode ser visto mais adiante no método run() da classe GameCanvas na 8. O método setBullet(Sprite dono) é chamado pelos sprites na tela quando eles querem disparar uma bala. Isso foi necessário para facilitar o reaproveitamento dos objetos Bullet, como descrito anteriormente.
GameCanvas Durante o jogo uma grande quantidade de objetos são renderizados na tela e necessitam também serem controlados (como
3. Código de detecção de colisão do Mobile Invaders. Este segmento encontra-se na classe Sprite //Método de colisão de um sprite com outro sprite. //Retorna true se a colisão for detectada e false caso contrário. //A implementação é bem simples, apenas detectando a intersecção dos sprites //na tela, considerados como quadrados. public boolean colide(Sprite outroSprite) { if ((((x < outroSprite.x) && (x + largura > outroSprite.x))||((x > outroSprite.x) && (x < outroSprite.x + outroSprite.largura))) && (((y < outroSprite.y) && (y + altura > outroSprite.y))||((y > outroSprite.y) && (y < outroSprite.y + outroSprite.altura))) ) { return true; } else { return false; }
}
4. Código que define como atualizar o Personagem e a relação com a engine do jogo. Este segmento encontra-se na classe Personagem //Faz o update do estado do jogador.
} else if (engine.rightPressed) {
public void atualizar() {
frameAtual = 2;
if (!explodindo && !engine.gameOver) {
} else {
if (engine.rightPressed) {
frameAtual = 1;
moveDireita();
}
} else if (engine.leftPressed) { moveEsquerda();
}
} } else if (explodindo) { if (counter++ > 5) { explodindo = false;
//Método usado para colocar um objeto bullet na tela. //Chamado pelo GameCanvas ao apertar a tecla Fire / Num5 public void atira() {
ativo = false;
if (numeroDeBullets < Engine.PLAYER_MAX_BULLETS) {
engine.terminaJogo();
engine.setBullet(this);
}
numeroDeBullets++;
}
}
if (engine.leftPressed) {
}
frameAtual = 0;
WebMobile 61
wm01.indb 61
7/1/2005 20:00:16
5. Método atualizar que define as ações dos inimigos na tela. Este segmento encontra-se na classe Enemy. //Faz o update do estado do inimigo.
if (counterY++ > 5) {
public void atualizar() {
velocidadeY = 1; counterY = 0;
if (!explodindo && !engine.gameOver) {
} else {
if (this.x + velocidadeX < 15) {
velocidadeY = 0;
moverPara(this.x + velocidadeX,this.y +
}
velocidadeY); engine.velocidadeDaLinha[linha] = 5;
if ((random.nextInt() & 127) < 10) {
} else if (this.x + velocidadeX > 160) {
if (engine.enemyNumeroDeBullets < Engine.
moverPara(this.x + velocidadeX,this.y +
ENEMY_MAX_BULLETS) {
velocidadeY);
engine.setBullet(this);
engine.velocidadeDaLinha[linha] = -5;
engine.enemyNumeroDeBullets++;
} else {
}
moverPara(this.x + velocidadeX,this.y +
}
velocidadeY);
} else if (explodindo) {
}
if (counter++ > 4) {
if (this.y > 155) {
}
explodindo = false; engine.gameOver = true; }
} }
8. Diagrama da classe Engine e os outros objetos do jogo.
62 1º Edição
wm01.indb 62
7/1/2005 20:00:20
Jogos
a movimentação do personagem, animação da bala, movimentação dos inimigos, explosão do inimigo). Além das operações referentes aos objetos na tela, tarefas como a checagem dos comandos do teclado e a comunicação com um servidor ou outro aparelho (no caso de um jogo multi-player) devem ser também realizadas. Contudo, o usuário deve ter a impressão de que tudo isso está sendo feito em paralelo, ou seja, ao mesmo tempo. Uma das técnicas de programação que podem ser usadas para atingir tal objetivo é a técnica de Multithreading (ver 4).
4. Thread Uma thread é um caminho tomado por um programa durante a execução. Executando por vários caminhos, uma aplicação é mais rápida e mais flexível.
Ao menos três threads distintas devem ser implementadas em um jogo: (1) uma para checar a entrada do usuário, (2) uma para redesenhar a tela e (3) uma para manipular os sprites. Para programadores J2ME essa tarefa é facilitada pois as duas primeiras threads já são automaticamente implementadas pela classe Canvas (e também pela classe FullCanvas, que foi a de fato utilizada). Essa implementação é o que provoca a chamada do método keyPressed toda vez que uma tecla é pressionada, e foi utilizada para capturar os comandos do usuário. Isso facilita, pois você 6. Código do método iniciaJogo() da classe Engine. public void iniciaJogo() {
gameOver = false;
não tem que criar um código para escutar a entrada do teclado. A outra thread é a que repinta a tela quando o método repaint() é chamado. A última thread, de manipulação dos sprites, deve ser implementada pelo programador. Uma forma de se fazer isso é implementando a interface Runnable. Essa interface requer que a classe que a implementa sobrescreva o método run(). A implementação dessa thread está descrita na 8: A chamada ao método start() do objeto gameThread chama o método run(), sobrescrito pelo programador e inicia a thread. O método run fica rodando em loop, e em cada turno faz a sequência: chama o método turnoDeJogo() do Engine, repinta a tela, e espera. Quando o jogo entra em pausa (por uma Incoming Call ou por opção do jogador) a variável running se torna false, parando a thread do jogo e toda a movimentação dos sprites. Quando o jogo voltar (o jogador despausar o jogo) esta thread de jogo é criada novamente por uma nova chamada ao método despausar() da classe GameCanvas (mostrado na 8), reiniciando o jogo.
FPS A técnica utilizada para garantir uma quantidade de frames por segundo é simples. No começo do método run() é obtido o tempo atual em milissegundos, e após todas as rotinas serem executadas, o tempo é obtido novamente. Se a diferença for menor que a janela de tempo predefinida, espera-se o tempo restante. Se o seu jogo estiver sempre acima dessa janela, deve-se otimizar o programa. Essa janela pode ficar definida como turno de jogo. No nosso caso usamos uma janela de 80 milissegundos que é aproximadamente 12 quadros por segundos (FPS).
numeroDeInimigos = MAX_ENEMIES;
Estabilidade do jogo
enemyNumeroDeBullets = 0;
jogador = new Personagem(mobileInvadersMidlet,this);
for (int i = 0 ; i < MAX_BULLETS ; i++) { bullets[i] = new Bullet(mobileInvadersMidlet,this); }
for (int k = 0; k < LINES_OF_ENEMIES ; k++) { for (int j = 0; j <
ENEMIES_PER_LINE ; j++) {
enemies[j + k * ENEMIES_PER_LINE] = new Enemy( 10 + 20*j,10 + 20*k,k,mobileInvadersMidlet, this,random.nextLong()); } }
mobileInvadersMidlet.setDisplayable(mobileInvaders Midlet.gameCanvas); mobileInvadersMidlet.gameCanvas.start(); }
Uma coisa que você deve ter em mente é que o celular é um aparelho diferente de um videogame. Apesar de poder rodar jogos, ele não foi feito exclusivamente para isso, nem tampouco isso é a prioridade de seu processador (mesmo no N-Gage, apesar de ser difícil acreditar nisso). Existem eventos de rede que têm maior prioridade sobre os aplicativos, obrigando o programador a prever pelo menos o evento de maior importância: Incoming Call (recebimento de chamada). No momento do recebimento de uma ligação os aparelhos multitarefa, por exemplo, permitem que o foco do programa seja perdido, porém a aplicação não é finalizada e fica rodando em background. Outros tipos de aparelhos precisam fechar a aplicação para receber a chamada, e isso será realizado sem que o usuário seja questionado sobre a opção de salvar o estado atual do jogo. Você deve saber como é o comportamento do aparelho para o qual você está programando para definir sua estratégia para lidar com isso. No nosso caso, os aparelhos série 60 são multitarefa, temos apenas que terminar a thread do jogo para diminuir o consumo WebMobile 63
wm01.indb 63
7/1/2005 20:00:21
}
7. Código do método turnoDeJogo() da classe Engine
} }
public void turnoDeJogo() { }
jogador.atualizar();
for (int i = 0 ; i < MAX_BULLETS ; i++) { if (bullets[i].ativo) {
8.Código para iniciar a thread e o método run(). Esse segmento encontra-se na classe GameCanvas
bullets[i].atualizar(); }
public static final int TICK = 80;
} //Método run da thread do jogo. for (int j = 0; j < MAX_ENEMIES ; j++) { if (enemies[j].ativo || enemies[j].explodindo) { enemies[j].atualizar(); }
//Chama o método turnoDeJogo para atualizar os sprites. //Repinta a tela. //Espera o tick para manter o fps constante. public void run() {
}
while(running) { inicio = System.currentTimeMillis();
for (int k = 0; k < LINES_OF_ENEMIES ; k++) { for (int j = 0; j <
keyLocked = false;
ENEMIES_PER_LINE ; j++) {
engine.turnoDeJogo();
enemies[j + k * ENEMIES_PER_LINE].velocidadeX =
repaint();
velocidadeDaLinha[k];
this.serviceRepaints();
}
tempo = System.currentTimeMillis() - inicio;
}
if (tempo > TICK) {
for (int i = 0 ; i < MAX_BULLETS ; i++) {
} else {
continue;
if (bullets[i].ativo) {
try {
if (bullets[i].dono instanceof Personagem) {
Thread.sleep(TICK - tempo);
for (int j = 0; j < MAX_ENEMIES ; j++) {
} catch (InterruptedException ie) {
if (enemies[j].ativo) {
}
if (bullets[i].colide(enemies[j]))
}
{
} bullets[i].killBullet();
}
enemies[j].killEnemy(); } }
//Método start para criar a thread do jogo. public void start() {
}
this.gameThread = new Thread(this);
} else {
running = true;
if (bullets[i].colide(jogador)) {
gameThread.start();
gameOver = true; }
gameThread.setPriority(Thread.MAX_PRIORITY); }
64 1º Edição
wm01.indb 64
7/1/2005 20:00:23
Jogos
de energia e processamento e, parar a movimentação dos sprites (para que o jogador não se depare com uma tela de Game Over quando retornar da ligação). Quando o GameCanvas perde o foco, o método hideNotify() é chamado. A 9 mostra esse método e os métodos pausar() e despausar().
Como melhorar o jogo Inicialmente, a colisão do sprite do Personagem pode ser melhor elaborada. Se você jogar algumas vezes, irá perceber que às vezes a nave do jogador é atingida sem que o tiro realmente esteja sobreposto a nave. Isso porque a detecção da colisão foi feita utilizando um retângulo completo. Na 9 damos algumas idéias de como poderia ser feito para melhorar este efeito. A inteligência artificial do jogo também poderia ser melhorada. As naves inimigas poderiam atirar apenas se a nave do jogador estivesse na mira, ou, ainda melhor, poderiam tentar cercar a nave do jogador com tiros em ambos os lados, elaborando uma armadilha. Você poderia tentar implementar também novas fases, incluindo um sistema de pontuação e incrementando a dificuldade a cada nova fase. Isso pode ser atingido aumentando-se o número de inimigos, o número de balas que eles atiram, aumentando a sua velocidade ou mesmo diminuindo o número máximo de tiros que o jogador pode atirar. Veja que todas essas sugestões não envolvem a criação de novos elementos no jogo, de forma que são bastante simples de se implementar. Entretanto, a criação de novos elementos no jogo não deve ser descartada. Talvez alguns elementos de cenário, novas naves inimigas ou alguns itens possam ser interessantes.
Outras abordagens A abordagem apresentada aqui (com a utilização de uma classe Sprite) não é a única possível. Um jogo simples como este com certeza poderia ser desenvolvido utilizando programação estruturada (mesmo em Java), criando-se apenas as duas classes necessárias (o Midlet e o GameCanvas) e concentrando tudo nessas classes. Os sprites na tela, ao invés de serem objetos capazes de decidir por si mesmos, poderiam ser representados por um array de posições e gerenciados pela lógica do jogo, implementada também na classe GameCanvas. Com certeza isso funcionaria e, neste exemplo específico, poucos usuários iriam perceber diferenças na implementação. Entretanto, um código elaborado dessa forma tem mais chances de ficar muito complexo, difícil de manter e modificar. De fato, você já deve ter ouvido falar que “para desenvolvimento de jogos em celular, não deve ser utilizada programação orientada a objetos, preferindo-se a opção da programação estruturada” por criar poucos objetos e economizar processamento e heap. Isso é verdade, mas não se deve tomá-la de forma radical. Não significa que você tenha que criar apenas duas classes em seu programa. Isso significa que é preferível optar por dois atributos
de posição (int x e int y) para a classe Sprite do que utilizar um objeto Dimensão que possui dois atributos. A modificação direta de atributos, sem setters e getters, é mais rápida, além de não dificultar o entendimento e manutenção do código. Você deve evitar utilizar objetos desnecessariamente, mas não precisa sacrificar o código por conta disso. Além disso, com o crescente poder de processamento dos aparelhos atuais (os smartphones da série 60 são um bom exemplo), eles são capazes de rodar programas até mesmo com centenas de classes. E isso é fato, nós testamos. A essa altura, você deve ter notado que falamos muito em “entendimento do código” e “manutenção do código”. Isso porque em jogos mais complexos, é comum que o código cresça e pode
9. Métodos para lidar com eventos externos. Esse segmento encontra-se na classe GameCanvas //Quando o canvas volta a ter o foco, não faz nada. Se //estiver pausado, espera o jogador pressionar o botão de //pause. protected void showNotify() {
}
//Pausa o jogo quando o canvas perde o foco. protected void hideNotify() { pausar(); }
//Para a thread para pausar o jogo. protected void pausar() { running = false; }
//Reinicia a thread para voltar o jogo. protected void despausar() { start(); }
9. Formas de implementar a região de colisão. A forma utilizada é a primeira (à esquerda).
WebMobile 65
wm01.indb 65
7/1/2005 20:00:24
acontecer que, ao adicionar um novo elemento, ele afete várias outras partes do código que já haviam sido desenvolvidas, forçando você a rever todo o código. Isso dificulta bastante o processo já complicado do debug. Como o aparelho não tem um console, para você ver a saída do System.out.println(), você deve optar por outras formas de realizar o debug. Embora o emulador suporte o console, facilitando em parte a vida do desenvolvedor, o teste no aparelho tem que ser realizado; você irá notar que é um mundo bastante diferente. Outra coisa que este entendimento e manutenção afeta é o “e se”. Você fez todo o seu jogo, já está para terminar, e alguém na equipe ou algum play tester fala: “e se a nave se transformasse em um robô gigante pacifista e invencível?”. Pronto. Você já está com o jogo quase pronto e vem alguém com uma idéia que precisaria reestruturar boa parte do jogo novamente. Esses “e ses” podem ser evitados trabalhando bastante na concepção do jogo. No entanto, é natural que novas idéias surjam no decorrer do desenvolvimento. E, embora você tenha que ser bastante cético com relação a elas, não pode ser tão radical, pois pode ser que uma idéia relativamente simples de se implementar melhore bastante a versão final do jogo.
Conclusão O jogo apresentado é simples, porém é um bom exemplo pois demonstra os conceitos básicos do processo de criação de jogos para celulares. Além disso, mostrou alguns erros que podem ocorrer durante esse processo. Com as dicas, esperamos motivar o leitor a corrigir estes erros e desenvolver seus próprios jogos.
Agradecimentos Os autores agradecem a Camila Hott (camilahott@yahoo.com. br) por ter feito toda a arte para o Mobile Invaders. Camila Hott é a designer do projeto Inova Mobile O grupo Inova Mobile é formado por professores e alunos da Universidade de Brasília, voltado para o desenvolvimento de aplicativos para o ambiente móvel, entre jogos, aplicações clienteservidor e ferramentes (API`s) para auxílio no desenvolvimento dos primeiros.
Guia do Forum Nokia sobre jogos www.forum.nokia.com/main/0,6566,050_10,00.html Página oficial do J2ME http://java.sun.com/j2me/index.jsp Download do Wireless Toolkit 2.2 http://java.sun.com/products/j2mewtoolkit/download-2_ 2.html Emulador: Series 60 MIDP Concept SDK Beta 0.3.1, Nokia Edition www.forum.nokia.com/main/0,6566,034243,00.html NetBeans IDE www.netbeans.org
Eduardo Peixoto (eduardopfs@gmail.com) faz parte do Grupo InovaMobile e é desenvolvedor Java especializado em MIDP. Está disputando com o Renato quem termina San Andréas primeiro.
Renato Faria Iida (renatoiida@gmail.com) faz parte do Grupo InovaMobile. Desenvolvedor Java há mais de três anos e vem se especializando em MIDP desde o começo de 2003.
Faça o download no site: www.portalwebmobile.com.br/revista/ed1
66 1º Edição
wm01.indb 66
7/1/2005 20:00:39
N
osso objetivo neste artigo é proporcionar ao desenvolvedor uma visão geral das tecnologias disponíveis para o sincronismo de dados das aplicações Palm. Veremos também os meios de transmissão de dados que podem ser utilizados, suas características, benefícios e cuidados necessários, de forma que o desenvolvedor possa utilizar este conhecimento na definição e desenvolvimento de suas aplicações. Porém, antes de falarmos sobre sincronismo de dados, faremos uma breve introdução ao Palm e às ferramentas usadas para desenvolvimento.
Onde tudo começou Equipamentos que poderiam ser levados a qualquer lugar, armazenar as mais diversas informações e que, com poucos toques estariam à mão. Este foi o primeiro conceito dos assistentes digitais na década de 90. Nesta época havia uma variedade de agendas eletrônicas com funções estáticas, mas que atendiam as necessidades da época. Alguns, no entanto, sentiam-se limitados pelas características destas “maquininhas” e queriam mais, eles achavam que estas “agendas” deveriam ter recursos que as fizessem adaptar às necessidades específicas de cada pessoa e uma das primeiras empresas a investir em uma máquina deste tipo foi a famosa Apple Computer, com seu equipamento Newton. Jeff Hawkins, que na época desenvolvia softwares para o Newton e também para outros equipamentos portáteis, acreditava que estas pequenas e limitadas máquinas poderiam um dia substituir os computadores que cada pessoa usava regularmente em seu escritório ou residência. Em 1994, Jeff Hawkins projetou um equipamento portátil e com a ajuda de três investidores fez com que sua empresa, a Palm Computing, fosse o início da revolução dos computadores portáteis de uso pessoal e corporativo, tal como conhecemos hoje. Em 1995, a USRobotics, maior fabricante de Modems dos Estados Unidos, comprou a Palm Computing e dirigiu o lançamento do Palm Pilot em 1996, equipamento este que vendeu como nenhum outro modelo da época, um sucesso absoluto. Já em 1997, a 3Com, que desenvolve equipamentos e soluções para conectividade, adquiriu a USRobotics e lançou uma linha de equipamentos portáteis que se tornaram a vedete no mercado
Sincronismo no Palm: comunicação e tecnologias
por Marcio Alexandroni
67 1º Edição
wm01.indb 67
7/1/2005 20:00:41
PDA’s mundial, até que o segmento que fabricava o equipamento Palm se tornou uma empresa independente, a Palm Inc. O sistema operacional PalmOS, aprimorado pela Palm Inc., teve tanto sucesso que outros fabricantes como Sony, TRG, HandEra, Symbol, entre muitos outros, decidiram utilizá-lo em seus equipamentos proprietários. A Palm Inc. decidiu dividir seu segmento de atuação criando a PalmSource (www.palmsource.com) somente para implementar o sistema operacional PalmOS e licenciá-lo a outros fabricantes e a PalmOne (www.palmone.com), para produzir os equipamentos Palm. Palm, equipamento que se enquadra na família de “PDAs”, ou Personal Digital Assistants (Assistentes Pessoais Digitais), foi utilizado inicialmente como uma “agenda melhorada”, pois os aplicativos que acompanhavam o equipamento na época eram muito superiores aos de qualquer agenda disponível no mercado. Com os aplicativos nativos, address book (agenda de endereços e contatos), calculadora, date book (compromissos), memo pad (anotações) e note pad (bloco de notas), os usuários podiam armazenar uma quantidade muito grande de informações, superior às antigas agendas disponíveis no mercado, e com qualidade de apresentação e interface mais amigável. O sistema de entrada de dados disponível no Palm chama-se Graffiti, onde as letras e números têm um local próprio para que o usuário as escreva (escreva mesmo!). A capacidade de reconhecimento de escrita é surpreendente e a tecnologia foi utilizada até por equipamentos que utilizam outros sistemas operacionais, como o PocketPC, que a partir da versão 2002, possui um modo de entrada de dados similar ao Graffiti do Palm. Os Palms mais recentes já operam com o “Graffiti 2”, uma variação do sistema de entrada de dados Graffiti original que torna a entrada de algumas letras mais próxima da escrita manual. Utilizando inicialmente um processador Motorola DragonBall de até 33MHZ (modelos até o PalmOS versão 4.1), o Palm não era tão poderoso em termos de processamento, mas seu sistema operacional sempre foi tão pequeno e rápido que compensava a velocidade do processador. Este processador Motorola pertence à família 68000, uma das mais antigas tecnologias desenvolvidas pela empresa e conhecida de muitos desenvolvedores. Os modelos de Palm a partir do Tungsten T utilizaram processador Texas com tecnologia ARM e velocidades muito superiores, partindo de 175MHZ, combinado com o lançamento de uma nova versão do sistema operacional PalmOS, a tão esperada versão 5 com BlueTooth, e outras melhorias. Os equipamentos mais novos operam com processadores Intel XScale. O PalmOS versão 6 (codinome Cobalt) tem previsão de lançamento em 2005, com novos recursos e ainda mais poderoso, mas o melhor de tudo é que ele continuará executando qualquer aplicação desenvolvida para versões anteriores do PalmOS, sem necessidade de recompilação. O fato do equipamento ter uma memória relativamente pequena (os modelos mais antigos tem 2MB, os mais novos 32MB e 64MB, podendo atingir mais de 100MB de RAM) não é fator limitante. As aplicações Palm são extremamente pequenas. Só para
ter uma idéia, uma solução para uso em campo tem em média 100KB quando desenvolvida com uma linguagem de programação que gera executáveis nativos da plataforma. Existem vários periféricos que podem ser acoplados ao Palm como: modems, impressoras portáteis, equipamentos GPS e mais recentemente telefones celulares com Palm incorporado. A Kyocera foi a primeira fabricante de um telefone celular com Palm totalmente compatível e incorporado ao produto. Hoje, são diversos modelos, de vários fabricantes. Aplicações podem acessar os recursos do telefone para enviar e receber dados, sem a necessidade de conexão de qualquer periférico adicional e realizar transmissão de dados utilizando as tecnologias mais modernas de alta velocidade. O mercado corporativo, de olho em toda esta revolução, entendeu que estes computadores portáteis poderiam proporcionar-lhes um ganho de produtividade em atividades onde a coleta externa de informações, aliada à necessidade de permanecer em contato com o escritório central eram demoradas ou repletas de falhas, pois utilizavam processos manuais como papel, fax ou uso constante do telefone. Quem nunca viu um vendedor externo passando pedidos por telefone à sua central, ou ainda aquela pilha de fax para a central de digitação, que nunca entende a letra do vendedor... A demanda por aplicações que envolvem esta tecnologia exige que o desenvolvedor se atualize para estar apto a desenvolver aplicações na plataforma Palm e escolha uma ferramenta de desenvolvimento adequada. Costumo dizer que não existe “a melhor ferramenta para desenvolver”, mas existem opções e recursos que devem ser considerados: As plataformas móveis ainda não têm poder de processamento e armazenamento como os desktops. Portanto, é importante que uma ferramenta possa tirar o maior e melhor proveito da plataforma, utilizando todos os recursos disponíveis pelo processador e sistema operacional. É importante que a ferramenta possa gerar um código que garanta a sua utilização em versões futuras do sistema operacional, não tornando o código obsoleto quando uma nova versão do sistema operacional for liberada. Em busca das características acima, temos dois grandes grupos de ferramentas: As que suportam todos os recursos do sistema operacional, portanto tem garantia de suportar os dois itens listados acima; As que têm runtime e geram executáveis interpretados e que dependem de atualização do fabricante para que possam funcionar plenamente na nova versão do sistema operacional. Para o Palm, as ferramentas que suportam nativamente os recursos do sistema operacional e geram executáveis sem runtime são: CodeWarrior, PocketStudio, GCC (compilador free baseado em C/C++ que não tem IDE, mas existem IDEs para adquirir no WebMobile 68
wm01.indb 68
7/1/2005 20:00:43
mercado) e HB++. As ferramentas mais utilizadas que têm runtime são NSBasic, Satellite Forms, Java (J2ME e SuperWaba) e AppForge/MobileVB. Nada contra qualquer dessas ferramentas, desde que atenda às necessidades do desenvolvedor para seu projeto específico, principalmente no que diz respeito ao suporte aos recursos do equipamento e necessidades dos clientes.
Sincronismo de dados O desenvolvimento de sistemas segue o tradicional ciclo de análise, projeto, codificação e testes. No desenvolvimento de aplicações para Palm, essa abordagem também pode ser aplicada, mas existe um outro fator que deve ser levado em conta: a aplicação será executada remotamente e necessita que os dados sejam integrados aos sistemas já existentes na empresa. Ou seja, é importante que o desenvolvedor tenha ciência da importância do sincronismo de dados para a sua aplicação, fator esse muitas vezes ignorado por iniciantes na computação móvel. A importância do sincronismo está no fato dele poder representar boa parte do esforço no desenvolvimento da solução e assim representar uma parcela grande dos custos de desenvolvimento. Outro fator de igual importância a ser observado é que a definição incorreta das tecnologias ou meios de transmissão utilizados pela aplicação pode levar ao fracasso na utilização desta aplicação pelo cliente ou ainda obrigá-lo a tomar atitudes reativas a problemas não previstos, causando transtornos a todos os envolvidos no processo. Há outro fator fundamental: o desenvolvedor deve possuir sólido conhecimento sobre as opções para sincronismo dos dados. Ou seja, o desenvolvedor deve ter a habilidade de negociar com o cliente e dimensionar a quantidade de informação necessária para o bom funcionamento da aplicação no Palm. Recursos como disponibilizar todas as duplicatas abertas e pagas na aplicação Palm podem parecer um benefício para a tomada de decisão de um usuário ou gerente de vendas, mas impacta diretamente no volume de dados a serem sincronizados, elevando o custo e complexidade do sincronismo. Neste caso, o uso apenas das informações extremamente relevantes é aconselhável uma vez que consumirá muito menos espaço físico no equipamento e claro, o sincronismo será mais rápido, simples e com custo menor.
Conexão e transmissão de dados Para poder se conectar a um serviço de comunicação de dados como internet ou RAS (Serviço de Acesso Remoto), o Palm necessita de um equipamento externo (aparelho celular ou modem) ou comunicação via base de sincronismo. A seguir, comentamos sobre os principais meios de conexão e transmissão de dados disponíveis para o Palm. Telefonia móvel celular A utilização da telefonia móvel celular para transmissão de dados pelo Palm pode ser a única solução em situações onde o usuário atua em locais variados, e permanece distante do seu
escritório ou base por longo período. No entanto, é preciso observar que a telefonia móvel celular está sujeita à cobertura das operadoras e pode estar ausente em regiões onde o usuário atua. Mais um fator importante a analisar é o custo da comunicação. Hoje, as operadoras oferecem planos corporativos em minutos ou ainda em quantidade de dados transmitidos (por KB ou MB), portanto o desenvolvedor deve analisar o volume de transmissão de dados em função dos dados manipulados pela aplicação e procurar encontrar o custo de transmissão pelas diversas operadoras que oferecem o serviço. A qualidade da comunicação de dados também deve ser avaliada. Nos grandes centros e capitais do Brasil, há disponibilidade das mais recentes tecnologias em transmissão de dados via celular, mas no interior e em regiões afastadas, normalmente é encontrada uma baixa qualidade na comunicação, quando ela está disponível. Os serviços de transmissão de dados em alta velocidade (GPRS/EDGE – para operadoras GSM, 1xRTT – para operadoras CDMA) podem não estar disponíveis em determinadas áreas de cobertura da operadora, obrigando a utilização da discagem para um provedor ou diretamente a um serviço de comunicação remota do cliente, tornando a comunicação mais cara. As formas de comunicação do Palm com o aparelho celular também devem ser alvo da análise do desenvolvedor. Há modelos Palm com o conhecido conector universal que permite a ligação direta do Palm a um aparelho celular via cabo de comunicação. Temos ainda duas alternativas para conectar o Palm a um aparelho celular: Bluetooth e Infravermelho. Bluetooth seria a melhor alternativa em termos de velocidade e praticidade na comunicação, mas financeiramente menos viável, pois os Palms que têm a tecnologia Bluetooth incorporada são bem mais caros se comparados aos modelos com melhor custo/benefício. A mesma situação encontramos para os aparelhos celulares, pois os modelos com Bluetooth são caros e se o cliente não conseguir os aparelhos em comodato com a operadora, terá um custo inicial de aquisição alto. A transmissão por infravermelho tem custo menor, pois todos os Palms no mercado têm essa porta de comunicação já incorporada e há diversas alternativas em modelos de aparelhos celulares para esta finalidade. O problema maior deste tipo de comunicação é a velocidade de transmissão dos dados, pois além da lentidão na comunicação infravermelho do Palm com o celular, se a velocidade de transmissão de dados da operadora for baixa, o que é comum fora dos grandes centros onde a transmissão padrão ocorre a 9600 bps, pode tornar a solução inviável. Esta situação é em geral o pior caso de sincronismo. A melhor forma de utilização de Palm em conjunto com celular são os modelos que integram Palm e celular, como o Tungsten W, ainda disponível em algumas operadoras e o recém lançado Treo 600, um bom equipamento para uso corporativo e pessoal, com excelente memória e conectividade. Neste tipo de comunicação, o Palm aproveita ao máximo os recursos de transmissão de dados
69 1º Edição
wm01.indb 69
7/1/2005 20:00:45
PDA’s da operadora (no caso o GPRS (serviço de comunicação de dados em alta velocidade disponível nas operadoras GSM), pois não precisa se comunicar com equipamentos externos; tudo é feito pelo próprio equipamento. Além disso, não é necessária nenhuma configuração no equipamento, pois o serviço de rede GPRS já vem configurado no cartão SIM (cartão adquirido na operadora que habilita o celular). Telefonia fixa A utilização da telefonia fixa para sincronismo dos dados é uma das mais atraentes para o cliente, pois o custo da comunicação é relativamente baixo e a qualidade é superior à da comunicação por celular, mesmo com a necessidade de aquisição de um modem externo. O cliente pode optar pela utilização de provedores de acesso a internet que tenham telefones de acesso nas áreas atendidas pelos seus usuários, possibilitando o uso de comunicação local pagando apenas os pulsos utilizados durante a conexão, e se a ligação for feita em horários com tarifa reduzida (durante a madrugada ou finais de semana), o custo será ainda mais baixo. Vale destacar também que o custo dos provedores não é mais um impedimento hoje em dia. Por causa do grande número de provedores em todas as regiões do Brasil; basta escolher os provedores que oferecem o melhor serviço e pontos de acesso nas localidades onde o cliente atua. A utilização de serviços 0800 para comunicação direta com a central do cliente pode ser uma boa escolha para locais remotos onde não há provedores de internet, mas deve ser aplicado com cautela, pois o custo do serviço não é muito baixo e dependendo do volume de dados transmitidos e da freqüência de comunicação, este serviço pode ser bastante oneroso ao cliente. A facilidade de utilização da telefonia fixa também é atraente, visto que o usuário pode utilizar a linha telefônica em sua residência, hotel, ou ainda pedir licença ao estabelecimento onde está visitando para transmitir as informações dali mesmo. Claro, nesta última situação o ideal é que a comunicação seja realizada para um serviço 0800, para não causar ônus ao estabelecimento. Os modems disponíveis para utilização em conjunto com o Palm em telefonia fixa são: PalmModem (http://store.palmone.com/product/index.jsp? productId=1164335&cp=1308826): os modelos Palm com conector universal podem utilizar este equipamento para transmissão de dados, com a vantagem de estarem fisicamente conectados (o Palm se encaixa sobre o PalmModem). Assim não há perda de velocidade na comunicação com o modem. Modems por Infravermelho Pegasus III (www.3jtech.com/ infrared_modems.htm) e ICC (www.icc.com.br): estes modems se comunicam a 56kbps, mas a comunicação de dados costuma ser mais lenta do que com o PalmModem, pois há perda de velocidade na comunicação infravermelho do Palm com o modem. Ainda assim, a utilização é válida nos modelos Palm que não dispõem do conector universal.
Cartões SD/MMC Cartões de memória SD/MMC (Secure Digital e MultiMedia Card) são utilizados para expansão da capacidade de armazenamento do Palm, mas podem ser uma solução interessante em casos onde o volume de informações armazenadas no Palm seja muito grande ou a atualização total dos bancos de dados da aplicação desenvolvida seja realizada com freqüência e, portanto, com custo alto de sincronismo. Wi-Fi (Redes sem fio 802.11) As redes sem fio estão se tornando um padrão na comunicação entre os computadores e no Palm não é diferente. Dentre os padrões existentes, o Wi-Fi (rede 802.11) é o mais utilizado no mundo. No Brasil, existe cobertura de rede sem fio em alguns estabelecimentos comerciais, principalmente em grandes centros, e aeroportos. Sincronismo via base ou cabo O Palm pode fazer uso da conexão de rede ou internet de um computador através da utilização de softwares que realizam uma “ponte” entre a base ou cabo do Palm com o sistema de rede do computador. Estes softwares são conhecidos como “Gateways” e entre eles, podemos citar o Mocha W32 PPP (www.mochasoft.dk) para bases e cabos seriais e o Softick PPP (www.softick.com) para bases e cabos USB. Se o usuário tiver um computador com acesso à internet, não há necessidade de aquisição de modem externo para o sincronismo, apenas a aquisição do software apropriado ao seu equipamento e a velocidade de transmissão será a mesma suportada pelo computador ao qual o Palm está conectado. Se a conexão do desktop à internet for via ADSL, rádio, cabo ou outro serviço de banda larga, o sincronismo será muito rápido e com custo muito baixo, visto que os programas citados acima custam menos de US$ 25 e o usuário já faz uso do serviço de banda larga em sua residência. Este tipo de conexão pode ser interessante até mesmo em escritórios regionais ou bases do cliente onde os usuários estejam localizados.
Tecnologias para sincronismo de dados As tecnologias para sincronismo de dados estão relacionadas com os protolocos e formas de envio e recebimento de dados que podem ser aplicados ao Palm. A escolha do tipo de tecnologia deve ser feita em função da necessidade do cliente e não é difícil encontrar situações onde duas ou mais tecnologias necessitam ser utilizadas, o que pode resultar na situação já descrita anteriormente na qual o desenvolvimento do sincronismo tome mais tempo do que o da aplicação. Algumas das tecnologias listadas abaixo não estão disponíveis para todas as ferramentas de desenvolvimento. As que possuem interface aberta ao acesso a bibliotecas, como PocketStudio, CodeWarrior e NSBasic, têm suporte a todos estes produtos. Se você usa outras ferramentas de desenvolvimento, é melhor consultar o fabricante. WebMobile 70
wm01.indb 70
7/1/2005 20:00:47
HotSync A tecnologia padrão do Palm para sincronismo de dados é o HotSync, mas recomendamos esta solução apenas para sincronismo de dados local (base ou cabo), pois o HotSync remoto, apesar de possível, é limitado e lento. Limitado, pois o HotSync é um processo monousuário, ou seja, apenas um Palm pode se conectar de cada vez, e lento porque a autenticação dos Palms é demorada e a transmissão dos dados se dá registro a registro. Em um banco de dados com muitos registros (digamos 5000 registros em diante), o sincronismo realizado registro a registro toma muito tempo de transmissão, acarretando em custos altos. O HotSync pode executar duas operações: Copiar aplicações (arquivos PRC) e bancos de dados do Palm (arquivos PDB) de/para o Palm durante o sincronismo, e; Executar programas externos conhecidos como “Conduits”, que são DLLs que o desenvolvedor cria e registra no HotSync para realizar tarefas específicas de acesso direto a bancos de dados no Palm e na sua fonte de dados no desktop ou servidor durante o sincronismo.
Acesso on-line a dados O PalmOS, sistema operacional dos equipamentos Palm, não tem suporte interno a acesso a dados em um servidor remoto como bancos de dados relacionais e arquivos de dados em qualquer formato. Por isso, o desenvolvedor deverá optar por: Customizar a transmissão usando sockets: ferramentas como PocketStudio, CodeWarrior, NSBasic e Java podem se comunicar com um servidor utilizando o protocolo TCP/IP. O desenvolvedor pode criar um protocolo de troca de dados escrevendo um servidor e um cliente de comunicação TCP/IP. Essa abordagem, no entanto, é complexa e indicada a desenvolvedores mais experientes. Utilizar bibliotecas específicas: existem produtos de comunicação remota como o ASTA (www.astawireless.com), que permitem a criação mais rápida de aplicações que necessitam de acesso online a dados. Elas são formadas por um conjunto de funções para se comunicar com um servidor de comunicação, que faz a integração dos dados do Palm a um banco de dados relacional.
Uma alternativa às limitações do HotSync é utilizar o computador na casa do usuário ou no escritório remoto do cliente, escrevendo um Conduit que se comunique via internet. Nesta solução, o Palm do usuário não se conectará diretamente à empresa, mas diretamente via base ou cabo a um computador para que o sincronismo seja realizado, contornando a lentidão do HotSync do Palm. Os dados transferidos podem ser enviados ao banco de dados da empresa pela aplicação Conduit criada pelo desenvolvedor, utilizando as técnicas mais adequadas para transmissão de dados.
e-mail Uma forma pouco utilizada de sincronismo é o envio de arquivos anexados em e-mails, pois há poucos programas de e-mail com a capacidade de enviar anexos (um deles é o VersaMail da PalmSource). Outro ponto negativo é o “overhead” dos controles incorporados ao protocolo de envio de mensagens eletrônicas e o limite no tamanho do anexo. Outro fator contrário à sua utilização é que o e-mail necessita de intervenção manual do usuário, tanto para anexar o que deve ser enviado, quanto para receber e salvar o que foi recebido, a não ser que o programa de e-mail tenha uma interface aberta onde a própria aplicação no Palm possa automatizar estas tarefas, e a ferramenta de desenvolvimento suporte o uso da interface.
FTP (File Transfer Protocol) FTP é uma das soluções mais baratas em sincronismo de dados disponível para o Palm, e uma das mais utilizadas atualmente. Softwares para o servidor FTP estão disponíveis nativamente nos sistemas operacionais Linux e Windows 2000/2003 e, há softwares gratuitos como o GuildFTPd (www.softick.com) que rodam também no Windows XP. Para acessar o servidor FTP através do Palm, o desenvolvedor pode optar por um software gratuito como o LFTP (www.palmgear. com) ou ainda soluções mais elaboradas como o SyncAnywhere, produto da Cialogica (www.cialogica.com) que combina a compactação de vários bancos de dados em apenas um banco compactado, otimizando a transmissão. O SyncAnywhere possui também comandos para transmissão de dados por FTP, acionados a partir da aplicação Palm, permitindo que o desenvolvedor crie soluções completas sem necessitar que o usuário deixe sua aplicação. A preparação dos dados para envio e o processamento dos dados recebidos, devem ser feitos por processos executados periodicamente no servidor FTP. O mais comum é que os arquivos a serem transmitidos ao Palm e os arquivos recebidos do Palm sejam colocados no servidor FTP em períodos que não haja conexão de usuários (na madrugada, por exemplo).
Conclusão A transmissão de dados é um dos fatores que determina o sucesso da aplicação Palm criada pelo desenvolvedor. Com estas informações, esperamos ter contribuído para que suas aplicações sejam completas tanto no funcionamento quanto no sincronismo dos dados. Visitem nosso site, estamos sempre publicando novos artigos para os desenvolvedores em computação móvel; o endereço é www. clubepda.com.br. Um abraço e até uma próxima oportunidade!
Marcio Alexandroni, marcio@clubepda.com.br (www.clubepda.com.br)
71 1º Edição
wm01.indb 71
7/1/2005 20:00:49
por Equipe WebMobile
S
e analisarmos os aparelhos celulares e os serviços oferecidos por eles desde a década de noventa, percebemos nitidamente a evolução tecnológica ocorrida nesse mercado. Constantemente somos surpreendidos com o surgimento de novas funcionalidades que buscam facilitar as nossas atividades cotidianas e oferecer novos meios de entretenimento. Jogos para celular, que são os principais representantes da categoria de entretenimento, estão presentes desde os primeiros modelos lançados no mercado. Com o avanço dos celulares, foi possível o desenvolvimento de jogos mais evoluídos, o que possibilitou o surgimento de um mercado cada vez mais ativo para esse tipo de produto. A seguir, apresentaremos uma entrevista com Marcelo Nunes de Carvalho, diretor de tecnologia da Devworks (www.devworks.com.br), uma empresa bastante atuante no mercado para desenvolvimento de jogos voltados para web e celulares. Ele comentará suas perspectivas para o mercado de jogos portáteis e as novas tendências. Marcelo Nunes de Carvalho é formado em Engenharia de Computação no ITA e possui Mestrado em Inteligência Artificial na USP. Ele trabalha há 4 anos como diretor da Devworks, participando do desenvolvimento de vários jogos.
Entrevista M a rc e l o N u n e s d e C a r va l h o 72 1º Edição
wm01.indb 72
7/1/2005 20:01:18
Entrevista
WebMobile - Como surgiu o seu interesse pelo mercado de jogos? Marcelo Nunes: O meu interesse já existia desde muito novo quando comecei a desenvolver jogos. Não tinha a expectativa que conseguiria trabalhar com isso, mas vislumbrei a oportunidade no momento certo. WM - Qual a posição do mercado brasileiro relativo a jogos para web e para celular? Como estamos posicionados considerando o cenário mundial? MN: Já existe um mercado considerável para a web, mas o mercado de celular ainda é iniciante. O Brasil está hoje fora do circuito mundial de jogos, mas esse cenário tende a mudar nos próximos anos. WM - Vamos falar um pouco mais sobre jogos para celular. Qual é o principal modelo de negócio utilizado por vocês no mercado de jogos para celular? Para o usuário ter acesso a um jogo é necessário que a operadora o disponibilize e cobre pelo serviço, ou é possível fazer o download dos jogos diretamente para o celular? MN: Começamos produzindo jogos sob demanda para as fabricantes. Só depois entramos no modelo de compartilhamento de receita com as operadoras. Os investimentos em marketing ainda são pequenos bem como os números de downloads. O usuário poderia até baixar jogos diretamente, mas o modelo principal é acessar o portal da própria operadora. WM - Estão surgindo no mercado cursos com objetivo de formar desenvolvedores de jogos. Na sua opinião, qual seria o perfil de um desenvolvedor de jogos? Os profissionais formados em cursos de computação tradicionais têm dificuldade em se adaptar a esse tipo de desenvolvimento? MN: O segmento de desenvolvimento de jogos precisa de profissionais parecidos com o de outras áreas. Profissionais criativos, com grande conhecimento técnico, capacidade de aprendizado e de trabalho em equipe são os mais procurados. Alguém formado em computação pode ter essas características. WM - Que tipo de jogo você acha que atrai mais a atenção do público? MN: Para celular, são os jogos mais simples. O público é muito casual e prefere jogos fáceis e rápidos. WM - O que uma pessoa interessada em entrar nesse mercado deve fazer? Que tipo de tecnologia deve dominar principalmente? Quais as mais conhecidas e utilizadas para desenvolvimento de jogos para dispositivos móveis?
MN: Conhecimento em Java e C++ já ajuda bastante. As tecnologias existentes para celular são baseadas nessas linguagens. As que se destacam são J2ME e BREW. WM - Devido às características de um celular, quais são as principais diferenças que devem ser levadas em conta quando se cria um jogo para esse tipo de plataforma, em comparação com os criados para consoles ou PC? MN: Utilização de recursos deve ser otimizada (memória, processamento, etc). É preciso também considerar as diferençar entre aparelhos para facilitar a portabilidade. WM - Sabemos que jogos 3D exigem um grande poder computacional da plataforma que o estiver executando. Você acha que com o advento dos SmartPhones, celulares com novos tipos de funcionalidades e com um maior poder de processamento, ficará possível e viável a criação desse tipo de jogo? MN: A criação desses jogos 3D já é viável. O problema é que eles utilizam poucos polígonos e isso prejudica sua qualidade final. A tendência é que o processamento dos celulares aumente e com isso os jogos devem melhorar. WM - A maioria dos jogos para celular que vemos hoje são single player. Como você vê o desenvolvimento de jogos multi-player? MN: A tecnologia é similar à internet. Na Devworks, já temos desenvolvida a tecnologia que permite jogar jogos multiplayer, inclusive de uma plataforma para outra diferente (celular contra PC, por exemplo). É algo que acabará se popularizando com o tempo. WM - Como montar uma equipe para desenvolvimento de jogos? Quais perfis considera essenciais? MN: Montar uma equipe exige um grande conhecimento do processo de produção de um jogo. Em geral, conhecer o tipo de jogo também ajuda. Alguns setores exigem a presença de especialistas (ex: inteligência artificial) e outras podem ser desenvolvidas por programadores comuns. WM - Fale-nos um pouco sobre como vocês desenvolvem jogos na DevWorks? Quais pontos do processo de desenvolvimento você destacaria como fundamentais para o sucesso de um jogo? MN: Um dos pontos principais é conhecer o público-alvo. Isso permite que os jogos sejam corretamente elaborados. Desenvolvemos jogos para o público e não para nós mesmos e isso precisa ficar claro para evitar erros grosseiros na criação. A questão do processo de produção, incluindo a documentação, também ajuda a garantir que o desenvolvimento flua sem surpresas em termos de prazos e custos.
WebMobile 73
wm01.indb 73
7/1/2005 20:01:21
WM - O surgimento de jogos que venham a entreter realmente um grande número de pessoas envolve muita criatividade. De onde são extraídas idéias para a criação de um novo jogo? Como ocorre o processo de criação de um novo jogo? MN: Na Devworks, fazemos sempre reuniões para gerar inúmeras idéias. Após essa etapa, começamos a filtrar para se adequar ao desenvolvimento em questão. É importante aproveitar a criatividade de todos.
WM - Você participou recentemente do evento WebMobile Tech Week. O que achou? Qual a importância que você vê nesse tipo de evento, considerando principalmente o fato de estar focado em uma tecnologia nova e que tem muito a crescer. MN: Eventos como esse são de grande importância para o mercado. Ajudam os profissionais que querem atuar no segmento a esclarecer os principais pontos. Compreender o mercado e as tecnologias são os primeiros passos de uma atuação no setor.
WM - Quanto tempo, em média, leva o desenvolvimento de um jogo? MN: Um jogo de celular pode demorar de 2 semanas até 4 meses de desenvolvimento. A tendência é que esses tempos comecem a aumentar dado o acréscimo de complexidade que as próximas gerações de celulares irão permitir.
WM - Por que alguém hoje em dia deveria se interessar nesse tipo de desenvolvimento. As perspectivas são promissoras? MN: Sim. O mercado de jogos vem crescendo muito. O de jogos para celular é o que mais cresce. Fala-se em crescimento de 7000% até 2006. É um número que beira o inacreditável, mas é esse número que a indústria considera hoje como sendo a expectativa de crescimento.
WM - Visitando o site da DevWorks, percebemos que vocês trabalham com jogos para diferentes dispositivos (console, pc e celular). O que você destacaria de diferente entre cada um deles? MN: O princípio do desenvolvimento de jogos é o mesmo. O que mudam são as tecnologias e os detalhes. Internamente, dividimos os times por tecnologias, assim temos profissionais mais especializados em plataforma.
WM - Por fim, o crescimento tecnológico dos aparelhos celulares tem permitido o desenvolvimento de vários tipos de aplicação além dos jogos. O que você visualiza que poderá ser desenvolvido daqui para frente? MN: Muitos conteúdos do PC vão migrar para o celular. Só que agora aliados ao conceito de mobilidade.
74 1º Edição
wm01.indb 74
7/1/2005 20:03:02
Bem vindo ao seu novo escritório.
Decisões para tomar, agenda corporativa para consultar, ®
banco de dados para atualizar, transações para executar, negócios para concluir e você só pode fazer isso no seu escritório?
Chegou NÔMADE ®, a nova tecnologia que a CooperSystem desenvolveu para o seu celular. Com ela você pode executar todas as tarefas que seu negócio exige, onde e
quando você quiser, maximizando as funcionalidades e transformando o celular em seu novo escritório.
Com NÔMADE
®
sua empresa estará sempre ao seu lado.
®
www.portalnomade.com.br
SHCN - CL 211 Bl. B Sala 104 - Brasília/DF CEP: 70.863-520 Fone: (61) 447.9445 www.coopersystem.com.br / e-mail: comercial@coopersystem.com.br
wm01.indb 75
7/1/2005 20:03:48
Exception: deixar de visitar esse portal.
Acesse www.code-blood.com.br e conheça o maior portal para a comunidade de desenvolvimento para dispositivos móveis da América Latina. Um site repleto de informações sobre J2ME, Symbian, Brew, C++ e vários outros assuntos
relacionados à programação para aparelhos wireless. Interatividade, fóruns de discussão, programa de empréstimo de aparelhos e troca de experiência entre os usuários. Se você é cobra, acesse. Se você quer ser, acesse também.
www.code-blood.com.br wm01.indb 76
7/1/2005 20:03:55