Protocolo de Aplicação para Jogos de Tabuleiro para Ambiente de TV Digital Felipe Martins de Lima Escola de Engenharia – Universidade Federal Fluminense (UFF) Rua Passo da Pátria, 156 – São Domingos – Niterói – RJ – 24210-040 – Brasil [email protected] Resumo. Este artigo propõe uma especificação não-formal para um protocolo de aplicação para jogos de tabuleiro no ambiente de TV Digital. O desenvolvimento do jogo RummiTV pela equipe de jogos do laboratório Mídiacom foi o motivador deste trabalho. Este artigo possui informações iniciais para o desenvolvimento do protocolo e servirá como base para sua implementação futura. 1. Introdução A TV Digital brasileira ganhou projeção nacional em dezembro de 2007 devido ao início da distribuição do sinal digital para a região metropolitana de São Paulo. Em 2008 outras capitais receberão o sinal, e o objetivo é que até 2016 o sinal digital seja difundido para todo o Brasil [1]. A definição do Sistema Brasileiro de TV Digital - SBTVD, também chamado de nipobrasileiro por ter sido baseado no padrão para transmissão (modulação) do sistema japonês ISDB, foi realizada pelo governo brasileiro com a contribuição de pesquisadores de diversas universidades brasileiras [2]. Além de fornecer imagem e áudio de excelente qualidade e suportar a exibição em dispositivos móveis e portáteis, a grande inovação se dá pela interatividade. O uso da TV como objeto de inclusão digital é prioridade do governo [1]. Neste contexto, o desenvolvimento de aplicações interativas para TV Digital ocupa lugar de destaque. O projeto RummiTV, desenvolvido no laboratório Mídiacom da UFF, desenvolveu o jogo eletrônico RummiTV, que é uma adaptação para plataforma de TV Digital Interativa do tradicional jogo de tabuleiro Rummikub [3]. O cenário atual da TV Digital Interativa e o projeto RummiTV são a motivação deste trabalho, que tem por objetivo propor a especificação não-formal de um protocolo de aplicação para jogos de tabuleiro no ambiente de TV Digital. O propósito deste protocolo é otimizar a comunicação entre clientes e servidores em implementações distribuídas de jogos de tabuleiro para o ambiente de TV Digital. O trabalho está organizado da seguinte forma. A Seção 2 fala sobre a autoria de aplicações para o sistema brasileiro de TV Digital e a Seção 3 apresenta a atual implementação do jogo RummiTV. A Seção 4 descreve a especificação não-formal do protocolo de aplicação por intermédio de seus métodos principais e na Seção 5 a semântica do protocolo é apresentada por intermédio da descrição da dinâmica do protocolo e do diagrama de estados do lado cliente. O trabalho é concluído na seção 6, que salienta as dificuldades encontradas e faz alguns comentários sobre a próxima versão do protocolo. 2. Autoria de aplicações para o SBTVD O sistema brasileiro de TV Digital permite o desenvolvimento de aplicações através do uso de dois tipos de linguagens: imperativa e declarativa. As aplicações desenvolvidas para o ambiente de TV Digital, de acordo com a arquitetura em blocos da TV Digital apresentada na figura 1, necessitam de um middleware para processar os dados recebidos e possibilitar a apresentação do conteúdo, independente do hardware ou sistema operacional. Aplicações desenvolvidas em linguagem declarativa necessitam de um middleware declarativo e as aplicações desenvolvidas em linguagem imperativa necessitam de um middleware procedural [4]. Figura 1: Arquitetura em blocos da TV Digital [4]. O middleware do sistema brasileiro foi chamado de Ginga e oferece suporte a aplicações desenvolvidas nas duas abordagens. As aplicações desenvolvidas na abordagem declarativa utilizam o subsistema Ginga-NCL e as aplicações desenvolvidas na abordagem procedural utilizam o subsistema Ginga-J [5]. A arquitetura do middleware Ginga é apresentada na figura 2. Figura 2: Arquitetura do middleware Ginga [5]. O ambiente declarativo Ginga-NCL utiliza a linguagem NCL (Nested Context Language) como ferramenta de autoria para aplicações declarativas. A linguagem NCL, baseada em XML, é uma linguagem de "cola" que tem como seu foco o sincronismo de mídias e oferece suporte a exibição de conteúdo em múltiplos dispositivos de saída simultâneos, integração de diferentes tipos de objetos de mídia, edição de programação ao vivo, especificação de conteúdo alternativo e integração com objetos que possuem conteúdo procedural, sejam eles Xlets (escritos na linguagem Java) ou NCLua (escritos na linguagem LUA) [6]. Figura 3: Arquitetura do Ginga-NCL [6]. O ambiente procedural Ginga-J utiliza a linguagem Java como ferramenta de autoria para aplicações procedurais. A API Ginga-J é subdividida em três conjuntos chamados de APIs verdes, amarelas e vermelhas, como mostra a figura 4 [7]. As APIs verdes são compatíveis com o núcleo GEM (Globally Executable MHP)[8], ou seja, as aplicações desenvolvidas com estas APIs funcionam em padrões presentes em todo o mundo, como o DVB (Digital Video Broadcasting)[9], o ISDB (Integrated Services Digital Broadcasting Terrestrial) [10] e o ATSC (Advanced Television System Committee)[11]. Nela estão disponíveis, entre outros, os pacotes Sun JavaTV[12], DAVIC[13] e HAVi[14] que estão disponíveis nos outros padrões mundiais de TV Digital. As APIs verdes são responsáveis pela compatibilidade com outros padrões. As APIs amarelas são compatíveis com os outros sistemas de TV Digital através de um adaptador. Nela estão inclusas a API JMF 2.1 (Java Media Framework) necessária para aplicações avançadas como captura de som e vídeo, uma extensão à API de apresentação do GEM para suporte a fluxos de vídeo e outras facilidades. As APIs vermelhas oferecem facilidades para integração de outros dispositivos de entrada e saída ao set-top box e a ponte NCL (NCL Bridge) que permite a integração de conteúdo procedural e declarativo na mesma aplicação. As APIs vermelhas possuem caráter inovador e são exclusivas do SBTVD. Figura 4: Arquitetura das APIs do Ginga-J [5]. Na próxima Seção são apresentados os componentes do jogo RummiTV e as suas regras de forma resumida. Em seguida, o texto fala da atual implementação do jogo e do problema de desempenho que foi encontrado. 3. RummiTV O jogo RummiTV é uma versão para o ambiente de TV Digital do jogo Rummikub, desenvolvida em JavaTV. O Rummikub é um dos jogos de tabuleiro mais populares no mundo, de cunho educativo, cujo objetivo é estimular a capacidade de raciocínio de crianças e jovens acima de 8 anos de idade [3]. O RummiTV possui um conjunto de 106 peças, divididas em 4 cores, sendo 26 amarelas, 26 vermelhas, 26 azuis e 26 pretas, além de 2 coringas. Cada conjunto de peças de uma cor possui duas seqüências numeradas de 1 a 13. No início do jogo, cada jogador deverá receber um conjunto de 14 peças, ficando as demais na mesa. O objetivo é realizar o descarte de todas as peças. O jogo pode ser jogado por no mínimo 2 jogadores e no máximo 4. Para descartar uma peça, um jogador deve possuir um conjunto de no mínimo 3 peças de mesmo número, de cores diferentes, ou 3 peças de números consecutivos da mesma cor, podendo o coringa ser utilizado para substituir uma peça da seqüência. Quem conseguir descartar primeiro todas as suas peças é declarado o vencedor do jogo [3]. Os jogos ficarão a mostra de todos os jogadores. Os jogos podem ser modificados, desde que os jogos continuem válidos, conforme descrito no parágrafo anterior. As operações permitidas são desfazer grupos para formar novas seqüências e vice-versa, dividir jogos para formar outros e substituir um coringa por uma peça e vice-versa. Um jogador, caso não possua peças para descartar (ou não queira descartá-las) deverá receber uma peça das que se encontram na mesa e só poderá jogar novamente na rodada seguinte. Um jogador não pode usar dois coringas no mesmo jogo e para um conjunto de peças do mesmo número não poderá haver peças da mesma cor [3]. Como os jogos ficam a mostra de todos os jogadores, eles devem ser compartilhados entre todos os jogadores de uma partida (clientes) e qualquer modificação realizada durante a jogada de um dos jogadores (um cliente) deve ser enviada para todos os outros participantes da partida (demais clientes). Esta comunicação é feita atualmente usando o paradigma cliente-servidor. O projeto iniciou com uma implementação do jogo em um ambiente stand-alone com o objetivo de implementar a lógica do jogo e suas funcionalidades principais. A interface desta implementação é mostrada na figura 5. Figura 5: Interface do jogo RummiTV. Após estes testes, foi realizada uma implementação em um ambiente distribuído com o objetivo de testar o jogo em um ambiente semelhante ao ambiente de TV Digital. A interface desta implementação é descrita na figura 6. Para efetuar a comunicação entre clientes e o servidor foi utilizada a biblioteca RMI (Remote Method Invocation) nativa do Java e disponível no pacote JavaTV. Figura 6: Interface do Jogo RummiTV.[3] O RMI é a implementação da Sun de RPC(Remote Procedure Call) para comunicação distribuída entre objetos Java.[15, 16, 17] Uma vez registrado no lado servidor, um método pode ser procurado e utilizado por um cliente. Toda a comunicação pela rede e toda a serialização dos objetos é realizada pelo RMI e fica transparente para a aplicação. No processo de serialização, o RMI armazena todos os atributos públicos e privados do objeto em um stream para ser enviado pela rede. A sintaxe de chamada de um método remoto é idêntica à da chamada de um método de um objeto local, como é mostrado na figura 7, que trata a transparência como “RMI Magic”. Isso ocorre devido à criação de um objeto proxy local, que na verdade está referenciando um objeto remoto, fazendo com que todo o processo fique transparente para quem chama [16, 17]. Figura 7: O processo de chamada de um método remoto usando RMI [15]. O problema encontrado com a utilização do RMI ocorre justamente por causa do processo de serialização. A necessidade de enviar todo o objeto toda vez que se necessita de alguma informação torna o processo mais lento devido à carga de atributos que muitas vezes não seriam necessários. Por exemplo, imagine um objeto no lado cliente com 10 (dez) atributos. O cliente quer enviar para o servidor apenas 1 (um) desses atributos. A utilização desta implementação envia o objeto com todos os seus atributos. Devido ao baixo desempenho na comunicação através de RMI, surge a necessidade de especificar e implementar um protocolo de aplicação otimizado para o jogo RummiTV, que é a principal motivação deste trabalho. Na próxima Seção é apresentada uma especificação não-formal de um protocolo de aplicação que será baseado em sockets [18] objetivando ser uma alternativa ao uso do RMI e uma solução ao problema supracitado. 4. Especificação do Protocolo Esta Seção apresenta a especificação não-formal de um protocolo de aplicação para jogos de tabuleiro no ambiente de TV Digital por intermédio dos métodos do lado cliente e do lado servidor. O objetivo desta seção é identificar os principais métodos que serão utilizados pelas aplicações, porém o desafio é propor métodos genéricos visando fornecer um protocolo que possa ser utilizado por diversos jogos de tabuleiro existentes e não só pelo RummiTV [18]. 4.1 - Métodos do lado Cliente ? LOGIN(usuario, senha): Neste método o usuário se autentica no servidor com um nome de usuário e uma senha previamente cadastrada. Neste momento o cliente está no estado CONECTADO. ? ESCOLHER_JOGO(nome, opção): Neste método o usuário escolhe dentre os jogos disponíveis qual o jogo que ele deseja jogar. Por exemplo, o usuário pode escolher entre o RummiTV, um jogo de perguntas e respostas ou uma partida de dominó. O parâmetro opção é utilizado para invocar o método ENVIAR_JOGO do lado servidor. Quando o valor do atributo for 0(zero) o cliente já possui a versão mais nova do jogo no seu set-top box [19], mas se o valor for 1(um) o servidor chama o método ENVIAR_JOGO para o cliente receber o pacote Java (xlet) com a última versão do jogo. Neste momento o cliente está no estado AUTENTICADO. ? JOGAR_RODADA(cod_rodada): Neste método o jogador inicia a sua jogada na rodada especificada. Ao invocar este método, o cliente vai para o estado JOGANDO. ? COMPRAR_PEÇA( ): Neste método o jogador solicita novas peças ao servidor. Por exemplo, no jogo RummiTV, o jogador que ao final da sua jogada não conseguir formar uma nova seqüência ou trinca, recebe uma carta. Logo a aplicação chama o método para efetuar a compra da carta. ? DESCARTAR_PEÇA(cod_peça): Neste método o jogador envia para a mesa uma ou mais peças. Por exemplo, em um jogo de perguntas e respostas o jogador que não soubesse responder a uma questão poderia descartar uma peça do tipo "Vale 1 Pulo". ? SAIR_RODADA(cod_rodada): Neste momento o jogador encerra a sua jogada na rodada especificada. Ao invocar este método, o cliente vai para o estado AGUARDANDO_VEZ. ? SAIR _PARTIDA(cod_partida): Neste método o jogador abandona a partida do jogo e volta para o estado AUTENTICADO. ? LOGOFF(): Neste método o jogador encerra a sua sessão, finalizando a sua conexão com o servidor e vai para o estado DESCONECTADO. 4.2 - Métodos do lado Servidor ? LOGIN_RESP(cod) Neste método o servidor responde a requisição de login do cliente. Se usuário estiver cadastrado e a senha estiver correta o servidor responde com o código 200, se a senha estiver incorreta o servidor responde com o código 300. Se o usuário não estiver cadastrado o servidor responde com o código 301. ? LISTAR_JOGOS( ); Este método é solicitado automaticamente sempre que o usuário efetuar login com sucesso e quando o jogador sair de uma partida do jogo. Neste método o servidor envia ao cliente a lista de jogos disponíveis no momento e a versão disponível. ? ENVIAR_JOGO(jogo); Neste método o servidor responde a requisição do cliente enviando o pacote Java (Xlet) com a última versão do jogo escolhido. ? ESCOLHER_PARTIDA(cod_partida) Neste método o servidor escolhe qual a partida será disponibilizada para o cliente jogar. Caso não exista nenhuma partida disponível para o jogo escolhido o servidor chama o método CRIAR_PARTIDA(). Caso exista uma partida disponível, a mesma é escolhida para o cliente. ? CRIAR_PARTIDA( ) Este método cria uma nova partida para o jogo solicitado. Este método chama EMBARALHAR_PEÇAS( ). ? EMBARALHAR_PEÇAS(peças) Este método embaralha as peças necessárias para o início do jogo. ? INICIAR_PARTIDA(cod_partida); Este método inicia a partida do jogo solicitado. Este método chama os métodos DISTRIBUIR_PEÇAS(cod_peça) e INICIAR_RODADA(cod_rodada, cod_partida, usuario). ? DISTRIBUIR_PEÇAS(peças); Neste método o servidor distribui para todos os jogadores as peças necessárias para o início da partida. ? INICIAR_RODADA(cod_rodada, cod_partida, usuario); Neste método o servidor inicia uma nova rodada do jogo. Este método ocorre depois do método DISTRIBUIR_PEÇAS() ou depois do método ENCERRAR_RODADA( ). ? ENCERRAR RODADA(cod_rodada, cod_partida); Este método é chamado após todos os jogadores concluírem as suas jogadas. No jogo RummiTV, por exemplo, cada jogador tem a sua vez de jogar, mas em um jogo de perguntas e respostas talvez seja interessante que todos os jogadores respondam as perguntas simultaneamente. A aplicação pode ainda atribuir um tempo para que sejam dadas as respostas, e após este tempo chamar o método. ? ENCERRAR_PARTIDA(cod_partida); Este método encerra a partida especificada. 5. Implementação A implementação deste protocolo será realizada em Java utilizando a API de sockets para efetuar a troca de mensagens entre os clientes e o servidor. Objetivando auxiliar o desenvolvimento do protocolo propriamente dito será utilizado o diagrama de estados proposto pela linguagem UML (Unified Modeling Language) [20]. O diagrama de estados mostra os diferentes estados de um objeto durante sua vida, e o estímulo que faz com que o objeto mude seu estado. O diagrama de Estado vê os objetos como máquinas de estado que podem ser um de um conjunto de estados finitos e que podem mudar seu estado através de um conjunto finito de estímulos. A figura 8 mostra o diagrama de estados do lado cliente do protocolo. Figura 8: Diagrama de estados do lado cliente. 6. Conclusões No contexto atual da TV Digital no Brasil, este trabalho propôs um protocolo de aplicação para jogos de tabuleiro que será desenvolvido em Java utilizando a API de sockets. As idéias desenvolvidas neste trabalho estão alinhadas com o objetivo do governo brasileiro de promover a inclusão digital por intermédio da TV Digital. O recurso da interatividade presente no SBTVD será de grande importância para diversas áreas da sociedade, tais como comércio, indústria, ensino e entretenimento. Este trabalho tem como objetivo incentivar o desenvolvimento de novos jogos para o ambiente de TV Digital, que podem ter sua comunicação cliente-servidor facilitada fazendo uso do protocolo. A maior dificuldade no desenvolvimento deste trabalho foi encontrar mensagens genéricas que são trocadas entre clientes e servidor, que possam ser utilizadas pelos mais diversos tipos de jogos de tabuleiro existentes, aumentando desta forma o nível de abstração e as possibilidades de uso do protocolo. A especificação que foi apresentada utiliza uma seqüência lógica onde o servidor escolhe a qual partida o cliente deverá se conectar, porém já está em fase de estudos uma nova versão onde o cliente terá a possibilidade de criar uma partida em um jogo onde ele será o gestor e concederá as permissões para os outros clientes, ou então ele simplesmente se conectará a uma partida de um jogo já existente. A especificação apresentada ainda não inclui a comunicação cliente-servidor para realização da jogada, como por exemplo, métodos para atualizar jogos na mesa ou criar novos jogos que utilizem várias peças. A especificação completa do protocolo é colocada como trabalho futuro. 7. Referências [1] Diário Oficial da União. Decreto-lei 4.901, de 26 de novembro de 2003. Institui o Sistema Brasileiro de Televisão Digital – SBTVD, e dá outras providencias. Diário Oficial da República Federativa do Brasil, Brasília, 27 de nov. 2003. Seção 1, Pág. 7. [2] ABNT/CEE - COMISSÃO DE ESTUDO ESPECIAL. Projeto 00:001.85-001 Televisão Digital Terrestre - Sistema de Transmissão. ABNT, 2007. [3] SANTOS, Joel; RATAMERO, Erick. RummiTV - Jogo Eletrônico para TV Digital Interativa. Rio de Janeiro, 2007. [4] SOARES, L.F.G; RODRIGUES, R.F. Produção de conteúdo declarativo para TV Digital. Seminário Integrado de Software e Hardware, 2006. [5] Middleware Ginga - TV Interativa se faz com Ginga! http://www.ginga.org.br. Acessado em 29/10/2007. [6] SOARES, L.F.G.; RODRIGUES, R.F.; MORENO, M.F. Ginga-NCL: The Declarative Environment of the Brazilian Digital TV System. Journal of the Brazilian Computer Society. Porto Alegre, RS, 2007. [7] SOUZA FILHO, G.L. de; LEITE, L.E.C.; BATISTA, C.E.C.F. Ginga-J: The Procedural Middleware for the Brazilian Digital TV System. Journal of the Brazilian Computer Society. Porto Alegre, RS, 2007. [8] Globally Executable MHP. http://www.mhp.org/mhp_technology/gem/. Acessado em 02/11/2007. [9] DVB - Digital Vídeo Broadcasting. http://www.dvb.org. Acessado em 02/11/2007. [10] Outline of the Specification for ISDB-T - http://www.nhk.or.jp/strl/open99/de-2/shosaie.html. Acessado em 02/11/2007. [11] ATSC. http://www.atsc.org. Acessado em 02/11/2007. [12] Java TV API. http://java.sun.com/products/javatv. Acessado em 02/11/2007. [13] DAVIC. http://www.davic.org. Acessado em 02/11/2007. [14] HAVi. http://www.havi.org. Acessado em 02/11/2007. [15] RMI. http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp. Acessado em 05/11/2007. [16] SILBERSCHATZ, A.; GALVIN, P.B.; GAGNE, G. Sistemas Operacionais Conceitos e Aplicações. Editora Campus, 2000. [17] DEITEL, H. M.; DEITEL, P. J. Java: como programar. 4ª Edição. Porto Alegre: Bookman, 2003. [18] KUROSE, James F.; ROSS, Ketith W. Redes de Computadores e a Internet: uma abordagem top-down. 3ª Edição. São Paulo: Pearson Addisson Wesley, 2006. [19] Dantas, M.S. Middleware para set-top boxes – Um enfoque prático. Rio de Janeiro: UFF, 2005. [20] Fundamentos do UML. http://docs.kde.org/stable/pt_BR/kdesdk/umbrello/umlbasics.html. Acessado em 17/12/2007.