1 Desenvolvimento de Aplicativos Gráficos Distribuídos para Redes Bluetooth Empregando a J2ME Leonardo P. Silva, Ivan R. S. Casella CECS, Universidade Federal do ABC Av. dos Estados, 5001, Santo André, SP A tecnologia Bluetooth é um padrão de rede WPAN (Wireless Personal Area Network) voltada para a comunicação multimídia (e.g. dados, voz, imagem, vídeo) de curto alcance entre dispositivos pessoais através de ondas de rádio. O alcance das redes Bluetooth pode ser ampliado, aumentando a potência do sinal transmitido, entretanto, isso faz crescer o consumo de energia do dispositivo móvel e aumentar a interferência em outros sistemas e redes. O consumo de energia é uma área importante a se considerar ao trabalhar com esta tecnologia, pois esta especificação foi desenvolvida visando à portabilidade. Neste contexto, este trabalho visa o desenvolvimento de aplicativos, utilizando a plataforma J2ME (Java 2 Micro Edition) e a tecnologia Bluetooth, para a comunicação multimídia entre dois ou mais dispositivos. Palavras chave: J2ME, Bluetooth, Java. I. INTRODUÇÃO A plataforma J2ME (Java 2 Micro Edition) é a plataforma da tecnologia JAVA destinada ao desenvolvimento de aplicativos para dispositivos portáteis, como por exemplo, celulares, pagers, PDAs (Personal Digital Assistant), sistemas de navegações e set-up Box para sistemas de TV [2]. Ela associa os benefícios da tecnologia Java, como a portabilidade do código, a orientação a objetos e o rápido ciclo de desenvolvimento, às limitações de capacidade de processamento, de memória e das interfaces de entrada e saída de dados dos dispositivos portáteis. Para lidar com uma gama ampla de arquiteturas diferentes de dispositivos, a plataforma J2ME define configurações, perfis e API's (Application Protocol Interface) opcionais [2]. Uma configuração define o conjunto mínimo de API's, ou seja, o conjunto mínimo de bibliotecas de classes indispensáveis para a execução de um aplicativo em uma determinada família de dispositivos e a VM (Virtual Machine) correspondente. A J2ME oferece fundamentalmente duas configurações de dispositivos: a CLDC (Connected, Limited Device Configuration) e a CDC (Connected Device Configuration). A CLDC é voltado para dispositivos com baixa velocidade de processamento e pouca memória como celulares e PDA's. Por ser usado em dispositivos muito pequenos, as bibliotecas são muito limitadas e é utilizada uma máquina virtual mais simples, o Kilo Virtual Machine (KVM). Já a CDC é destinado às famílias de dispositivos com uma capacidade maior de processamento e memória. Isto permite a utilização de um número maior de bibliotecas de classes e de uma máquina virtual com mais recursos, a CVM (Compact Virtual Machine). Um perfil é uma coleção de API's que suplementa a configuração do dispositivo e oferece, assim, um serviço completo para que os aplicativos possam ser rodados em uma determinada linha de dispositivos. Para os dispositivos usando a CLDC, o perfil mais utilizado é o MIDP (Mobile Information Device Profile). Já para os dispositivos usando a configuração CDC, o perfil mais utilizado é o FD (Foundation Profile). O rápido crescimento da internet mudou o cenário da computação moderna. Na era da informação, o acesso aos dados em qualquer lugar e a qualquer hora passa a ser indispensável para o sucesso de qualquer negócio. Neste contexto, a tecnologia de redes sem fio Bluetooth passa a ter uma posição de destaque. O Bluetooth é uma especificação padronizada, que suporta a transmissão de informação multimídia, de forma pública e gratuita, através de um sistema de transmissão digital por ondas de rádio de curto alcance e baixo custo. Para que dois ou mais dispositivos possam estabelecer comunicação numa rede Bluetooth, é preciso que eles utilizem o protocolo de comunicação definido pelo padrão. Assim, para permitir o desenvolvimento de aplicativos para comunicação Bluetooth com a J2ME, de acordo com o protocolo estabelecido pelo padrão, foi criada a JSR 82 (Java Specification Request 82) [1]. Neste contexto, esse trabalho apresenta um aplicativo, desenvolvido com a plataforma J2ME para dispositivos compatíveis com a configuração CLDC 1.1 e com o perfil MIDP 2.0, para a comunicação sem fio entre um dispositivo celular e um computador pessoal utilizando o padrão Bluetooth. II. DESENVOLVIMENTO DO PROJETO Para a melhor compreensão das tecnologias J2ME e Bluetooth e dos seus potenciais no desenvolvimento de sistemas para comunicação entre dispositivos, foram desenvolvidos três aplicativos. O primeiro foi baseado no protocolo RFCOMM (Radio Frequency Communication), o segundo utilizou o protocolo OBEX (Object Exchange) e o terceiro foi uma adaptação deste segundo aplicativo para a comunicação entre um dispositivo móvel e um computador pessoal com conexão Bluetooth. O terceiro aplicativo é o mais completo, pois utiliza uma interface gráfica [3-16] para a apresentação das informações na tela do dispositivo e a camada de transporte de dados RFCOMM [1]. Assim, ele será o foco das discussões que serão apresentadas a seguir. 2 Um dispositivo requer, para se comunicar através do protocolo Bluetooth, um conjunto de API´s definidas na JABWT (JAVA API´s for Bluetooth Wireless Technology) [1]. A forma mais simples de se desenvolver aplicativos para comunicação Bluetooth, é utilizar conjuntamente o protocolo RFCOMM com a JABWT. A comunicação através da camada de transporte RFCOMM é similar a uma comunicação através de sockets, ou seja, os dados são enviados através de streams, o que simplifica significativamente o protocolo de comunicação RFCOMM [1]. Uma outra forma de desenvolvimento de aplicativos para comunicação Bluetooth é empregando o protocolo OBEX. Esse protocolo utiliza um modelo de cliente-servidor e é independente do mecanismo de transporte e da API de transporte. Um dispositivo que deseja iniciar uma sessão OBEX com outro dispositivo é considerado cliente. O protocolo OBEX é construído em cima de seis operações básicas: CONNECT, SETPATH, GET, PUT, ABORT, e DISCONNECT. Qualquer uma dessas operações é iniciada pelo cliente, que fica esperando uma resposta do servidor. Toda conexão OBEX trabalha com o conceito de sessões. Toda sessão é iniciada com a operação CONNECT e finalizada com a operação DISCONNECT. Entre essas operações o cliente pode enviar qualquer outra operação ao servidor quantas vezes ele quiser. A cada requisição ou resposta de uma operação, são enviados cabeçalhos (headers) [1]. Os principais passos para estabelecer uma comunicação Bluetooth e os principais cabeçalhos definidos pela especificação OBEX são: • O primeiro passo para que uma sessão seja iniciada é a estabilização da conexão. Para isso o cliente ou o servidor deve passar uma String de conexão ao método Connector.open(). Essa String tem a seguinte forma: {esquema)://{alvo}{parâmetros} • Caso o protocolo de transporte seja o RFCOMM o perfil utilizado é o GOEP, por isso o {esquema} utilizado neste caso é btgoep. O {alvo} no cliente é o endereço Bluetooth e o número do canal RFCOMM, já no servidor é o UUID do serviço. Todos os {parâmetros} válidos para o protocolo RFCOMM são válidos para o protocolo OBEX caso a camada de transporte seja a RFCOMM. • Após o método Connector.open() ser chamado no cliente, um objeto ClientSession é retornado. Entretanto, uma conexão na camada OBEX ainda não foi criada. Para que a conexão seja estabilizada é preciso que o ClientSession.connect() seja chamado e para que a camada de transporte seja finalizada é preciso que o ClientSession. disconnect() seja chamado. • No servidor, o objeto SessionNotifier retornado pelo Connector.open() é utilizado para aceitar conexões vindas dos clientes através do método acceptAndOpen() que recebe como argumento um objeto do tipo ServerRequestHandler e um do tipo Authenticator, este ultimo é opcional. O desenvolvedor precisa criar uma classe que herde ServerRequestHandler e nesta implementar métodos que tratem os pedidos que o servidor deverá lidar. • O protocolo OBEX faz toda a comunicação através de headers e a JABWT permite que eles sejam lidos e escritos através de diferentes métodos. • Os Clientes OBEX utilizam o método createHeaderSet() definido na interface ClientSession para criar headers. Por outro lado, os servidores implementam o HeaderSet quando sobrescrevem métodos onXXX() na classe que herda ServerRequestHandler. • Depois que a conexão na sua camada de transporte é estabelecida é preciso que um pedido de conexão seja enviado ao servidor através do método connect(). • As operações GET e PUT transferem um corpo de dados entre o cliente e o servidor. Os métodos put() e get() retornam um objeto do tipo Operation. Para restaurar um corpo de dados basta abrir um stream de entrada com os métodos openInputStream() e openDataInputStream() respectivamente. Para enviar dados basta fazer o mesmo com openOutputStream() e openDataOutputStream(). A implementação OBEX converte os headers de corpo de dados em pacotes. • Os servidores OBEX necessitam herdar a classe ServerRequestHandler para lidar com solicitações dos clientes. Não é preciso sobrescrever nenhum método desta classe, somente devem ser sobrescritos os métodos relacionados aos tipos de solicitação que o servidor espera que o cliente faça. Por exemplo, caso o cliente faça solicitações do tipo PUT e GET ele sobrescreverá somente os métodos onPut() e onGet(). III. RESULTADOS E DISCUSSÃO No programa desenvolvido, um cliente pode enviar uma mensagem com um destinatário e um corpo de texto que ficam armazenados no servidor. Em seguida, outro cliente pode se conectar ao servidor usando como nome de usuário o destinatário para qual a mensagem foi enviada. Fazendo isto, pode-se escolher a opção de receber as mensagens e assim receber todas as mensagens armazenadas no servidor, uma a uma pela ordem de envio. O servidor armazena quantas mensagens forem necessárias e de quantos destinatários existirem. 3 A figura abaixo mostra a tela principal do cliente, com as opções de escolha de envio ou recebimento de mensagens. Esta tela foi criada utilizando um objeto do tipo List. A versatilidade e o fato de ser uma tecnologia barata provem inúmeras possibilidades em diversas áreas, pois a conexão é estabelecida de forma segura e relativamente simples podendo assim ser uma alternativa para pequenas redes e aplicativos que antes utilizavam a tecnologia sem fio IEEE 802.11, por exemplo. V. REFERÊNCIAS Figura 1 - Tela de Escolha do Cliente O servidor foi inicialmente desenvolvido para dispositivos portáteis e posteriormente para computadores pessoais com suporte à tecnologia Bluetooth. Em função dessa mudança e das diferenças intrínsecas entre os aplicativos para dispositivos portáteis e computadores pessoais, foi necessário o desenvolvimento de um novo servidor utilizando a plataforma J2SE (Java 2 Standard Edition). Para que a plataforma J2SE pudesse suportar as APIs Bluetooth e OBEX, foi necessário o desenvolvimento de uma nova especificação, a JSR-197. Deste modo, para o desenvolvimento do servidor para computadores pessoais, foi utilizada a biblioteca Bluecove 2.1.0 [17] que utiliza as especificações da JSR-197. As APIs desta biblioteca funcionam exatamente como as fornecidas pela plataforma J2ME. [1] KUMAR, C. B.; KLINE, P. J.; THOMPSON, T. J. Bluetooth Application Programming with the Java APIs. Morgan Kaufmann Publishers, 2004. [2] Carniel, J.; Teixeira, C.; Apostila de J2ME – Versão 1.1. [3] http://www.bluetooth.com/Bluetooth/Technology/Works/C ore_System_Architecture.htm; Acessado em: 01 de Fevereiro de 2009. [4] http://www.bluetooth.com/Bluetooth/Technology/Works/O BEX.htm; Acessado em: 01 de Fevereiro de 2009. [5] http://www.bluetooth.com/Bluetooth/Technology/Works/G OEP.htm; Acessado em: 01 de Fevereiro de 2009. [6] http://www.bluetooth.com/Bluetooth/Technology/Works/S PP.htm; Acessado em: 01 de Fevereiro de 2009. [7] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Alert.html; Acessado em: 10 de Fevereiro de 2009. [8] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Form.html; Acessado em: 10 de Fevereiro de 2009. [9] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/List.html; Acessado em: 10 de Fevereiro de 2009. [10] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/TextBox.html; Fevereiro de 2009. Acessado em: 10 de [11] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Screen.html; Acessado em: 09 de Fevereiro de 2009. [12] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Display.html; Acessado em: 09 de Fevereiro de 2009. [13] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Displayable.html; Acessado em: 09 de Fevereiro de 2009. [14] http://java.sun.com/javame/reference/apis/jsr118/javax/mic IV. CONCLUSÃO O desenvolvimento de aplicativos gráficos integrados para dispositivos móveis é muito mais simples e rápido graças às facilidades geradas pela plataforma J2ME. Devido a isto, esta é uma área promissora com tendência de crescimento. A simplicidade no desenvolvimento destes aplicativos chegou à tecnologia de redes sem fio Bluetooth através da JABWT. Isso torna esta área muito rica para a criação de aplicativos para os mais diversos fins e torna possível o desenvolvimento tanto para dispositivos móveis quanto para dispositivos com maior capacidade como PCs que possuam a tecnologia Bluetooth. roedition/lcdui/Canvas.html; Acessado em: 12 de Fevereiro de 2009. [15] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Item.html; Acessado em: 12 de Fevereiro de 2009. [16] http://java.sun.com/javame/reference/apis/jsr118/javax/mic roedition/lcdui/Command.html; Fevereiro de 2009. Acessado em: 13 de [17] http://code.google.com/p/bluecove/; Acessado em: 20 de Junho de 2009