132.02+Jogo+Android+com+Bluetooth


 * LABORATÓRIO DE PROGRAMAÇÃO **

Jair Bortolucci Junior - 0040441213015
Pedro Henrique Fernandes Sanches - 0040441213012

** Desenvolvimento de um jogo para sistema ANDROID utilizando comunicação Bluetooth **

1. Breve introdução sobre sistema operacional Android
O sistema operacional Android é um sistema aberto desenvolvido pela Open Handset Alliance, uma união de grandes empresas de telefonia, e principalmente pela Google. O sistema foi desenvolvido com objetivo de rodar em todos os hardwares possíveis não ficando exclusivo a apenas um provedor. A plataforma Android integra o sistema operacional, a ferramente de desenvolvimento SDK (Software Development Kit) e as suas várias aplicações existentes. A linguagem de programação para desenvolver as aplicações para Android é a linguagem Java. O sistema operacional funciona como uma pilha de software, com funções bem especificadas que permitem que o sistema trabalhe de forma correta. Na base da pilha está o Kernel, baseado no sistema Linux, este controla as funcionalidades mais baixas do sistema como gerenciamento de memória, drivers de hardware, gerenciamento de energia e outros. Um nível acima estão as bibliotecas, responsáveis por suportar e interpretar os tipos de dados distintos. Ainda no nível das bibliotecas está a maquina virtual Dalvik, responsável por traduzir o código Java para uma linguagem que o SO possa entender. Uma camada mais acima está o framework de aplicação, que possui funções que controlam alguns recursos do telefone, estas servem como ferramenta para que os desenvolvedores possam usufruir do SO criando aplicações eficientes. No topo da pilhe está a camada das aplicações, tais como funções para acessar web, efetuar ligações, cadastrar contatos, etc... .

**2.1 Dispositivo**
O modelo do dispositivo utilizado para teste durando o desenvolvimento foi o LG P698F Optimus. O smartphone possui a versão 2.3 do Android (conhecida também por GingerBread), um chipset Qualcomm MSM7227T, a GPU Adreno 200, um processador de 800 MHz, 512 MB de memória RAM e memória interna de 150 MB (expansível até 32 GB).

**2.2 Comunicação bluetooth**
Criado pela Ericson em 1994, o Bluetooth é uma tecnologia wireless de curto alcance (conhecida como PAN - Personal Area Network) utilizada para a troca de informações entre dispositivos, ele utiliza uma comunicação de baixa frequência via rádio, permitindo a conexão mesmo se os dispositivos estiverem fora de visão (porém a transmissão deve ser suficientemente potente). O Bluetooth opera em uma banda de 2400 a 2483.5 MHz onde a transmissão é feita por pacotes onde cada pacote é distribuído em um dos 79 canais do Bluetooth. Cada canal possui 1 MHz de largura de banda, começando a ser transmitido a 2402 MHz até terminar em 2480 MHz. O sistema utiliza uma unidade básica conhecida como Piconet, ela permite que um Mestre possa se conectar a no máximo outros sete Escravos ao mesmo tempo. A cada momento, o Mestre pode decidir a qual Escravo haverá a troca de dados. É importante ressaltar que a conexão Escravo - Escravo não pode ser realizada.

2.3 Open Graphics Library for Embedded Systems (OpenGL ES)
Open Graphics Library for Embedded Systems é um sub conjunto da API OpenGL, que provê funcionalidades para desenvolvimento de interfaces gráficas e renderização de gráficos 2D e 3D em sistemas embarcados como smartphones, iPads, tablets e outros. Existem pequenas diferenças entre essa versão e a versão original da API. A grande diferença está nas funcionalidades de renderização, que precisaram ser alteradas em função da diversidade de CPUs e GPUs dos sistemas embarcados, mesmo assim, essa versão possui muitas funções advindas da OpenGL API. O OpenGL ES é eficiente para renderização em sistemas embarcados, por isso é amplamente utilizado e possui muitas versões com algumas diferenças entre si. A versão da API utilizada no desenvolvimento do jogo foi a a GLES 2.0, que necessita de uma versão Android miníma de 2.2. Sua principal diferença em relação ao sucessor GLES 1.0 é a remoção da pipeline fixa, desse modo o desenvolvedor é responsável por programar a parte de tratamento de vértices e de pixels através dos shaders.

** Opengl Pipeline: **
 * [[image:http://upload.wikimedia.org/wikipedia/commons/b/bb/Pipeline_OpenGL_%28en%29.png width="642" height="342" align="center" caption="Opengl Pipeline"]] ||
 * Opengl Pipeline ||

// As funções da pipeline implementada pelo desenvolvedor representadas na imagem são Per-Vertex Operations(Vertex Shader) e Per-Fragment Operations(Fragment Shader). //

[|mais detalhes sobre shaders].

3. Jogo desenvolvido: Poker 21
O jogo Poker 21 é uma junção do clássico blackjack com poker. Os objetivos do 21 tradicional foram mantidos, mas a dinâmica do jogo foi alterada, incluindo a possibilidade de apostas e outros recursos existentes no poker. Durante as partidas o jogo fica bastante parecido com uma partida de poker permitindo que um dos jogadores desista se estiver em desvantagem, proporcionando maior possibilidade de estratégia. As partidas são necessariamente multiplayers, um jogador apenas não pode iniciar uma partida. Dois jogadores podem iniciar o jogo se estiverem próximos, os dispositivos utilizam comunicação bluetooth para interagirem. No inicio do jogo cada jogador possui uma quantidade de dinheiro, que será usado para realizar as apostas e na mesa, há uma aposta fixa (esta aumenta a cada rodada se os jogadores concordarem). Logo no inicio, duas cartas estão em posse de cada jogador, sendo que uma fica amostra na mesa e uma escondida, podendo ser visualizada apenas pelo próprio possuidor desta. Neste momento, o fluxo de jogo deve seguir, o jogador iniciante pode escolher entre três opções, passar, aumentar a aposta ou desistir da rodada. Se o jogador aumentar a aposta ele passa a vez para análise do outro jogador, que terá a sua escolha as mesmas três opções, com a exceção de que ele deve apostar o mesmo que o anterior propôs, se nesse caso, o jogador desistir, a aposta da mesa vai para o outro que apostou. Caso o jogador decida aumentar a aposta o seu oponente pode ainda efetuar as mesmas opções anteriores e assim por diante. Firmada a aposta em concordância tendo os dois jogadores passado sem mais aumentos na aposta, o jogo inicia e eles podem coletar uma carta do baralho, ou não, se mais conveniente. Ao fim de cada ação de ambos os jogadores, as apostas são realizadas novamente como explicado. Vencerá o jogador que obtiver maior soma nas cartas coletadas do baralho, não passando vinte e um (21), ou quem somou vinte e um (21).

**4. Problemas e Soluções** O primeiro obstáculo encontrado durante o desenvolvimento da aplicação foi o carregamento das texturas usadas no jogo. As funções de leitura de imagem fornecidas pela SDK do Android carregavam cada pixel da imagem e guardavam em um array de integers, de forma que cada byte representava um valor de cor no modelo RGBA, porém a ordem das cores estavam trocadas, de modo que o primeiro byte continha o valor de B ao invés de R e o terceiro continha o valor de R ao invés de B. Para resolver esse problema foi criado uma função que desmembrava cada pixel (integer) da imagem e transformava em 4 bytes e no caso dos bytes R e B, os valores eram trocados. Somente dessa forma foi possível passar os bytes da imagem para a placa de vídeo, através da API Opengl ES 2.0, pois as funções de criação de textura aceitavam valores somente nesse formato.



Outros impasses surgiram enquanto era implementado o sistema de transferência de dados entre cliente e servidor. A princípio foi implementada apenas uma classe, que agiria como server e cliente ao mesmo tempo, diferindo o comportamento de cliente e servidor dentro de cada ação de cada rotina. Portanto essa classe checava todos os métodos que eram executados pelo servidor e se caso aquele dispositivo era de fato um servidor, ela executava as ações, se não as ações de cliente eram executadas. Desse modo, uma mesma classe manipulava a lógica do jogo, enviaava mensagens de notificação pro cliente do outro dispositivo e ainda era responsável pela parte visual do próprio dispositivo. Conforme o código foi se tornando mais complexo, percebeu-se que essa junção de cliente/servidor em uma mesma classe seria um grande problema. Depois de analisar e estudar alguns exemplos na internet, chegou-se à conclusão de que a melhor alternativa seria criar uma classe específica para a lógica do jogo e outra responsável apenas pela visualização e envio de input do usuário, tornando-se portanto uma aplicação cliente-servidor clássica. No caso do dispositivo host, por ser responsável pela lógica, ou seja, conter a classe servidor, era necessário criar um sistema de comunicação através de threads entre o cliente e servidor do mesmo dispositivo. Para realizar essa operação foi escolhida a classe PipeStream da biblioteca padrão do Java. A PipeStream é responsável por criar um sistema de envio e recebimento de dados dentro de uma mesma aplicação, para isso é necessário instanciar um objeto PipedOutputStream e conectá-lo a um objeto PipedInputStream, desse modo, todo dado escrito no PipedOutputStream seria despachado para o PipedInputStream que consequentemente realizaria a leitura do dado. O grande porém desse sistema de comunicação é que a partir do momento que uma stream inicia o processo de escrita ou leitura, ela bloqueia a thread em que se encontra até receber o dado ou lançar um erro. Com isso, a única maneira de se manter uma comunicação estre as streams seria agregando cada uma a uma thread exclusiva para realizar suas funções de leitura ou escrita. Como nenhum membro do grupo havia trabalhado com threads, vários erros surgiram conforme o código foi sendo construído, foi necessário muito tempo e muita pesquisa para que a comunicação funcionasse corretamente.



O maior problema de todo o desenvolvimento acabou sendo o bluetooth. Mesmo utilizando o tutorial oficial da Google e outros sites muito bem explicativos para aprender a criar conexões entre dispositivos Android via bluetooth, o grupo não conseguiu fazer com que um dispositivo inicia-se uma aplicação cliente/servidor. Ambos dispositivos conseguiam identificar um ao outro e parear, porém, ao enviar um pedido de conexão cliente/servidor e gerar os sockets, a aplicação sempre gerava um erro de requisição que não foi possível de resolver. A solução encontrado foi simular no mesmo aparelho, o funcionamento da transmissão de dados entre os dispositivos, para isso foi adicionado mais um cliente para o aparelho servidor e a tela da aplicação passou a exibir um cliente de cada lado da tela (split screen).

5. Resultados Obtidos
O resultado final não foi exatamente o planejado, mas foi bem satisfatório. A conexão via bluetooth acabou não acontecendo mas toda a estrutura de comunicação e transferência de dados foi concluída e bem estruturada. O acabamento do jogo acabou não saindo muito amigável, mas isso não foi apenas fruto do tempo perdido com o desenvolvimento de outros recursos, o grupo tinha consciência de que o foco do projeto era a implementação multi-player, desse modo, o tempo reservado para o acabamento e jogabilidade foi reduzido.

6. Tutorial de Instalação
Para instalar o aplicativo é necessário primeiro transferir o arquivo Poker21.apk para o aparelho. Essa transferência pode ser realizada de várias formas, como por exemplo, via bluetooth, cabo USB ou download de algum repositório web, como o Dropbox ou Google Drive.

Após ter o arquivo .apk armazenado no dispositivo, basta executá-lo e aceitar a instalação.

Pronto, quando a instalação terminar, basta executar o aplicativo que aparecerá junto aos demais apps de seu aparelho.

7. Conclusão
Apesar dos diversos contratempos, devido a ousadia e inexperiência dos desenvolvedores com relação à comunicação multi-player e desenvolvimento mobile, os resultados acabaram sendo muito satisfatórios. O grupo se beneficiou dos imprevistos para aumentar a bagagem de conhecimento. O tempo gasto pesquisando, implementando, testando e refazendo as funções de comunicação, renderização e conexão foi de grande importância no aprendizado de todos. Os próximos desafios que envolverem esses conteúdos com certeza terão resultados melhores e em menor espaço de tempo e todos temos consciência da importância disso.

8 . Referências
iOS Developer Library - OpenGL ES Programming Guide for iOS. Disponível em: <[]> Acesso em: 31 nov 2013.

Kronos Group, Connecting software to silicon. Disponível em: <[]> Acesso em: 31 nov 2013.

Tudo Celular - LG Optimus. Disponível em: <[]> Acesso em 24 nov 2013.

Wikipedia - Bluetooth. Disponível em: <[]> Acesso em 24 nov 2013.