You are on page 1of 107

UNIVERSIDADE ESTADUAL DE PONTA GROSSA DEPARTAMENTO DE INFORMÁTICA

TECNOLOGIA BLUETOOTH NA COMUNICAÇÃO ENTRE DISPOSITIVOS ATRAVÉS DA LINGUAGEM JAVA

AUTOR: ELIO EDUARDO FERRARI MARCOLINO TRABALHO DE CONCLUSÃO DE CURSO DE ENGENHARIA DE COMPUTAÇÃO Orientador: Prof. Dr. João Umberto Furquim de Souza
Ponta Grossa, 06 de outubro de 2008.

ELIO EDUARDO FERRARI MARCOLINO

TECNOLOGIA BLUETOOTH NA COMUNICAÇÃO ENTRE DISPOSITIVOS ATRAVÉS DA LINGUAGEM JAVA

Trabalho de conclusão de curso apresentado como parte das atividades para obtenção do título de Engenheiro da Computação.

Prof. Orientador: Prof. Dr. João Umberto Furquim de Souza Ponta Grossa, 2008

mundialmente aceito e utilizado na comunicação sem fio e de curto alcance entre diferentes dispositivos eletrônicos. como um aparelho celular.RESUMO A tecnologia Bluetooth é um padrão aberto. juntamente com seu código fonte. como um computador pessoal. a BlueCove. Ela é conhecida por fornecer ferramentas de desenvolvimento de aplicativos que atendem as mais diversas áreas. afim de demonstrar a utilização da API JAVA para Bluetooth e como as tecnologias JAVA e Bluetooth se relacionam. Assim como esta tecnologia de comunicação. foi desenvolvido um aplicativo no modelo cliente/servidor para o controle remoto de um dispositivo computacional J2SE. Por fazer parte de um pacote opcional. através de um dispositivo móvel J2ME que implemente a JSR 82. um pacote opcional pertencente a JSR 82 que fornece um conjunto de ferramentas para que aplicativos JAVA realizem a comunicação entre dispositivos através desta tecnologia de comunicação. a plataforma JAVA é utilizada no mundo todo. este trabalho apresenta uma análise baseada em custos e funcionalidades suportadas pelas principais implementações da JSR 82 para a plataforma J2SE presentes no mercado. Este trabalho apresenta os detalhes da tecnologia Bluetooth e demonstra a utilização da API JAVA para Bluetooth. Esta análise foi utilizada para selecionar a implementação utilizada na realização deste trabalho. Após esta seleção. I . Este aplicativo foi batizado de CRBluetooth e os detalhes técnicos de sua construção são apresentados neste trabalho.

............................................47 Ilustração 13.............................................................48 Ilustração 14.......................18 Ilustração 4: Topologia scatternet........................... Tela de busca de serviço............................................... Menu de opções.................19 Ilustração 5: Estados de conexão de dispositivos escravo........21 Ilustração 7: Pilha de protocolos Bluetooth.........27 Ilustração 9: Grupo dos protocolos de Middleware.....................57 Ilustração 15...................................................................................................................63 Ilustração 16...............LISTA DE ILUSTRAÇÕES Ilustração 1: Logo Bluetooth................................................. Tela de configurações......................................30 Ilustração 11: Plataformas JAVA...................................................................................................................... Adaptador Bluetooth USB.................... Tela principal do aplicativo cliente.................11 Ilustração 2: Topologia piconet......................................................64 II .......................................................................................................................................19 Ilustração 6: Relação entre estados de conexão e conservação de energia........................................................ Celular Nokia 6085................................................26 Ilustração 8: Grupo dos protocolos de transporte................................................................................................................................................................................................................................ Arquitetura do aplicativo CRBluetooth........................................63 Ilustração 17............64 Ilustração 19.....................28 Ilustração 10: Grupo de aplicação....................17 Ilustração 3: Funcionamento simultâneo de piconets........................................63 Ilustração 18................................................................................................................................ Ícone de bandeja do aplicativo servidor......41 Ilustração 12........................................................................

....................................................................................................................................39 Tabela 5: Exemplos de APIs........38 Tabela 4: Exemplos de APIs..........................LISTA DE TABELAS Tabela 1: Exemplos de faixas de freqüência regulamentadas (Scartezini..........................................................21 Tabela 3: Exemplos de JSRs......................................................................................................... 2007)......................53 III .....................................................14 Tabela 2: Classes de dispositivos................

...............................................................................................................29 6 Perfis Bluetooth.....................5............................................................5...................1 Grupo dos protocolos de transporte.2 O Fone de Ouvidos Sem-Fio......................................9 2........4 Classes de potência Bluetooth......1 O Computador Sem-Fio..........11 3 A Base tecnológica do Bluetooth....................23 4..............5..........................6 Sincronismo automático...................................................................19 4...........................2 Grupo dos protocolos de Middleware.........................................................SUMÁRIO 1 Introdução.........................24 5 A especificação Bluetooth...............................1 O Bluetooth Special Interest Group (SIG).........................23 4...................................................................1....................................1 Perfis Genéricos................15 4 A Solução Bluetooth de Comunicação por Rádio Freqüência.............................................................................................10 2.....................4 Conferência Interativa.......23 4........................................................................22 4............................................................12 3...................................................................25 5..22 4......................................................1 A pilha de protocolos Bluetooth................................4 GHz..................2 Bluetooth versus WLAN............................14 3....................17 4....26 5.................................................28 5..........................................................................................................................................1 Comunicação por rádio freqüência...........13 3....6 2 Introdução a Tecnologia Bluetooth..............3 Estados de conexão e conservação de energia................................................1 Mestres e escravos....................................................................3 Grupo de aplicação..................................................................................................................................................................................31 .5 Bridge de Internet..............2 O nome Bluetooth e sua história...................................................................................................................................5..........1 Rádio freqüência na faixa de 2...................21 4........31 6.........5........27 5...............................................................................1...................16 4............................................................................................1........................................1.........................................................................................................................................................................................................................................................2 Topologias de comunicação.........................................................5.........................................5 Exemplos de utilização......................21 4.3 O telefone três em um.....16 4...............................................................

....................6 Plataformas JAVA.....1 Escopo...................2 API JAVA para Bluetooth..............................................40 8 JAVA e Bluetooth..........................................................................56 10...............................................................6...................5 Imagens do aplicativo ..............69 .....................................5 6........2...............................4 Ciclo de vida Bluetooth do cliente.................2 Arquitetura.......................50 10...................................................................................................2....2.......1 Implementação da JSR 82 para J2SE..............................................................................55 10.....................................................6............................................................35 7....................................................................3 O JCP (Java Community Process)...............................................57 10...............................2.............................38 7....................................................................................................................50 10............................................................................................................1 Implementações analisadas.......5 APIs JAVA.................................1 Histórico da linguagem JAVA.................................58 10........................................................................................63 11 Conclusão...............................2................4 Perfis de Rede.........................3 Ciclo de vida Bluetooth do servidor.3 Perfil Serial e de Troca de Objetos......................................1 A Plataforma J2SE........................40 7................................................................1...................60 10........................................2 Java e suas utilizações....................................................................................44 9 Materiais e Métodos.......................35 7.....................................................................................................................................................................................................................................................53 10.........................33 7 Introdução à tecnologia JAVA....................................................................................................................................................39 7........32 6........................................2 O aplicativo proposto.....49 10............................46 10 Resultados e Discussões.......1 A JSR 82...............................................................................4 Introdução as JSRs (Java Specification Request).........................43 8..32 6..........2 Implementação escolhida.................................37 7................1........................2 A Plataforma J2ME.............................................................................................38 7.....................................................................................................................43 8.2 Perfis de Telefonia...........................................................................36 7........................................65 12 Apêndice A.................................................................................................................................................................................................................................

Estes computadores eram caraterizados por centralizar a capacidade de processamento e possibilitar seu uso simultâneo por diversos usuários. com capacidade computacional e de armazenamento menor do que a dos grandes computadores. a internet. que o faziam por meio de dispositivos de entrada e saída. funcionando como pequenas ilhas de processamento e de armazenamento de informação. Percebeu-se que estes dispositivos poderiam ser melhor aproveitados caso existisse um meio de comunicação entre eles. que possibilitaram o surgimento de uma das maiores invenções do homem contemporâneo. Entretanto. Isto impulsionou o surgimento de uma área muito vasta e complexa na ciência da computação. A evolução dos computadores foi acompanhada pela evolução das tecnologias para desenvolvimento de aplicativos para eles. assim como as páginas HTML podem ser visualizadas em diferentes dispositivos. . dispositivos móveis e ambientes corporativos cliente/servidor. inicialmente. O surgimento da internet motivou a criação de uma nova tecnologia para a criação de programas para computadores. mas suficiente para realizar as tarefas de seu interesse. os computadores de grande porte dominavam os ambientes computacionais. Surgiu então o computador pessoal. as redes de computadores. pobres computacionalmente. esses computadores pessoais não conseguiam se comunicar. onde os aplicativos escrito uma única vez com esta tecnologia poderiam ser executados em diferentes ambientes. enxergou-se a possibilidade de disponibilizar a cada usuário seu próprio computador. Posteriormente. mundialmente aceita e utilizada para o desenvolvimento de aplicativos para computadores. Esta tecnologia é a plataforma JAVA.1 INTRODUÇÃO Nos primeiros anos após o surgimento dos computadores. com o avanço da tecnologia e barateamento dos custos na produção de computadores.

este trabalho objetiva também realizar uma análise das implementações da JSR 82 disponíveis no mercado. é necessário uma tecnologia para que eles se comuniquem com periféricos e outros dispositivos. aliada a um baixo consumo de energia. redes de computadores e telecomunicação. adicionando a eles as facilidades da tecnologia Bluetooth. A tecnologia Bluetooth surgiu para possibilitar a comunicação entre dispositivos sem a utilização de fios. para seleção daquela que melhor se enquadra nas condições em que este trabalho foi realizado. computação. através de um único dispositivo. Uma das grandes contribuições da telecomunicação para a computação é a rádio freqüência. através da rádio freqüência. de maneira eficiente e segura. Esta tecnologia possibilitou a construção de redes de computadores em locais onde a utilização de cabos é inviável ou indesejada. Uma vez que pequenos dispositivos computacionais se tornam cada vez mais poderosos. o uso de baterias. O objetivo deste trabalho é introduzir a tecnologia Bluetooth. surge a convergência digital. Tendo em vista que tanto a tecnologia JAVA e Bluetooth estão disponíveis na maioria dos ambientes computacionais dos dias atuais. Com a evolução de todas estas ciências. é importante aos desenvolvedores conhecer como estas tecnologias podem ser utilizadas em conjunto. Tendo em vista que estas ferramentas estão presentes em um pacote opcional da tecnologia JAVA. o homem pode realizar diversas tarefas do seu cotidiano. suas utilizações e demonstrar o uso das ferramentas que a tecnologia JAVA disponibiliza nas plataformas J2SE e J2ME. sem comprometer seu funcionamento através de sua principal limitação. a fim de enriquecer ou viabilizar seus produtos. acessar a internet e ler email. a JSR 82. como assistir televisão.7 O campo das telecomunicações também evoluiu de maneira que a cada dia ficam menos evidentes as fronteiras entre esta área e a computação. . afim de que os desenvolvedores enriqueçam seus produtos. baseada basicamente em questões de custos de utilização e nos recursos implementados por cada uma delas. Esta tendência mundial leva a situações em que. como um telefone celular.

São enumerados também diversos exemplos de casos de uso desta tecnologia de comunicação. o conteúdo deste trabalho foi divido em tópicos. através da apresentação dos papéis dos dispositivos nos processos de comunicação.4 GHz. com seu histórico. o grupo mantenedor que define os caminhos desta tecnologia e suas plataformas de desenvolvimento. O comparativo entre as implementações da JSR 82. O capítulo 2 apresenta uma introdução a tecnologia Bluetooth. Também é apresentado um comparativo entre esta tecnologia e as redes sem fio (WLAN). apresentando os detalhes de seu meio físico de comunicação através das ondas de rádio freqüência na faixa de 2. Os detalhes da implementação da tecnologia Bluetooth são apresentados inicialmente no capítulo 5. . O capítulo 7 apresenta uma introdução a tecnologia JAVA. através da apresentação e da pilha de protocolos Bluetooth e seus integrantes. no capítulo 8 são apresentadas as especificações e ferramentas de software que permitem a integração entre estas duas tecnologias. e terminam no capítulo 6. estados de conexão e métodos de conservação de energia. JAVA e Bluetooth. a seleção da implementação utilizada. com o detalhamento dos perfis Bluetooth e suas utilizações. os responsáveis pela sua manutenção e uma breve descrição de sua história. No capítulo 3 os primeiros detalhes técnicos da tecnologia Bluetooth são abordados. No capítulo 9 são apresentadas as ferramentas utilizadas e os métodos a serem seguidos para que sejam alcançados os objetivos propostos. A conclusão deste trabalho é apresentada no capítulo 11 e o código fonte do aplicativo proposto está presente no Apêndice A. A infra estrutura da tecnologia Bluetooth é apresentada no capítulo 4. Finalmente. detalhes de sua especificação. exemplos de utilização. os detalhes do aplicativo construído e seu ciclo de vida Bluetooth são apresentados no capítulo 10 juntamente com os demais resultados.8 Para atingir os objetivos propostos. topologia de rede.

através de ondas de rádio. desde a sua fundação. Além disso. 1999). Nos dias atuais. por ser esta característica considerada essencial para a ampla aceitação da tecnologia Bluetooth no mercado. normalmente cerca de dez metros. Ela foi desenvolvida para possibilitar uma comunicação de curto alcance. tornando seu uso possível em dispositivos móveis e portáteis geralmente alimentados por baterias. para enviar e receber dados. a comunicação através de fios entre dispositivos é realizada de diversas formas. A especificação Bluetooth escrita pelo SIG descreve uma série de conceitos e padrões de comunicação sem fio para substituição de cabos seriais. A tecnologia Bluetooth é dita aberta por se tratar de um padrão de comunicação público e isento de licenças ou royalties para sua utilização. Miller e Bisdikian ressaltam ainda que a definição de um padrão verdadeiramente aberto tem sido o foco do SIG.2 INTRODUÇÃO A TECNOLOGIA BLUETOOTH O termo Bluetooth refere-se a especificação de um padrão aberto desenvolvido para possibilitar a comunicação a curta distância de voz e dados em qualquer lugar do mundo (Miller e Bisdikian. o que resulta em um padrão com baixo consumo de energia. de acordo com o SIG. A tecnologia bluetooth tem como objetivo prover esta mesma comunicação. . câmeras digitais e celulares e diversos outros tipos de cabos. como os utilizados pelos computadores e seus periféricos. como os utilizados por modens. substituindo os fios e conectores por uma interface que utiliza o ar como meio físico. com a utilização de uma grande variedade de cabos e conectores. Sua utilização também visa a substituição dos cabos no processo de comunicação entre dispositivos fixos ou móveis aliada a altos níveis de segurança.

a voz humana utilizada nos processos de comunicação baseados em voz é armazenada digitalmente. os engenheiros da Ericsson entenderam que esta tecnologia tornaria-se muito mais poderosa caso fosse amplamente adotada. Então. trazendo uma nova gama de possibilidades aos usuários. o ponto forte da tecnologia Bluetooth é a capacidade de transportar e interpretar voz e dados. entre outras. IBM. 2. percebeu o potencial no desenvolvimento de uma tecnologia de comunicação sem fio de curto alcance para a comunicação entre celulares e seus periféricos. juntaram-se a este grupo as empresas Microsoft. mas é o responsável por promover e dirigir o desenvolvimento da tecnologia Bluetooth e é através de seus membros que ela é implementada e comercializada através de seus produtos.1 O Bluetooth Special Interest Group (SIG) A organização responsável pela manutenção da especificação da tecnologia Bluetooth é o Bluetooth Special Interest Group. Lenovo. companhias que lideravam as áreas da telecomunicação e da computação se reuniram e fundaram o Bluetooth SIG. esta é uma organização sem fins lucrativos que não produz. no estado de Washington nos Estados Unidos. Muitas tecnologias de comunicação sem fio foram desenvolvidas para transportar dados e outras delas foram desenvolvidas para transportar apenas voz. Posteriormente. . Intel. Alguns anos mais tarde. A tecnologia Bluetooth foi idealizada pela Ericsson. também conhecido pela sigla SIG. que. manufatura ou vende dispositivos com a tecnologia Bluetooth. 2000). que atuam nas mais diversas áreas econômicas abrangendo telecomunicações. também conhecidos como membros promotores. em 1998. o SIG atualmente conta com mais de nove mil membros. Nokia e Toshiba. Nesta época. com foco no desenvolvimento de tal padrão aberto de comunicação (Miller e Bisdikian. De acordo com a descrição do SIG presente em seu site oficial. em 1994. Com sede em Bellevue. dentre seus fundadores. Atualmente. destacavam-se as companhias Ericsson. De acordo com o SIG. computação. Motorola e 3Com. indústria automotiva. música. automação.10 As fronteiras entre computação e comunicação estão cada dia menos claras. redes.

11 2. que nos dias atuais é reconhecido mundialmente: Ilustração 1: Logo Bluetooth . licenciado para os promotores e membros do grupo. foi responsável por unificar os exércitos da Dinamarca. Este rei dinamarquês. Existem diversas versões para sua origem mas. de acordo com o site oficial do SIG.2 O nome Bluetooth e sua história Um dos aspectos mais curiosos da tecnologia Bluetooth é seu nome. Ao longo dos anos. berço da tecnologia Bluetooth. e por tornar o cristianismo a religião oficial na Escandinávia. mostrado na ilustração 1. mas hoje se tornou a marca da tecnologia e do SIG. inspirado nas iniciais “H B”. da Suécia e da Noruega. e por sua história ter se passado na Escandinávia. seu nome serviu de referência para o batismo da nova tecnologia. a versão verdadeira e popularmente aceita é que este nome foi baseado em um antigo rei dinamarquês chamado Harald Blatand. ou Harald Bluetooth em inglês. uma vez que o objetivo da tecnologia Bluetooth é permitir a colaboração entre diferentes áreas da industria. O nome Bluetooth surgiu como um apelido ao projeto iniciado pela companhia Ericsson. o nome Bluetooth ganhou a companhia de um logotipo. que viveu entre os anos de 940 e 985. Por seus feitos de unificação.

a indústria da comunicação sem fio teve um crescimento explosivo com a criação de métodos de comunicação através da radio freqüência (Kumar. Kline e Thompson. A crescente dependência em relação a internet e a necessidade de estar conectado de qualquer lugar e a qualquer hora motivaram os avanços na computação e comunicação móvel. A invenção deste dispositivo permitiu que computadores se comunicassem entre si através da linha telefônica. Os padrões de comunicação sem fio de longo alcance geralmente utilizam faixas licenciadas do espectro.3 A BASE TECNOLÓGICA DO BLUETOOTH Os processos de comunicação podem ser efetuados de várias formas. A convergência entre computação e comunicação começou no início dos anos 60. 2003). redes de alta velocidade conectam servidores. regulamentadas pelos órgãos competentes. incluindo os métodos sonoros. Já os padrões de comunicação sem fio de curto alcance utilizam faixas gratuitas do espectro. A troca de dados utilizando estes métodos de comunicação levaram a utilização de termos como a “era da informação” (Miller e Bisdikian. entre outros. Kline e Thompson. Existem diversos padrões de comunicação de curto alcance no mercado. Os dias que os consumidores adquiriam computadores pessoais para executar aplicações stand-alone se foram e deram lugar ao desejo de utilização de ferramentas de comunicação (Kumar. e pagam taxas por isso. Nos últimos anos. computadores pessoais e outros dispositivos eletrônicos. Hoje em dia. 2003). O resultado foi o surgimento das redes de computador. mas os três principais . No domínio da eletrônica. a comunicação digital e analógica é tão presente na sociedade atual que é praticamente considerada um direito adquirido. O desejo de comunicação com computadores distantes motivou o surgimento da internet. escritos. com o desenvolvimentos dos modens. 2000). eletrônicos.

Os obstáculos refletem ondas de luz utilizadas em tecnologias como o infravermelho. De acordo com a National Instruments. operam na faixa de 88 mega-hertz até 108 mega-hertz. 2000). Destes três. Desta maneira. Alta potencia de transmissão é utilizada nas comunicações de longo alcance enquanto que a comunicação de curto alcance requer menos potência. mas as ondas de rádio podem. Como o espaço de freqüências disponível é finito. respectivamente. na Inglaterra. os governos regulamentam sua utilização particionando o espectro em faixas de freqüência e fornecendo licenças para sua utilização a níveis de potência especificados. A comunicação por rádio freqüência utiliza a modulação de freqüência para gerar ondas de rádio dentro de determinada faixa do espectro. no Canadá. por exemplo. Outro ponto importante da comunicação por rádio freqüência é a capacidade de penetrar em muitos objetos.13 são o infravermelho. No Brasil. não há a necessidade de alinhamento do receptor no campo de visão do emissor (Miller e Bisdikian. alimentados por baterias (Miller e Bisdikian. O mais promissor de seus resultados ocorreu em dezembro de 1901. e seus trabalhos foram o caminho seguido para os avanços nesta área obtidos por Guglielmo Marconi no início do século 20.1 Comunicação por rádio freqüência A tecnologia de comunicação por rádio freqüência utiliza emissores e receptores sintonizados para produzir e consumir. Ondas de rádio FM. apenas o infravermelho não utiliza a comunicação por rádio freqüência. A potência do transmissor e a sensibilidade do receptor ajudam a determinar a que distância ambos conseguem se comunicar. para St-Jonh's. transpor diversos obstáculos. 2000). ondas de rádio em uma faixa de freqüência pré-determinada. com certas limitações. as pesquisas em comunicação por rádio freqüência duraram quase um século através dos pesquisadores Alexander Popov e Sir Oliver Lodge. em artigo publicado no ano de 2008 em seu site oficial. o WLAN (Wireless Local Area Network) e o padrão Bluetooth. Desta maneira. o órgão responsável pela regulamentação e fiscalização do uso das faixas de . estes padrões que são focados na comunicação a alguns metros podem ser implementados em dispositivos pequenos. quando ele conseguiu com sucesso transmitir mensagens em código Morse de Cornwall. 3.

especializado em telecomunicações.5 GHz 2.9/2.4 GHz 5. que são transmitidos através do espectro dividido. A largura de banda é limitada em 1 mega-hertz.8 GHz 1. seu objetivo era fazer com que as informações a serem transmitidas se parecessem com um ruído radioelétrico evitando assim a monitoração pelas forças inimigas.1 GHz 3. algumas requerimentos e considerações devem ser atendidas para seu uso (Miller e Bisdikian. a técnica de espalhamento de espectro utilizada é a espalhamento por saltos em freqüência (FHSS. ANATEL. essa técnica foi desenvolvida pelo militares durante a segunda gerra mundial.4 giga-hertz ter sua utilização mundialmente gratuita. Apenas o receptor que conhecer o método de espalhamento dos pacotes através do espectro dividido conseguira interpretar a mensagem corretamente (Miller e Bisdikian.5 GHz Licença Livre Livre Restrita Restrita Restrita Utilização WLAN e Bluetooth Mesh e Wimax Celulares da terceira geração Wimax TV por assinatura Tabela 1: Exemplos de faixas de freqüência regulamentadas (Scartezini. 2000): ● ● ● ● O espectro é dividido em 79 canais.1 Rádio freqüência na faixa de 2. ou . Técnicas de espalhamento de espectro devem ser implementadas. denominadas pacotes.14 freqüência do espectro é a Agência Nacional de Telecomunicações. 2007) 3. do inglês Frequency hopping spread spectrum).1. As mensagens que devem ser enviadas são então divididas em diversas partes. baseadas na freqüência. no tempo ou em alguma outra característica. Interferências devem ser antecipadas e tratadas adequadamente. De acordo com o site Teleco. No caso da tecnologia Bluetooth. 2000). Faixa 2. A tabela 1 apresenta algumas faixas de freqüência regulamentadas por este órgão. Espalhamento de espectro se refere a técnica de dividir o espectro disponível em partes menores. Esta técnica consiste dividir o espectro disponível em diferentes freqüências.4 GHz Apesar da faixa de freqüência de 2.

Um pacote é transmitido em um determinado canal. ● ● É demasiado para pequenas transferências de dados. Esta tecnologia é utilizada também para substituição de cabos e transmissão de áudio. Apenas o receptor que souber a seqüência de canais selecionados pelo emissor conseguirá receber a mensagem corretamente (Miller e Bisdikian. A tecnologia WLAN. Conforme mencionado em sessões anteriores. com grande capacidade computacional. De acordo com Hopkins e Antony a tecnologia Bluetooth nunca substituirá a WLAN por deficiências no tratamento de: ● ● ● ● ● Grandes transferências de arquivos entre dispositivos. por sua vez. Apesar das diferenças. então o radio seleciona um novo canal para transmitir o novo pacote e o processo se repete. podendo consumir até 500 vezes mais energia que o padrão Bluetooth.15 canais. . muitas pessoas se questionam sobre a possibilidade de alguma destas tecnologias substituir a outra. a grandes velocidades. Requer muita energia para comunicação. nunca substituirá a tecnologia Bluetooth pois: Não pode ser utilizada para comunicação entre periféricos (exceto algumas impressoras). o objetivo da tecnologia Bluetooth é conectar pequenos dispositivos a baixas velocidades e em curto alcance a fim de se obter um baixo consumo de energia. Comunicação a longa distância. Esta tecnologia é utilizada para levar as redes locais de computadores a locais onde a passagem de cabos é cara ou indesejada. Não suporta comunicação de voz. 2000).2 Bluetooth versus WLAN O objetivo principal da tecnologia WLAN é conectar dois dispositivos relativamente grandes. 3.

Esta tecnologia utiliza. Dentre estas informações de sincronização estão os dados sobre o clock comum e a seqüência de . reutiliza protocolos de transporte e aplicação desenvolvidos anteriormente para outros métodos de comunicação.1 Mestres e escravos No processo de comunicação através do padrão Bluetooth. como o infravermelho (Miller e Bisdikian. utilização em dispositivos portáteis e baixo consumo de energia. O dispositivo que atua como mestre não adquiri nenhum tipo de privilégio especial.4 gigahertz e. surgiu. uma tecnologia para comunicação sem fio focada na substituição de cabos. é preciso conhecer os papéis dos dispositivos no processo de comunicação. a comunicação por rádio freqüência na faixa de 2. Qualquer um dos dispositivos envolvidos pode assumir ambos os papéis. em suas camadas superiores. em meados de 1998. um deles atua como mestre e o outro como escravo. mas é ele quem fornece a referência de sincronização para seus dispositivos escravos. 4. seus estados de conexão e as topologias de comunicação disponíveis. É permitido também que um dispositivo atue como mestre em uma conexão enquanto atua como escravo em outra (Miller e Bisdikian. 2000). 2000). quando dois dispositivos estabelecem uma conexão.4 A SOLUÇÃO BLUETOOTH DE COMUNICAÇÃO POR RÁDIO FREQÜÊNCIA Com base na tecnologia de comunicação por rádio freqüência descrita anteriormente. Para compreender mais afundo o funcionamento deste padrão. em suas camadas inferiores.

em geral. ou seja.2 Topologias de comunicação Com base nas características da tecnologia Bluetooth. efetuam os saltos no processo de espalhamento de espectro em uníssono. Quando dois dispositivos estabelecem uma comunicação ponto a ponto. existem dois tipos de topologias de rede possíveis no processo de comunicação entre vários dispositivos. basicamente.17 espalhamento utilizada no processo de comunicação (Misic e Misic. é atribuído ao dispositivo que inicia o processo de conexão. 2000). 2006). a piconet e a scatternet. Todos os dispositivos nesta configuração estão sincronizados. mas. A figura 2 ilustra a configuração desta topologia: Ilustração 2: Topologia piconet . 4. o papel de mestre ou escravo assumido pelos dispositivos é irrelevante para as camadas superiores e para seus usuários. geralmente. A topologia piconet consiste. os dispositivos operam como em uma comunicação ponto a ponto. Podem existir outros dispositivos dentro da área de abrangência da rede que não fazem parte de piconet (Miller e Bisdikian. O papel de mestre. A existência de um dispositivo no papel de mestre é importante para as camadas de base da tecnologia Bluetooth. na configuração de comunicação onde existe apenas um mestre ao qual estão conectados todos os escravos.

um grande número de piconets podem operar simultaneamente no mesmo espaço físico com o mínimo de interferência entre elas (Misic e Misic. . estabelecendo conexão e sincronismo com diferentes mestres na sua proximidade (Miller e Bisdikian. é possível que um dispositivo atue como escravo em uma piconet e como meste em outra. 2006). Esta topologia fornece um método flexível com o qual os dispositivos podem manter múltiplas conexões. A figura 4 ilustra uma scatternet formada através desta última possibilidade (Miller e Bisdikian. 2000). Sua formação também pode ocorrer quando um dispositivo atua com escravo em múltiplas piconets. A figura 3 ilustra esta característica: Ilustração 3: Funcionamento simultâneo de piconets Quando duas ou mais piconets se sobrepõe parcialmente no tempo e no espaço é formada uma scatternet. 2000).18 A seqüência de espalhamento pseudo-randômica é gerada por um algoritmo baseado no endereço Bluetooth do dispositivo mestre. Todos os princípios das piconets também se aplicam a uma scatternet. Graças a esta técnica. Para a formação de uma scatternet.

Estes estados são ACTIVE. este dispositivo escravo não precisa escutar as essas . existem quatro estados de conexão que podem ser assumidos pelo dispositivo escravo. A figura 5 mostra as transições possíveis entre estes estados.19 Ilustração 4: Topologia scatternet 4. o escravo está no estado ACTIVE na piconet. 2008). HOLD.3 Estados de conexão e conservação de energia No processo de comunicação entre dois dispositivos. Ilustração 5: Estados de conexão de dispositivos escravo Quando a conexão entre os dispositivos é criada. Entretanto. SNIFF e PARK (Bluetooth SIG. mantém seu endereço de estado ativo na rede e escuta transmissões do dispositivo mestre o tempo todo.

o dispositivo . A figura 6 mostra a relação entre os estados de conexão e o consume de energia. 2000). Já no estado SNIFF. o estado PARK permite ao dispositivo mestre manter conexão com mais de 7 dispositivos em uma piconet. o dispositivo escravo pode informar ao dispositivo mestre quando sua a potência de transmissão não está adequada. o dispositivo escravo se desliga da rede e periodicamente se conecta novamente. como procura de dispositivos e conexão com uma outra piconet. 2000). por um período determinado de tempo. Caso nenhuma transmissão seja iniciada ou detectada durante este período. denominado HOLD INTERVAL. No estado HOLD. sendo possível ao escravo a realização de outras tarefas. Assim como no estado HOLD. 2006). ele deve escolher por alterar seu estado para um dos modos nos quais ele se separa da rede por um determinado período de tempo. Este período de inatividade atinge apenas conexões já estabelecidas. o período de abstenção atinge apenas conexão já estabelecidas (Misic e Misic. HOLD e SNIFF são considerados ativos).20 transmissões todo o tempo. desta forma. Estes estados são chamados de HOLD e SNIFF. 2006). ele se desconecta novamente da rede para um novo período abstenção. Estas alterações de estado podem ser requisitadas tanto pelo dispositivo mestre quanto pelo escravo e seu objetivo principal é prover um método eficiente para economia de energia (Misic e Misic. No estado PARK o dispositivo escravo mantém sincronismo com o dispositivo mestre mas não é mais considerado no estado ativo (escravos nos estados ACTIVE. no qual ele libera seu endereço de estado ativo. sempre que necessário. 2006). o dispositivo mestre não ouvirá o dispositivo escravo por um período de tempo pré determinado. A duração do HOLD INTERVAL é negociada entre o dispositivos mestre e escravo (Misic e Misic. sem perder seu endereço na piconet. Tendo em vista que o dispositivo mestre pode armazenar apenas 7 endereços de estado ativo de dispositivos. outro recurso voltado a conservação de energia existente na tecnologia Bluetooth é a potência de transmissão adaptável (Adaptive transmission power) (Miller e Bisdikian. O escravo deve ir também para o estado PARK. Através dela. Este estado é que apresenta uma maior economia de energia (Miller e Bisdikian. por exemplo. Além dos estados de conexão. a fim de ouvir as transmissões do dispositivo mestre.

21 mestre pode ajustá-la. 2003) .5 mW 1 mW Alcance 100 metros 10 metros 1 metros Tabela 2: Classes de dispositivos 4. pelo alcance máximo médio permitido nos processos de comunicação. Este mecanismo é útil quando dois dispositivos que se comunicam estão próximos e a potência máxima de transmissão não é necessária. Estas classes se diferenciam basicamente pela potência máxima do rádio do dispositivo e. conseqüentemente.5 Exemplos de utilização Tendo em vista a solução de comunicação por rádio freqüência disponibilizada pela tecnologia Bluetooth. Ilustração 6: Relação entre estados de conexão e conservação de energia 4. Este processo é feito através do uso do indicador de força do sinal recebido (received signal strength indicator – RSSI). Miller e Bisdikian enumeraram alguns exemplos de sua utilização que .4 Classes de potência Bluetooth O hardware dos dispositivos que suportam a tecnologia Bluetooth estão divididos em 3 classes. Classe Classe 1 Classe 2 Classe 3 Potência do rádio 100 mW 2. A tabela 2 apresenta as classes dos dispositivos Bluetooth (Hopkins e Antony.

O uso da comunicação sem fio neste tipo de dispositivos traz liberdade ao seu posicionamento e uso. Os fones de ouvidos estão presentes também em vários celulares também para permitir que o usuário tenha as mãos livres em caso de estar dirigindo ou caminhando enquanto carrega algo.5. Conforme o título desta sessão.2 O Fone de Ouvidos Sem-Fio O uso de fones de ouvidos é muito comum nos dias atuais tanto com telefones fixos quanto com celulares. teclados. O usuário do fone de ouvido não fica fisicamente . um dos principais objetivos da tecnologia Bluetooth é a substituição dos cabos nos processos de comunicação. enquanto outros representam adaptações na utilização de um ou mais perfis. A tecnologia Bluetooth remove os cabos entre os telefones e os fone de ouvidos. Um lugar onde muitos cabos existem é o típico computador pessoal. Sua principal vantagem é prover mobilidade. o compartilhamento de dispositivos é facilitado nesta configuração em relação a um ambiente cabeado. sendo que muitos outros podem ser implementados de acordo com a criatividade e conhecimento do desenvolvedor.1 O Computador Sem-Fio Conforme descrito anteriormente.5. 4. Alguns destes exemplos são descritos na especificação da da tecnologia Bluetooth. joysticks. os fones de ouvido são utilizados com telefones convencionais para permitir que as pessoas tenhas as mãos livres para utilizar o computador. 4. Muitos cabos de periféricos utilizados nos computadores pessoais podem ser substituídos por conexões sem fio. impressoras e scanner podem ser posicionados em locais mais adequados no ambiente e dispositivos de interface como teclados e mouses podem ser utilizados em qualquer lugar que seja apropriado e podem se mover juntamente com o usuário ao invés de ficarem fixos em determinado local. por exemplo. como. Além disso.22 são mostrados a seguir. caixas de som e impressoras. estes são apenas alguns exemplos da utilização desta tecnologia. Caixas de som. Em ambientes de Call-Center. mouses.

O modelo de telefone três em um pode ser utilizado como telefone celular como seu funcionamento padrão. um simples telefone pessoal pode ser utilizado em todos os lugares. Além disso.4 Conferência Interativa Uma das mais uteis aplicações na área da comunicação da dados é a troca de arquivos.5.5. pode fazer o papel de muitos outros telefones. a internet exige a utilização de dispositivos especiais para que os computadores se conectem a ela.23 ligado ao dispositivo de áudio. seja através do acesso discado . Como a especificação Bluetooth oferece um padrão aberto. 4. em uma conferência. a utilização de vários pontos de acesso de voz pode resultar na redução das tarifas.5. Esta transferência de arquivos utilizando mídias ou redes cabeadas é muito comum. Por exemplo. equipado com a tecnologia Bluetooth. um no trabalho.5 Bridge de Internet Desde a sua criação. um ou mais em casa. Caso múltiplos pontos de acesso de voz com a tecnologia Bluetooth estiverem disponíveis no trabalho e em casa. com um ponte de acesso de voz ou para interação de áudio com um computador. Outra vantagem é a possibilidade de utilização de um único fone com diversos tipos de dispositivos.3 O telefone três em um Hoje em dia as pessoas utilizam vários telefones. A utilização da comunicação sem fio remove a necessidade de cabos facilitando a criação de conexões temporárias para a troca rápida de arquivos e dados. como um telefone sem fio conectado a uma base e como um walkie-talkie para comunicação direta com outros telefones nas proximidades. o mesmo fone de ouvidos pode ser utilizado com um telefone. um telefone celular entre outros. A principal vantagem deste esquema de uso é a substituição de três dispositivos por apenas um. A necessidade de separar telefones e seus números pode ser reduzido. A tecnologia Bluetooth provê a utilização destes dispositivos aliada a ausência de fios. 4. 4. como modens e adaptadores de rede. arquivos e cartões podem ser trocados entre os integrantes do encontro. Um simples telefone celular.

como a GPRS General Packet Radio Service. Por exemplo. 4. A tecnologia Bluetooth. como agenda de contatos e compromissos. notebooks e PDAs podem acessar a internet. sempre que estes dispositivos se encontrem em um espaço físico suficiente para a comunicação Bluetooth.6 Sincronismo automático Os dispositivos eletrônicos pessoais disponibilizam uma série de facilidades a seus usuários. O processo de sincronismo manteria as informações atualizadas e disponíveis. através do desenvolvimento de um aplicativo de proximidade. outros dispositivos como computadores. novas entradas em um calendário podem ser efetuadas em um notebook.5. é possível que estas informações estejam distribuídas em dispositivos diferentes. poderia tornar este processo de sincronismo automatizado. em um PDA ou um Smartphone.24 a provedores de internet ou através da passagem de IP em dispositivos que utilizam redes sem fio WLAN ou redes de dados sem fio das operadoras de telefonia móvel. por exemplo. possibilitando sua utilização em todos estes dispositivos. utilizando este celular como bridge ou modem para acesso redes de pacotes de dados ou redes dial-up. Desta maneria. elas precisam estar sempre atualizadas. poderia sincronizar sua agenda de compromissos sempre que estivesse próximo ao notebook de seu dono. Para que estas informações sejam úteis. . um celular presente no bolso de seu usuário. Entretanto. suas entradas em agendas e listas de afazeres seriam sincronizadas. respectivamente. em alguns casos. Através de um celular equipado com a tecnologia Bluetooth.

apesar destes novos conceitos. A especificação é dividida em 2 volumes. . grande parte da especificação trata a adaptação destes protocolos para o ambiente Bluetooth (Miller e Bisdikian. com muitas aplicações e público alvo diversificado.5 A ESPECIFICAÇÃO BLUETOOTH A especificação da tecnologia Bluetooth. os perfis Bluetooth. iniciando com cerca de 1500 páginas em sua versão 1. gerenciamento de conexão e a pilha de protocolos Bluetooth em uma abordagem seqüencial. Entretanto.0. o SIG adotou protocolos já existentes sempre que possível. indo desde detalhes do rádio até seus protocolos do grupo de aplicação. Ela contêm uma combinação de informações a respeito de hardware e software. O SIG considerou esta abordagem necessária devido ao grande número de novos conceitos criados juntamente com a tecnologia Bluetooth. tem sou foco principal no que os fabricantes precisam saber para criar produtos que utilizam este padrão aberto de comunicação. esta é a razão pela qual a especificação tem um tamanho tão extenso. dos protocolos de nível mais baixo ao mais alto. O segundo volume apresenta as especificações dos perfis Bluetooth. contendo informações sobre o rádio. O primeiro deles apresenta a especificação do núcleo da tecnologia. 2000). Este capítulo apresenta uma introdução sobre o volume 1 da especificação. O próximo capítulo apresenta uma abordagem sobre o volume 2 da especificação. contendo um nível de detalhamento básico necessário para a realização dos objetivos deste trabalho. assim como a maioria das especificações das tecnologias da área. mais precisamente sobre a pilha de protocolos Bluetooth.

O Bluetooth Host e o Blueooth Controller (ou rádio Bluetooth). O Bluetooth Host consiste no software sendo executado no dispositivo e geralmente está integrado ao software do sistema ou ao sistema operacional. A figura 7 apresenta a pilha de protocolos Bluetooth. desta maneira. A pilha de protocolos Bluetooth pode ser dividia em 2 partes. A seguir são descritos detalhes de cada uma destas camadas.26 5. O rádio Bluetooth por sua vez é geralmente um módulo de hardware. 2003). como acontece nos fones de ouvido. a tecnologia Bluetooth foi desenvolvida através de uma pilha de protocolos. Ilustração 7: Pilha de protocolos Bluetooth Uma divisão lógica da pilha de protocolos Bluetooth divide-a em 3 camadas: o grupo de protocolos de transporte.1 A pilha de protocolos Bluetooth Para atingir os objetivos propostos ao seu desenvolvimento. . que geralmente é um padrão de entrada e saída. conexão e troca de dados entre os dispositivos (Billo. É esta pilha de protocolos que permite a localização. Ele se comunica com host através do HCI. É sobre os protocolos presentes no Bluetooth Host que são implementados os perfis Bluetooth. o HCI não é utilizado (Kumar. Estas duas partes da pilha podem vir integradas em um único dispositivo. o grupo de protocolos de middleware e o grupo de aplicação. O Host Controller Interface (HCI) fornece uma interface padronizada para comunicação entre estas duas partes. como uma placa que se pluga a um dispositivo. 2003). Kline e Thompson. como o universal serial bus (USB) ou peripheral component microchannel interconnect architecture (PCMCIA).

A figura 8 apresenta a organização deste protocolo. A camada chamada Link Manager negocia as propriedades da interface existente entre os dispositivos. Acima do rádio temos a camada Baseband. através do uso de transmissores. É nesta camada que é efetuada a supervisão dos processos de paridade (criação de conexões confiáveis entre dispositivos através da criação e armazenamento de uma chave . a qual cria a interface de conexão Bluetooth.27 5. receptores e transceptores. configurar e gerenciar conexões lógicas e físicas. 2000).1 Grupo dos protocolos de transporte Este grupo é composto por protocolos que foram desenvolvidos para permitir que os dispositivos Bluetooth localizem uns aos outros para criar. os papeis de mestre e escravo e as regras para compartilhamento da interface através do ar criada. O projeto inclui vários parâmetros destinados a torná-lo um rádio ideal para a comunicação sem fio a curto alcance (Miller e Bisdikian. 2000). Ilustração 8: Grupo dos protocolos de transporte A camada inferior deste grupo apresenta o radio. É nesta camada que estão definidos os processos de procura por dispositivos. que permitem que camadas superiores e aplicações efetuem a troca de dados através destes protocolos (Miller e Bisdikian. A seqüência de espalhamento de espectro utilizada também é definida nesta camada (Miller e Bisdikian. 2000). As transmissões das informações através do ar são efetuadas pelo rádio. a conexão entre eles.1.

A figura 9 apresenta os protocolos desta camada. Esta camada suporta multiplexação.28 de autenticação) e criptografia dos dados trafegados através do ar entre os dispositivos envolvidos (Miller e Bisdikian. o que permite que múltiplos protocolos e aplicações compartilhem a interface (Miller e Bisdikian. 2000).Logical Link Control and Adaptation Protocol. Suporte para comunicação serial é um dos recursos principais para que a tecnologia Bluetooth alcance seu objetivo de eliminação de cabos nos processos de comunicação. O troca de arquivos em conexões ponto a ponto. Cada camada deste grupo define um protocolo que permite que as aplicações utilizem um nível de abstração elevado em relação aos detalhes da comunicação (Miller e Bisdikian.2 Grupo dos protocolos de Middleware Os protocolos da camada de Middleware utilizam os protocolos da camada de trasnporte para prover as camadas de aplicação interfaces padronizadas que devem ser utilizadas nos processos de comunicação. 2000). sincronização de dados e . A transmissão de dados é inicialmente roteada através da camada L2CAP . Ilustração 9: Grupo dos protocolos de Middleware A comunicação serial é uma das mais comuns formas de comunicação utilizada na computação nos dias de hoje.1. Esta camada esconde os detalhes dos protocolos das camadas de baixo nível dos protocolos das camadas de alto nível. 5. 2000).

implementadas através desta camada. A camada SDP – Service Discovery Protocol – define um padrão pelo qual os dispositivos podem descobrir e aprender sobre os serviços disponibilizados por outros dispositivos e também publicar seus serviços oferecidos ((Miller e Bisdikian. O protocolo PPP – Point-to-point Protocol – permite que dispositivos se conectem a pontos de acesso em uma rede baseada em IP. vMessage e vCal. essas redes utilizam o protocolo IP – Internet protocol – e os protocolos padrão da internet. Na maioria dos casos. a pilha de protocolos Bluetooth define portas seriais virtuai. O Infrared Object Exchange (IrOBEX ou simplesmente OBEX) apresenta um um protocolo para formatação e troca de dados com formatação conhecida. 2000). Este recurso de comunicação serial é implementado na tecnologia Bluetooth pela camada RFCOMM (Miller e Bisdikian.29 conexões dial-up são alguns dos serviços que utilizam a comunicação serial para serem executados. definido pela IrDA – Infrared Data Association -. HTTP e muitos outros. Apesar de o padrão Bluetooth apresentar uma topologia de rede ponto a ponto. compartilharem uma série de atributos. ele prove recursos para que os dispositivos possam ingressar em redes que utilizem a topologia das redes de computadores. o SIG decidiu adotar alguns protocolos e modelos de dados já existentes na tecnologia infravermelho para a tecnologia Bluetooth. 2000). Para facilitar o uso da comunicação serial. UDP. 2000). utilizações e aplicações. 5. 2000). como TCP.1.3 Grupo de aplicação O grupo de aplicação compreende o software localizado acima da pilha de protocolos Bluetooth. que facilitam a migração de aplicações que utilizam a comunicação serial cabeada para a comunicação Blueooth. os protocolos padrão da internet podem ser utilizados para que o dispositivo interaja com a rede (Miller e Bisdikian. Após estabelecida a conexão. como os padrões vCard. fornecido por fabricantes de dispositivos ou fornecedores independentes de . Já o Infrared Mobile Communication (IrMC) define métodos para sincronização destes dados (Miller e Bisdikian. Pelo fato de a tecnologia Bluetooth e o padrão infravermelho.

Kline e Thompson. sempre que a tecnologia Bluetooth é incorporada em uma nova plataforma. conexão dial-up. Ilustração 10: Grupo de aplicação O mais interessante neste grupo são as aplicações que instanciam os perfis Blueooth. Isto é. 2000). A especificação definida pelo SIG apresenta apenas os protocolos de transporte de middleware da pilha.30 software. comunicação com fones de ouvido e muitos outros. como um dos focos da tecnologia Bluetooth é estar presente um uma grande variedade de dispositivos. que realiza algumas funções que beneficiam o usuário do dispositivo. A figura 10 apresenta os componentes do grupo de aplicação. 2003). após implementada pilha de protocolos. as definições de interoperabilidade definidas nos perfis fornecem um espaço para que os fabricantes tenham diferenciais em seus produtos sem violar o funcionamento correto entre estes dispositivos de marcas e modelos variados (Miller e Bisdikian. A metodologia de postergar a escrita de APIs que implementam os perfis Bluetooth a terceiros foi adotada pois. estas APIs são geralmente melhor implementadas pelos especialistas na plataforma recém criada do que por especialistas na tecnologia Bluetooth. o desenvolvimento de uma simples API única para todos seria inviável (Kumar. Além disso. alguém precisa escrever o software para agregar a esta pilha funções como transferência de arquivos. Isto significa que. apesar de o desenvolvimento destas aplicações necessárias para satisfazer todos os cenários de uso e adicionar valores ao usuário final não estar sob os cuidados do SIG. .

2003). Ele fornece um método padronizado para a descoberta de serviços através da pilha de protocolos Bluetooth (Kumar. o SDAP descreve um serviço padrão para descoberta de modelos de aplicação e define algumas abstrações de primitivas de serviço que. que tem como objetivo promover interoperabilidade entre muitas implementações da pilha de protocolos. O SDAP apresenta um framework para comunicação entre a camada de aplicação e a camada SDP da pilha de protocolos. lembram as APIs. 2000). . mas representam características comuns compartilhadas sobre as quais outras aplicações podem ser escritas. Diferentemente dos outros perfis. Este capítulo apresenta uma breve descrição dos principais perfis Bluetooth. pareamento. definição de canais e estabelecimento de conexão (Miller e Bisdikian. O GAP é o perfil base de todos os outros perfis Bluetooth e visa a uso comum adequado dos protocolos de transporte por todos os perfis. Kline e Thompson. Isto inclui a descoberta de dispositivos. Este é o único serviço que apresenta a palavra application e é voltado principalmente aos desenvolvedores de aplicativos (Miller e Bisdikian. existem alguns perfis que não estão relacionados a casos de uso. A maior parte de sua implementação é voltada a definição de procedimentos necessário para estabelecer a comunicação entre dois dispositivos. Os perfis Bluetooth estão diretamente relacionados com os casos de uso desta tecnologia. em certos aspectos.1 Perfis Genéricos Este grupo de perfis é composto pelo Generic Acess Profile (GAP) e pelo Service Discovery Application Profile (SDAP). 2000). busca de dispositivos. Além disso.6 PERFIS BLUETOOTH O volume 2 da especificação Bluetooth apresenta os perfis Bluetooth. 6.

O último perfil deste grupo é o Headset Profile (HSP). 2003). o Generic Object Exchange Profile (GOEP) é um perfil abstrato sobre o qual perfis de uso concreto podem ser construídos. 2000). Este perfil é utilizado na maioria dos outros perfis. O SPP cria um interface de comunicação direta com o protocolo RFCOMM e estabelece as operações necessárias para manutenção de uma comunicação serial entre dois dispositivos . que é o uso mais comum deste perfil. Assim como o SPP. O Intercom Profile (IntP) também está relacionado ao caso de uso do telefone três em um. 2000). que permite a conexão de fones de ouvido sem fio a dispositivos de telefonia equipados com a tecnologia Bluetooth (Hopkins e Antony. Ele permite a dois dispositivos estabelecer uma conexão de voz direta através do ar pela interface Bluetooth. . O Cordless Telephony Profile (CTP) representa a premissa para o caso de uso do telefone três em um descrito anteriormente. o Intercom Profile e o Headset Profile. como papeis dos dispositivos. Esta conexão pode ser efetuada entre celulares.3 Perfil Serial e de Troca de Objetos Este grupo é composto pelo Serial Port Profile (SPP) juntamento com os perfis de troca de objetos. É este perfil quem permite a um celular utilizar a tecnologia Bluetooth para comunicação de voz através da conexão com uma central de voz e a computadores a ingressar em um sistema de telefonia sem fio através de seu microfone e suas caixas acústicas (Miller e Bisdikian.2 Perfis de Telefonia Os perfis de telefonia aqui tratados são o Cordless Telephony Profile. sendo mais utilizado como um middleware do que diretamente pelas aplicações (Miller e Bisdikian. como computadores e telefones sem fio (Miller e Bisdikian. sendo utilizado em muitos cenários de substituição de cabos. e também entre outros dispositivos que apresentem sua implementação. 6. 2000). Ele implementa uma série de elementos comuns entre os perfis de trocas de objetos.32 6.

como notas. mensagens e entradas em calendários . uma vez que este suporta transmissão bidirecional. O DUNP é um perfil localizado onde as áreas de computação e telefonia se confundem. o objetivo deste perfil é proporcionar o acesso a redes discadas. Certamente. O terceiro e ultimo perfil de troca de objetos é o Synchronization Profile (SP). como um telefone celular. 2003). mas inda tem seu tipo de objetos de transferência suportados restrito a arquivos e diretórios (Miller e Bisdikian. smartphones e PDAs (Hopkins e Antony. 2000). 2000). podem ser transferidos de um dispositivo para outro através deste perfil (Miller e Bisdikian. Ele também foi construído sobre o GOEP e utiliza o protocolo IrMC para sincronizar objetos. 2003). 2000). 6. outros tipos de objetos. O primeiro perfil a utilizar o GOEP é o Object Push Profile (OPP) que é o mais simples entre os perfis de troca de objetos. sem a utilização de cabos. 2000). Portanto. Este perfil basicamente define um caminho unidirecional para a transferência de objetos de formato conhecido. através de um dispositivo de telefonia. No caso onde dispositivos de telefonia se conectam a redes de telefone. Este perfil tem sua implementação voltada a notebooks. um dispositivo pode acessar esta conexão para acessar redes de dados. o Dial-Up Networking Profile (DUNP). um entre o dispositivo e o telefone e outro entre o telefone e sua linha (Miller e Bisdikian. A motivação principal para a criação deste perfil é a troca de informações de cartões eletrônicos no padrão vCard. o uso da tecnologia Bluetooth juntamente com este perfil pode eliminar 2 tipos de cabos. Este pode ser considerado o menos restrito e mais robusto do que o OPP. O File Transfer Profile (FP) é o segundo perfil a utilizar o GOEP. o LAN Access Profile (LAP) e o Fax Profile (FaxP). Este perfil utiliza o protocolo OBEX para troca de arquivos e diretórios. . Nesta situação.33 considerações de segurança e como o protocolo OBEX será utilizado (Hopkins e Antony. Sincronização de dados é uma aplicação popular e tem sido um dos casos de uso da tecnologia Bluetooth desde a sua criação (Miller e Bisdikian. atuando como modem.4 Perfis de Rede O grupo de perfis de rede consiste em três perfis.

um ponto de acesso de dados é utilizado para conexão com a rede. 2003). No caso do LAP. Este perfil estabelece protocolos de rede. . ao invés de um telefone ou um modem. através de um conexão Bluetooth. Um uso mais comum deste perfil é a conexão direta entre dois dispositivos para comunicação ponto a ponto (Miller e Bisdikian. o FaxP (Hopkins e Antony. Entretanto. Transmissão de fax ou de dados. para que os dispositivos acessem redes de dados em um ambiente sem fio. através de uma conexão discada. são muito similares. envolvendo modulação e demodulação de sinal. algumas diferenças existem e por este motivo o serviço de fax foi separada em um perfil próprio.34 O caso de uso do Bridge de Internet é possível graças ao perfil LAP. 2000). O último perfil deste grupo é um caso especial do DUNP.

2003). Ela é baseada na linguagem C++ e uma de suas principais particularidades é o fato de os aplicativos desenvolvidos através dela serem executados (ou interpretados) através da utilização da Máquina Virtual JAVA (em inglês. a linguagem C++ era amplamente utilizada no desenvolvimento de aplicativos industriais robustos. a menos que fossem recompilados. em meados de 1991. uma vez que arquivos ASCII escritos em HTML podiam ser traduzidos e gerar conteúdo interativo em qualquer computador. JVM – Java Virtual Machine). .7 INTRODUÇÃO À TECNOLOGIA JAVA A tecnologia JAVA é um linguagem de programação orientada a objetos. Através desta abordagem a linguagem JAVA apresenta grande portabilidade uma vez que o código de um aplicativo JAVA escrito e compilado pode ser executado em diversas plataformas. desenvolvida pela Sun Microsystems. desde que esta apresente uma Maquina Virtual JAVA em execução. a World Wild Web (Keogh. gratuita e de código fonte aberto. Programas escritos em C++ eram dependentes da plataforma para a qual foram compilados e não podiam ser executados em máquinas que utilizavam outras plataformas. 7. a linguagem JAVA nascia alimentada por uma das mais inovadoras tecnologias já criadas. O surgimentos das páginas de internet e dos navegadores revolucionaram o mundo da computação. A Máquina Virtual JAVA é um software encarregado de interpretar os bytecodes JAVA.1 Histórico da linguagem JAVA Enquanto. que são as instruções de máquina virtual geradas após a compilação do código fonte de um aplicativo JAVA.

em homenagem a um grande carvalho visualizado da janela do escritório. voltada ao desenvolvimento de aplicativos para dispositivos móveis como celulares. no mesmo ano em que a internet começou a ser comercializada. Apesar de a linguagem JAVA estar largamente associada a Internet. através da utilização de Máquinas Virtuais JAVA (JVM).36 O sucesso da internet trouxe o novo foco de desenvolver aplicativos independentes de plataforma. run anywhare (escreva uma vez. as quais algumas delas serão descritas aqui. quanto no ramo corporativo e no fornecimento de aplicativos de consumo popular. e J2ME. Através da política write once. Com o surgimento da plataforma J2EE. Eles levaram 18 meses para desenvolver uma linguagem que denominaram Aok. indústria em enorme ascensão na época (Keogh. a tecnologia JAVA ganhou popularidade tanto na indústria. smartphones e PDAs. rode em qualquer lugar). devido a uma marca de café importado. a linguagem JAVA conseguiu disponibilizar uma grande facilidade aos desenvolvedores. muitas aplicações e casos de uso da tecnologia JAVA. O aplicação mais óbvia da tecnologia JAVA é o desenvolvimento de aplicativos independentes de plataforma. além de outros propósitos. Então. Descobriu-se mais tarde já haver uma linguagem de programação com este nome e o nome foi alterado para JAVA. cinco engenheiros da Sun Microsystems se reuniram para criar uma linguagem de programação atendesse a essa nova demanda (Keogh. ela foi desenvolvida como uma linguagem voltada ao desenvolvimento de softwares embarcados nos dispositivos eletrônicos. voltada ao desenvolvimento de aplicativos corporativos em modelo cliente/servidor. despertada com o surgimento da Internet. esta tecnologia sofreu grandes avanços e melhorias. 2005). 2003). a tecnologia JAVA despertou o interesse do mundo corporativo e passou a ser amplamente utilizado para aprimorar a funcionalidade dos . Uma analogia interessante é dizer que a Máquina Virtual JAVA representa para os aplicativos JAVA o que um navegador WEB representa para uma página HTML. A Sun Microsystems anunciou a linguagem JAVA formalmente em 1995 (Deitel e Deitel. 7. Existem.2 Java e suas utilizações Ao longo dos anos. 2003). Ao longo do tempo. sendo as principais delas o surgimento das plataformas J2EE. portanto.

37 servidores WEB e desenvolvimento de sistema distribuídos em modelos cliente/servidor. Porém. fornece um ambiente seguro para a execução de aplicativos em cartões ou outros pequenos dispositivos com memória e capacidade de processamento limitados. Outro uso da tecnologia JAVA é o JavaCard. uma enorme lista de extensões presente no kit de desenvolvimento da linguagem JAVA e outras criadas por terceiros permitem a utilização desta tecnologia em muitas áreas e com diversas finalidades.3 O JCP (Java Community Process) Até 1998. Desenvolvedores e empresas podem ingressar ao JCP através da assinatura do JSPA (JAVA Specification Agreement) que é um acordo entre o interessado na participação e a Sun. era a própria Sun Microsystems quem decidia os caminhos a serem seguidos na evolução da linguagem JAVA. Foi assim que surgiu o JCP. também utilizado para o transporte de informações e capacidade de processamento. um órgão voltado ao desenvolvimento e revisão das especificações da tecnologia JAVA. 7. a linguagem JAVA continua sendo muito utilizada no desenvolvimento de aplicativos embarcados. ela decidiu abrir o processo de desenvolvimento da tecnologia JAVA à comunidade JAVA de todo o mundo. Conforme seu propósito inicial. Através da plataforma J2ME. Além destas utilizações listadas aqui. principalmente nas industrias de eletrônicos e automobilística. indo desde aplicativos de reconhecimento de voz a simulações em ambientes gráficos 3D. onde constam os direitos e as obrigações cabíveis a esta participação. com configurações muito próximas ao JavaCard mas com a aparência de um anel. ela passou a atingir também o desenvolvimento de aplicativos portáteis para dispositivo móveis. atualmente. em 1998. de acordo com a Sun Microsystems. . 2003). através da plataforma EmbeddedJava (Keogh. Muito similar ao JavaCard está o JavaRing. De acordo com a JCP. que. ela conta com mais de 1200 participantes incluindo empresas e participantes individuais. O trabalho do JCP é supervisionado pela Sun através de um grupo chamado Program Management Office (PMO).

38 7. Estes são documentos formais que descrevem especificações e tecnologias propostas a serem adicionadas ou modificadas a plataforma JAVA. De acordo com o JCP. Durante a elaboração de uma JSR diversas revisões formais e públicas são realizadas para aperfeiçoá-la até que ela atinja o estado de finalizada. ele encaminha ao PMO um documento chamado Java Specification Request ( JSR). JSR 47 51 54 63 80 82 Descrição APIs para criação de arquivos de registro Novas APIs de entrada e saída Especificação JDBC API para processamento de arquivos XML USB API JAVA API para Bluetooth Tabela 3: Exemplos de JSRs Existem JSR obrigatórias e outras opcionais. Quando um fabricante deseja fornecer suporte a determinada plataforma JAVA em seus produtos. e até mesmo o processo JCP está descrito em sua própria JSR. Este comitê é responsável por direcionar a evolução das tecnologias JAVA e é formado por diversas corporações.4 Introdução as JSRs (Java Specification Request) Após o JCP decidir o caminho que deve ser trilhado na evolução da tecnologia JAVA a respeito de determinado assunto. de acordo do a JCP. empresas e membros individuais.5 APIs JAVA Quando trata de funcionalidades da tecnologia. ele previsa desenvolver uma máquina virtual adequada a plataforma em questão que deve conter a implementação de todas as JSR obrigatórias desta plataforma e pode ou não conter implementações de JSRs opcionais. fornecimento de algum serviço ou suporte à alguma tecnologia. A tabela 3 apresenta alguns outros exemplos de JSRs. Atualmente. uma API (Application Programming Interface) é uma interface de . uma JSR pode dar origem a uma ou mais APIs. 7. sendo então votada pelo Comitê Executivo do JCP. existem cerca de 300 JSRs. geralmente. a JSR 215.

serviço ou tecnologia. mas existe outras plataformas além destas. pode ser executada em qualquer computador que apresente uma máquina virtual em execução sem nenhuma modificação. Aqui são apresentadas com mais detalhes as plataformas necessárias para elaboração deste trabalho. são implementações do conjunto de recursos da linguagem direcionados a ambientes de hardware específicos. As APIs JAVA fornecem uma série componentes JAVA que possibilitam o acesso aos recursos da linguagem JAVA em diversos contextos. mas não define como este comportamento deve ser implementado.6 Plataformas JAVA Em sua especificação. A tabela 4 apresenta algumas APIs da linguagem JAVA. Isto quer dizer que uma aplicação desenvolvida através da linguagem JAVA para um ambiente de computação pessoal (Desktop). . em sua definição original. como a plataforma J2EE. é um elemento abstrato. Uma API. por exemplo. de acordo com definição disponibilizada pela Sun Microsystems. API JAVA SE API JAVA EE API J2 ME API JavaCard API JavaMail JAVA APIs for Bluetooth Descrição Desenvolvimento de aplicações portáveis de uso geral Desenvolvimento de aplicativos para servidores Desenvolvimento de aplicativos móveis Desenvolvimento de aplicativos executados em cartões Envio e recebimento de e-mails Desenvolvimento de aplicativos que utilizam a tecnologia Bluetooth Tabela 4: Exemplos de APIs 7. que permite que cartões e outros dispositivos inteligentes de pequeno porte aproveitem as vantagens da tecnologia JAVA. que descreve a interface e o comportamento dos membros descritos na interface. e a plataforma JavaCard. O software que fornece suas funcionalidade é denominado implementação da API. que. a tecnologia JAVA apresenta algumas plataformas. que define padrões para o desenvolvimento de aplicações corporativas multi camadas baseadas em componentes.39 software que fornece acesso a algum recurso.

e as tecnologias para desenvolvimento para Desktop. equipamentos eletrônicos e automóveis (Kumar. a Maquina Virtual JAVA. Esta plataforma foi desenvolvida para tornar possível a criação de um ambiente JAVA em uma grande gama de dispositivos.6. ● JAVA Development Kit (JDK): é um superconjunto da JRE. 2003). o núcleo da tecnologia JAVA. Para atingir este objetivo. Kline e Thompson. como compiladores e depuradores. os perfis e pacotes opcionais. entre outras tecnologias. com recursos como acesso a bancos de dados e métodos de comunicação. Esta plataforma é a base para outras plataformas como a J2EE. que permitiram a criação de ambientes . foram criados as configurações. construir e executar aplicações JAVA. O JRE não apresenta ferramentas ou utilitários.1 A Plataforma J2SE A plataforma J2SE é a plataforma que apresenta a implementação do núcleo da tecnologia JAVA e um ambiente para desenvolvimento de aplicações pessoais (Desktop). esta plataforma apresenta o compilador JAVA. como portabilidade de código.6. ferramentas e APIs JAVA que permitem aos desenvolvedores escrever. e outros componentes para executar aplicativos escritos com a linguagem de programação JAVA. e contêm todos os componentes da JRE mais ferramentas como os compiladores e depuradores necessários para o desenvolvimento de aplicações.2 A Plataforma J2ME A plataforma J2ME traz as facilidade da tecnologia JAVA. existem dois principais produtos na família desta plataforma: ● JAVA Runtime Environment (JRE): fornece as bibliotecas. para dispositivos portáteis e dispositivos embarcados. 7. como telefones celulares. testar. programação orientada a objetos e um rápido ciclo de desenvolvimento. para o desenvolvimento de aplicações. A API da plataforma J2SE contêm. de acordo com o site oficial da tecnologia. Em sua composição. que fornece funcionalidades para escrever poderosos aplicativos empresariais.40 7. Além disso. com recursos como bibliotecas para construção de ricas interfaces gráfica.

2003). que operam com .1 Configuração e Perfis J2ME As configurações da plataforma J2ME são compostas por uma Máquina Virtual JAVA e um conjunto de bibliotecas. processadores mais robustos e maior banda de rede. eletrodomésticos e sistemas de navegação (Keogh. Ilustração 11: Plataformas JAVA 7. Kline e Thompson. smartphones e pagers.6. 2003).2. Atualmente. sobre os quais as aplicações podem ser construídas. que definem um conjunto de funcionalidades básicas para uma categoria de dispositivos em particular (Kumar. Exemplos de dispositivos que utilizam esta configuração são os set-top boxes de televisores. Dispositivos típicos com esta configuração são telefones celulares. PDAs. Esta configuração utiliza a arquitetura de 32 bits e implementa uma JVM totalmente funcional. A figura 11 apresenta as camadas da plataforma J2ME e sua relação com as outras plataformas JAVA.41 modularizados e customizáveis. ● Connected Limited Device Configuration (CLDC): é uma configuração menor e tem seu foco em dispositivos com menos recursos computacionais. a plataforma J2ME conta com duas configurações: ● Connected Device Configuration (CDC): tem seu foco em dispositivos com maior capacidade de memória.

2003). Outros perfis podem ser desenvolvidos sobre ele para fornecer funcionalidades as aplicações. A Máquina virtual JAVA utilizada neste perfil é denominada KVM. mas com grande capacidade de comunicação (Keogh. 2003). Kline e Thompson. Ele é a união do FP mais APIs para a criação de interfaces gráficas complexas (Keogh. Os perfis adicionam as funcionalidades e APIs necessárias para um ambiente completa de execução para uma classe de dispositivos.42 processadores mais lentos. que recebe esse nome devido ao seu tamanho reduzido (quilobaites. memória limitada e conexões de rede inconstantes. do inglês kilobytes). Apenas as configurações não fornecem uma solução completa. não têm relação nenhum com os perfis da plataforma J2ME. smartphones e PDAs (Keogh. ● Mobile Information Device Profile (MIDP): é utilizado com a configuração CLDC e contêm classes que fornecem persistência local. Os perfis Bluetooth definem um conjunto de funcionalidades dos protocolos Bluetooth para um determinado caso de uso. Os perfis definem as APIs de alto nível que fornecem funcionalidades de áreas específicas (Kumar. enquanto os perfis J2ME são um conjunto de APIs que adicionam funcionalidades a uma configuração J2ME. Aplicações desenvolvidas utilizando este perfil são denominadas MIDlets. 2003). definidos anteriormente. 2003). ● Personal Profile: destinado a dispositivos como organizadores pessoais e comunicadores. Estes dois tipos de perfis não são relacionados. É destinado a dispositivos que não apresentam interface com os usuário. o PDA Profile e o RMI Profile. Uma KVM é desenvolvida especialmente para dispositivos com capacidade de memória reduzida (Keogh. . interface com o usuário e funcionalidades de comunicação em rede para executar aplicações em dispositivos como celulares. Exemplos de outros perfis da plataforma J2ME são o Game Profile. Note que os perfis Bluetooth. Os principais perfis J2ME são: ● Fundation Profile: é o perfil mais baixo nível do CDC. 2003).

Umas desta aplicações possíveis é a comunicação via Bluetooth de aplicativos escritos através da linguagem JAVA. conhecido como Generic Connection Framework (GCF). 8. Kline e Thompson. Nokia. Foi pensando nesta possibilidade que JCP discutiu. 2003). que são assistidos pelas plataformas JAVA. O GCF é uma API que fornece suporte a um grande número de tipos de conexões e métodos de entrada e saída.8 JAVA E BLUETOOTH Já foram descritos alguns detalhes e as utilizações das tecnologia Bluetooth e JAVA.1 A JSR 82 Esta é a JSR responsável pela padronização da utilização da tecnologia Bluetooth nas plataformas JAVA. Mais precisamente. De uma forma mais precisa. Esta JSR é a responsável pela criação da API Java para Bluetooth (Kumar. a tecnologia JAVA apresenta várias aplicações e casos de uso. para que os objetivos proposto neste trabalho sejam alcançados. Motorola. é necessário saber como estas duas tecnologias se relacionam. Dentre estas empresas destacam-se a IBM. estavam 18 empresas e 3 participantes individuais. uma . Ele foi originalmente desenvolvido para a plataforma J2ME. seu objetivo é definir classes e métodos JAVA padronizados para a interação entre o software do desenvolvedor e a pilha de protocolos Bluetooth presente na plataforma em questão. através da criação da JSR 82. agora. criou e padronizou a integração da tecnologia Bluetooth nas plataformas JAVA. esta API é fortemente ligada ao um subconjunto da plataforma J2ME. Conforme descrito anteriormente. Em seu grupo de criação. Esta JSR definiu a API para Bluetooth como um pacote opcional para a plataforma J2ME baseados na configuração CLDC. Sony Ericsson e Symbian. APIs de terceiros e pacotes opcionais.

Muitas vezes. A idéia inicial para desenvolvimento da API JAVA para Bluetooth era construí-la baseando-se nos perfis bluetooth. O uso deste tipo de comunicação através da tecnologia JAVA está limitado aquelas plataformas onde há a implementação da JSR 82 adequada a pilha de protocolos Bluetooth existente. o GCF foi disponibilizado para a plataforma J2SE através da JSR 197. existem diversas implementações no mercado. Em dispositivos móveis que executam a plataforma J2ME. como um pacote opcional (Kumar. geralmente. 2003). Já para a plataforma J2SE. é uma implementação da JSR 82 para J2SE que suporta interface com as pilhas de protocolo Bluetooth do Mac OS X. os número de perfis Bluetooth estava em crescimento constante e seria impossível acompanhar estes novos perfis. de acordo com o software sobre o qual a plataforma é executada. o .44 vez que os pacotes tradicionais da J2SE utilizados para realizar sua tarefa eram muito grandes para o ambiente limitado onde a KVM é executada (Ortiz. é de responsabilidade do fabricante a escolha pela implementação ou não deste recurso. que. Um exemplo que pode ilustrar esta característica é a BlueCove. Kline e Thompson. desde que a API GCF também esteja presente no ambiente em questão. Ao invés disso. BlueSoleil e Microsoft. não são todos os ambientes JAVA que podem utilizar a tecnologia Bluetooth. Ela foi desenvolvida com o propósito de padronizar o uso dos protocolos Bluetooth.2 API JAVA para Bluetooth A API JAVA para Bluetooth promove a união entre as tecnologias JAVA e Bluetooth. Porém. a API JAVA pra Bluetooth passou a ser disponibilizada também para esta plataforma. de acordo com sua documentação. uma vez que ambas as APIs são opcionais. Após a disponibilização do GCF para a plataforma J2SE. uma vez que a especificação Bluetooth não traz tal padronização em seus documentos. 8. Posteriormente. Kline e Thompson. Esta API conta com 21 classes que a tornam simples de utilizar enquanto poderosa para exercer suas funções (Kumar. Por se tratar de um pacote opcional. 2003). as implementações desta JSR voltadas a plataforma J2SE utilizam-se de implementações da pilha de protocolos Bluetooth de terceiros. 2003).

registro de serviços e conexão através dos perfis RFCOMM. existem APIs para alguns perfis Bluetooth. Além destes protocolos. ● javax. SDP e L2CAP. a API JAVA para Bluetooth oferece capacidade para: ● ● ● ● Registrar Serviços. uma vez que estes são os protocolos base de grande parte dos perfis Bluetooth. SDAP. Conduzir as três acima de uma maneira segura. Esta API é formada por 2 pacotes: ● javax. L2CAP e OBEX. Procurar serviços e dispositivos.45 grupo de desenvolvedores decidiu fornecer suporte apenas aos serviços básicos e permitir que novos perfis sejam construídos através da linguagem JAVA sobre estes perfis básicos. Kline e Thompson.obex fornece classes e métodos para a conexão OBEX entre dispositivos. Os protocolos Bluetooth suportados pela API são o OBEX. em termos de funcionalidade. J2ME aborda os seguintes perfis em sua API: GAP. . RFCOMM e L2CAP. SPP e GOEP. De acordo com Kumar. Estabelecer conexões RFCOMM.bluetooth fornece classes e métodos para a busca de dispositivos e serviços.

9 MATERIAIS E MÉTODOS Tendo em vista os objetivos proposto e conhecendo a maneira como as tecnologias Bluetooth e JAVA se relacionam. a metodologia para realização deste trabalho abrange os seguintes passos: ● Pesquisar as implementações da JSR 82 para a plataforma J2SE. em ambientes Windows e Linux. Procura de dispositivos. através da API JAVA para Bluetooth.1) para envio de comandos remotos ao servidor criado no item acima. para ambiente Windows. existentes no mercado para comparação e seleção daquela que melhor se enquadra nas condições de realização deste trabalho. .. Este aplicativo também utilizará a API JAVA para Bluetooth e o perfil SPP para realizar estas tarefas.0 e CLDC 1. que funcionará como um servidor para recepção de comandos remotos através do perfil Bluetooth SPP. A implementação ideal procurada consiste em uma biblioteca gratuita. para ambiente Linux. A utilização do perfil serial Bluetooth foi escolhida pois este perfil é a base de muitos outros perfis já existentes e a referência para a criação de novos perfis por parte do usuário. implementar um aplicativo JAVA para a plataforma J2SE que contenha um serviço Bluetooth. Nenhum critério de desempenho será utilizado para a seleção da implementação da JSR 82 a ser utilizada. que implemente os perfis Bluetooth SPP e OBEX e que suporte as pilhas de protocolo Bluetooth Microsoft ou BlueSoleil. A elaboração destes aplicativos demonstrará a utilização das seguintes funcionalidades fornecidas pela API JAVA em conjunto com a pilha de protocolos Bluetooth: - Criação e divulgação de um serviço Bluetooth. ● Implementar um aplicativo J2ME (MIDP 2. ● Após a seleção de uma implementação da JSR 82 a ser utilizada neste trabalho. e BlueZ.

Adaptador Bluetooth USB ● Software BlueSoleil. Ilustração 12. Para executar a metodologia citada. Troca de dados através do perfil Bluetooth SPP. os seguinte materiais serão utilizados: ● ● Um Computador Pentium Dual Core 1. . Conexão a um serviço Bluetooth. da fabricante IVT Corporation. ● Um aparelho celular Nokia 6085. conforme ilustração 13 (retirada da página na internet do fabricante). equipado com a tecnologia Bluetooth e JAVA cuja KVM implemente a JSR 82. e sua pilha de protocolos Bluetooth.73 GHz. com 1 GB de memória RAM. Este software é fornecido juntamento com o adaptador USB para Bluetooth utilizado.47 - Procura de serviços. Um Adaptador USB para Bluetooth. conforme ilustração 12 (retirada da página na internet do fabricante).

Celular Nokia 6085 ● ● IDE Netbeans 6.0. .1.48 Ilustração 13. Biblioteca escolhida no primeiro item da metodologia.

10 RESULTADOS E DISCUSSÕES

Como já exposto anteriormente, uma implementação da JSR 82 consiste na criação do conjunto de classes que disponibilizam os serviços descritos na especificação da API JAVA pra Bluetooth à uma determinada plataforma computacional, possibilitando assim a utilização das facilidades providas pela tecnologia Bluetooth através da linguagem JAVA. Conforme descrito na metodologia deste trabalho, o aplicativo proposto será dividido em duas partes: um servidor e um cliente. O aplicativo servidor será executado sobre a plataforma J2SE, enquanto o cliente será executado sobre a plataforma J2ME. Tendo em vista que a JSR 82 representa um pacote opcional, torna-se necessária a escolha de uma implementação de terceiros desta JSR para a utilização de sua API em ambas as plataformas. Para o aplicativo J2ME foi utilizada a implementação da JSR 82 do fabricante do dispositivo móvel. O impacto desta decisão é que o aplicativo é corretamente executado apenas nos dispositivos móveis que apresentam uma KVM que implementa esta JSR, uma vez que a responsabilidade de ter acesso a implementação das classes da API Java para Bluetooth foi postergada a máquina virtual. Já para o aplicativo J2SE, foi necessário a análise e seleção de uma implementação da JSR 82 para plataforma J2SE para ser incluída ao aplicativo a ser desenvolvido. Esta implementação deve se enquadrar nas condições em que este trabalho foi elaborado. Após a escolha de uma implementação da JSR 82 para plataforma J2SE, foi desenvolvido o aplicativo proposto, que permite o controle remoto de um computador que apresenta a tecnologia Bluetooth e roda a plataforma J2SE através de um dispositivo Bluetooth que executa a plataforma J2ME e tenha implementado a JSR 82 em sua máquina virtual.

50

10.1 Implementação da JSR 82 para J2SE
Para que o aplicativo desenvolvido atenda os objetivos propostos por este trabalho, uma implementação da JSR 82 para a plataforma J2SE ideal deve satisfazer os seguintes requisitos:

Ser gratuita. Uma vez que este trabalho não tem nenhum fim lucrativo, gastos adicionais com licença sobre a implementação da JSR 82 inviabilizariam sua execução;

Ser multi-plataforma. Como a plataforma J2SE está disponível para diversos sistemas operacionais, o aplicativo proposto também deve ser suportado nestes diversos ambientes, possibilitando que o público-alvo deste trabalho execute-o e conheça como a tecnologia Bluetooth pode ser utilizada qualquer que seja seu ambiente de desenvolvimento;

Ser bem documentada. Principalmente na questão de sua instalação em ambientes computacionais não convencionais;

Suportar ambos os pacotes javax.bluetooth e javax.obex. Apesar do aplicativo desenvolvido neste trabalho utilizar apenas o perfil Bluetooth SPP, disponível através das classes presentes no pacote javax.blueooth, seria interessante que a implementação escolhida também fornecesse uma implementação das classes do pacote javax.obex, que permitem a troca de objetos, como arquivos e diretórios. Desta maneira, o público-alvo poderá desenvolver aplicativos para a troca de objetos sem a necessidade de buscar uma nova implementação da JSR 82.

10.1.1 Implementações analisadas Para a seleção de implementação da JSR 82 que melhor se enquadrou nas condições propostas foram analisadas as implementações descritas nesta sessão. Todas as informações a respeito das implementações analisadas foram retiradas da página na internet dos respectivos desenvolvedores.

51

10.1.1.1 Avetana
A Avetana é uma implementação da JSR 82 desenvolvida por uma empresa alemã de mesmo nome. Foi uma das primeiras implementações a surgir no mercado. Suas principais características são:
● ● ●

Perfis Bluetooth suportados: SDP, L2CAP, SPP, OBEX; Sistemas operacionais suportados: Windows 98 SE – XP, MacOS X e Linux; Pilha de protocolos Bluetooth suportadas: Widcomm e Microsoft para ambiente Windows, Bluetooth Software 1.5 para MacOS e BlueZ para Linux;

Preço: aproximadamente R$ 60,00; Os pontos fortes desta implementação são sua boa documentação e fácil instalação,

entretanto, além de não ser uma implementação gratuita, ela não suporta a pilha de protocolos Bluetooth BlueSoleil, utilizada por muitos adaptadores Bluetooth de menor custo no mercado, entre eles o utilizado no desenvolvimento deste trabalho.

10.1.1.2 EletricBlue
Esta implementação foi desenvolvida pela JSRSoft, uma empresa especializada na implementação de JSRs. Suas principais características são:
● ● ● ●

Perfis Bluetooth suportados: SDP, SPP e OBEX; Sistemas operacionais suportados: Windows XP/Vista; Pilha de protocolos Bluetooth suportadas: Microsoft; Preço: aproximadamente R$ 30,00; De acordo testes realizados e expostos no site do desenvolvedor, esta é a implementação

da JSR 82 que apresenta o melhor desempenho, entretanto sua documentação é pobre além de também ser uma implementação paga.

sua utilização é dependente da implementação de outro pacote opcional de terceiros. Apesar desta ser uma implementação gratuita. que apresentam Java embarcado. Esta implementação é a mais completa.4 Impronto Development Kit O Impronto é um kit de desenvolvimento para aplicações Java que utilizam Bluetooth desenvolvido pela Rococo Software.org.1. HCI e BCC. SPP.org O projeto JavaBluetooth. Este kit é constituído por uma implementação da JSR 82 acompanhada de simuladores e diversas outras ferramentas para auxiliar o desenvolvimento de aplicações Bluetooth através da linguagem JAVA. Preço: Gratuita. Além disso. L2CAP e SDP. Suas principais características são: ● ● ● ● Perfis Bluetooth suportados: L2CAP. Entretanto ela é uma implementação independente de sistema operacional.1. SDP. Preço: aproximadamente R$ 6000.1. Pilha de protocolos Bluetooth suportadas: Própria. ela utiliza uma implementação da pilha de protocolos Bluetooth própria. Sistemas operacionais suportados: Vários.1. entretanto o valor de sua licença limita sua utilização . Pilha de protocolos Bluetooth suportadas: Própria.00. Sistemas operacionais suportados: Windows e Linux. um dos mais antigos membros do JSR 82 Expert Group. uma documentação rica e de fácil utilização. tem suporte a muitos perfis Bluetooth. OBEX.3 JavaBluetooth.52 10. o GCF. Suas principais características são: ● ● ● ● Perfis Bluetooth suportados: HCI. 10. desde que a plataforma apresente a API opcional GCF implementada.org surgiu como um trabalho de conclusão de curso de alunos da Universidade Internacional da Alemanha e mais tarde passou a ser distribuído juntamente com os microcontroladores da plataforma TINI. 2008). testada atualmente apenas em chips que implementam a camada de transporte UART no HCI (JavaBluetooth.

1. Motorola e Siemens.5 para MacOS e BlueZ para Linux.5 BlueCove A BlueCove é uma implementação da JSR 82 de código fonte aberto. SPP. A Rococo é a desenvolvedora oficial das implementações da JSR 82 existentes nos dispositivos móveis das fabricantes Nokia.1. Linux e MacOS Preço R$ 60. Bluetooth Software 1. Implementação Avetana EletricBlue JavaBluetooth.00 Gratuita R$ 6000. Esta é uma documentação gratuita e rica em documentação. 10.obex Sim Sim Não Sim Sim Sistemas Operacionais Windows. Windows e Linux. L2CAP e OBEX. mantida sob a licença GPL.00 R$ 30. Linux e Mac OS Windows Qualquer (depende do GCF) Windows e Linux Windows.org Impronto BlueCove javax. 10. BlueSoleil e Microsoft para ambiente Windows. Suas principais características são: ● ● ● Perfis Bluetooth suportados: SDAP.53 ao uso comercial. Qualquer pessoa interessada pode se juntar ao grupo e dar a sua contribuição para a evolução desta biblioteca.2 Implementação escolhida Com base nas características da implementações da JSR 82 analisadas. A BlueCove disponibiliza também um simulador para execução de testes de aplicativos Bluetooth em ambientes onde esta tecnologia de comunicação não se faz presente. Pilha de protocolos Bluetooth suportadas: Widcomm.1.00 Gratuita Tabela 5: Exemplos de APIs .org. ● Preço: Gratuita.bluetooth Sim Sim Sim Sim Sim javax. através do grupo BlueCove. foi construído o quadro comparativo presente na tabela 5. Sistemas operacionais suportados: Mac OS. com diversos exemplos de como utilizá-la em sua página na internet.

dll foi extraído para “C:\Documents and Settings\Elio\Configurações locais\Temp\bluecove_Elio_0”.0.54 Com base nas informações contidas neste quadro. foi verificado que a implementação que melhor se enquadra nas condições propostas para a realização deste trabalho é a BlueCove. com implementação de ambos os pacotes da API Java para Bluetooth e suportar o maior número de sistemas operacionais. obtida no site do projeto BlueCove. e adaptadores USB. Esta biblioteca é um arquivo DLL que contém os métodos a serem executados pela biblioteca JAVA afim de efetuar a comunicação entre a API Java Bluetooth e a pilha de protocolos Bluetooth utilizada. Foi utilizada para a execução deste trabalho a biblioteca BlueCove em sua versão 2. No momento da execução do aplicativo. No caso da execução da aplicação em ambiente linux.1.jar. a biblioteca automaticamente extrai sua biblioteca nativa para a pasta temporária Java do usuário.2. deve-se incluir também no caminho de construção JAVA do projeto o arquivo bluecove-gpl. O processo de configuração da BlueCove é bastante simples e inicia-se com a inclusão do arquivo com extensão .1 Instalação e Uso Após a escolha da implementação da JSR 82 a ser utilizada o próximo passo a ser executado é sua instalação e configuração. A implementação escolhida também é a que suporta o maior número de pilhas de protocolos Bluetooth. o que torna o aplicativo desenvolvido compatível com um grande número de dispositivos Bluetooth. Neste caso. 10. O processo de instalação foi executado de acordo com os passos descritos na página na internet da documentação BlueCove. como o utilizado para a execução deste trabalho.jar. Neste trabalho.3. como os presentes em notebooks. possibilitando que ele seja executado em um grande número de ambientes computacionais.jar da biblioteca no caminho de construção JAVA (Classpath) do projeto. É este conjunto de características que agrega maior portabilidade ao aplicativo desenvolvido.0. o arquivo intelbth. por ser uma biblioteca gratuita. incluindo chips integrados. .3. o arquivo utilizado foi o bluecove-2.org.

que contém classes cujos métodos possibilitam acesso as facilidades desta tecnologia de comunicação. busca de dispositivos. O código fonte completo está disponível no Apêndice A. um aplicativo J2SE. Este aplicativo. . conforme descrito em etapas anteriores. implementado através das classes do pacote javax. basta utilizar as classes da API Java para Bluetooth e seus métodos para que a aplicação a desenvolvida tenha acesso as facilidades da tecnologia Bluetooth. como um computador pessoal ou notebook. como um celular ou smartphone. através de um dispositivo móvel executando a plataforma J2ME. 10.2 O aplicativo proposto Selecionadas as tecnologias necessárias para a execução deste trabalho. mas pode ser configurada manualmente através do parâmetro de execução da JVM bluecove. como criação e publicação de serviços. Com a utilização do GCF (Generic Connection Framework). que recebe as informações do dispositivo móvel e executa as ações adequadas. possibilita o controle remoto de um dispositivo executando a plataforma J2SE. arquitetura e ciclo de vida Bluetooth. o CRBluetooth é constituído por duas partes. A perfil Bluetooth utilizado nesta comunicação foi o SPP (Serial Port Profile). a troca de informações é efetuada com o uso de fluxos (Streams). batizado de CRBluetooth. busca de serviços e gerenciamento de conexões.stack. pertencentes ao pacote java. e um aplicativo J2ME. Após a execução destes passos.io. A seguir são descritos o escopo da aplicação. que envia ao computador as informações sobre o que deve ser feito. Neste caso. O processo de troca de dados entre as aplicações foi desenvolvido com a utilização da API JAVA para Bluetooth. a seleção automática foi utilizada.55 A seleção de qual pilha de protocolos Bluetooth será utilizada pela biblioteca também é efetuada de maneira automática. Para atingir estes objetivos. foi desenvolvido o aplicativo proposto.bluetooth.

. Quatro eventos de teclado podem ser executados através do acionamento de apenas uma tecla do dispositivo móvel. Esta metodologia faz com que o aplicativo esteja disponível apenas para as plataformas Windows.2. para ambiente J2ME MIDP 2.0. onde há a presença de alguma das pilhas de protocolos Bluetooth suportadas pela BlueCove. que permite ao usuário a entrada de um texto contendo a seqüência dos símbolos das teclas que ele deseja que sejam pressionadas no dispositivo remoto. Executar eventos de teclado.56 10. e a implementação nativa da máquina virtual. através da utilização das teclas de ação disponibilizadas pela Game API do perfil MIDP 2. que apresenta a JSR 82 implementada em sua máquina virtual. Linux e Mac OS. Estas configurações são: ● ● Velocidade de deslocamento do mouse. juntamente com a utilização de um dispositivo móvel J2ME que apresente a implementação da JSR 82 em sua KVM. para ambiente J2SE. Para seu desenvolvimento e teste foi utilizado um computador Pentium executando a plataforma Windows e a pilha de protocolos Bluetooth BlueSoleil.1 Escopo Conforme descrito anteriormente. Ações correspondentes as quatro teclas de acionamento rápido. O dispositivo móvel J2ME utilizado foi o aparelho celular Nokia 6085. O aplicativo J2SE possibilita ainda que o usuário salve algumas de suas configurações. Outra maneira de executar estes eventos é através da tela digitação. Efetuar o clique com o botão esquerdo do mouse.0 da plataforma J2ME (API para desenvolvimento de jogos). as implementações da JSR 82 selecionadas para o desenvolvimento deste trabalho são a BlueCove. Através da utilização deste aplicativo é possível realizar as seguintes tarefas remotamente: ● ● ● Mover o mouse nas quatro direções.

um componente de interface criado através da classe CustomItem.lcdui. Sempre que uma nova ação é capturada.2. para se comunicar com o servidor J2SE. Ação. Estas ações compreendem os comandos básicos disponibilizados pela Game API J2ME – Cima. Baixo.57 10. Ilustração 14. Botão B. Arquitetura do aplicativo CRBluetooth No lado cliente. pertencente ao pacote javax. é responsável por capturar as ações do usuário.2 Arquitetura Para atingir seu objetivo proposto. O Cliente CRBluetooth é o componente responsável por enviar os dados do evento executado pelo usuário ao servidor. . Esquerda. Direita. este componente identifica qual foi o evento executado e passa estes dados ao Cliente CRBluetooth. Implementado através da JSR 82 nativa e do GFC. Botão A. Botão C e Botão D.microedition. baseada no perfil SPP. o CRBluetooth foi desenvolvido segundo o esquema apresentado na figura 14. ele utiliza uma conexão Bluetooth previamente estabelecida com o auxílio da API JAVA para Bluetooth.

Botão D: Evento de teclado configurável (padrão: Tab).58 A troca de informações entre as duas partes do aplicativo é efetuada através do uso de fluxos (DataInputStream e DataOutputStream) pertencentes ao pacote java. Botão C: Evento de teclado configurável (padrão: Espaço). 10. o Servidor CRBluetooth verifica qual evento dos periféricos do sistema está mapeado para a ação recebida. Esquerda: Mover o mouse para a esquerda na direção horizontal.setDiscoverable(DiscoveryAgent. ele deve tornar o seu periférico Bluetooth detectável por outros dispositivos.getLocalDevice(). o aplicativo deve executar o seguinte método: LocalDevice. A abertura destes fluxos é possível graças aos métodos das classes do pacote GCF. afim de que possam encontrá-lo. Ação: Clicar com o botão esquerdo do mouse.io. Após verificar qual evento deve ser executado. O sistema operacional por sua vez executa o evento desejado pelo usuário.awt. Direita: Mover o mouse para a direita na direção horizontal. Baixo: Mover o mouse para baixo na direção vertical. Botão B: Evento de teclado configurável (padrão: Backspace).3 Ciclo de vida Bluetooth do servidor O primeiro passo para que o aplicativo J2SE possa receber conexões Bluetooth através do perfil SPP é a criação e divulgação de um serviço Bluetooth. do pacote javax. que é o responsável por encaminhar esta ordem de execução ao sistema operacional. Ao receber uma mensagem. Botão A: Evento de teclado configurável (padrão: Enter).2.GIAC). Para tornar-se detectável. O mapeamento a ser seguido é: ● ● ● ● ● ● ● ● ● Cima: Mover o mouse para cima na direção vertical. o Servidor CRBluetooth passa esta informação a um objeto da classe Robot. Além disso. .

servico = (StreamConnectionNotifier) Connector. o perfil Bluetooth Serial Port Profile. as informações de identificação utilizadas foram: public final String NOME_PROGRAMA = "CRBluetooth". com o auxílio do GCF. A criação do serviço. ● localhost: Endereço do serviço. possam detectá-lo.acceptAndOpen(). neste caso em que se deseja criar um novo serviço. Para registrar e divulgar o novo serviço Bluetooth. o próprio dispositivo. através dos métodos abaixo: String connectionString = "btspp://localhost:" + serviceUUID + ". o GIAC.open(connectionString). É possível também utilizar um nome para o serviço para auxiliar esta tarefa de identificação. ● ● serviceUUID: O número de identificação do serviço.servico. CRBluetoothServer. até mesmo os que nunca efetuaram uma conexão Bluetooth com o servidor. public final String SERVICE_UUID = "061020070110198603091986". Ela é composta por: ● btspp: Representa o protocolo de comunicação utilizado. seu registro e divulgação por parte da pilha de protocolos Bluetooth são efetuados. que representa uma seqüência qualquer de dígitos numéricos utilizada para a identificação do serviço. . CRBluetoothServer. name: Atributo opcional que contém o nome do serviço.name=" + serviceName. neste caso.59 O tipo de dispositivo selecionado.conexao = CRBluetoothServer. permite que qualquer outro dispositivo. Para este aplicativo. A String de conexão representa a identificação do serviço que será criado. o aplicativo deve criar um UUID.

o aplicativo deve executar o seguinte método.conexao.entrada = CRBluetoothServer. o servidor está pronto para efetuar a troca de informações com o cliente. Para iniciar a busca de dispositivos.4 Ciclo de vida Bluetooth do cliente O ciclo de vida do cliente apresenta mais passos sendo mais complexo em relação ao ciclo de vida Bluetooth do servidor. CRBluetoothServer. o servidor deve abrir os fluxos de dados. CRBluetoothServer. tendo previamente o UUID do serviço desejado configurado.conexao. ele deve saber a qual tipo de serviço deseja conectar-se. afim de que os dispositivos possam se comunicar.openDataOutputStream(). Já a terceira linha apresentada é responsável por escutar dispositivos remotos e criar as novas conexões assim que requisitadas pelos clientes. Para isso ele deve iniciar uma busca por dispositivos. Após a execução destas etapas. Para iniciar o ciclo. Esta abertura de fluxos é efetuada através das linhas de código abaixo.saida = CRBluetoothServer. o cliente deve obter uma lista dos dispositivos que estão ao seu alcance. respectivamente. Inicialmente.2.60 A segunda linha de código do último quadro executa a criação e publicação do serviço através da pilha de protocolos Bluetooth. É através desta classe que o dispositivo cliente pode se comunica com a camada SDP da pilha de protocolos Bluetooth para obter informações sobre os dispositivos remotos encontrados e os serviços disponibilizados por eles. Esta busca é efetuada através de uma classe da API Java para Bluetooth chamada DiscoveryListener. indicando uma instancia da classe DiscoveryListener que será responsável por tratar os eventos ocorridos durante a busca: . 10. As instruções relacionadas são responsáveis por abrir os fluxos de entrada e saída de dados. Sempre que uma nova conexão surgir.openDataInputStream().

GIAC. apenas o nome do serviço. int[] attrIDs = new int[]{ 0x0100 //Nome do servico }. apenas o UUID do serviço criado. neste caso. Finalizada a busca pelos dispositivos remotos.getDiscoveryAgent().startInquiry(Discover yAgent.searchServices(attrID s. listener). static final UUID uuid = new UUID(serverUUID.getDiscoveryAgent(). listener). UUID[] searchUuidSet = new UUID[]{uuid}. O objeto attrIDs apresenta o código dos atributos que devem ser trazidos juntamente com os serviços. ● inquiryCompleted(): este método é executado sempre que a busca por dispositivos é finalizada.getLocalDevice(). O objeto da classe DeviceClass apresenta os dados sobre a classe do dispositivo. O objeto serachUuidSet apresnta os UUIDs dos serviços buscados.getLocalDevice(). O objeto da classe RemoteDevice apresenta as informações sobre o dispositivo. Esta etapa é realizada através das seguintes instruções: static final String serverUUID = "061020070110198603091986". LocalDevice. remote. Os objetos da classe DiscoveryListener apresentam os seguintes métodos para o tratamento da busca de dispositivos: ● deviceDiscovered(RemoteDevice. . neste caso. como endereço Bluetooth e nome. DeviceClass): este método é executado sempre que um novo dispositivo remoto é encontrado. searchUuidSet. é necessário que o aplicativo verifique se o dispositivo remoto ao qual deseja conectar-se fornece o servido procurado.61 LocalDevice. false). Para isso ele deve efetuar uma busca pelos serviços fornecidos pelo dispositivo de acordo com os UUIDs desejados.

Os métodos mais importantes desta classe nesta etapa são: ● servicesDiscovered(int.62 Mais uma vez.streamConnection = (StreamConnection) Connector. através do método servicesDiscovered. int): método executado quando a busca por serviços do dispositivo remoto é finalizada.openOutputStream()). o aplicativo cliente está pronto para iniciar uma nova conexão utilizando a String de conexão obtida na fase de busca por serviços.authenticate=false”).saida = new DataOutputStream(CRBluetoothME.encrypt=false. CRBluetoothME. A String de conexão utilizada pelo cliente é parecida com a utilizada pelo servidor. ServiceRecord[]): método executado sempre que serviços relacionados a um dos UUIDs desejados são encontrados. Caso o serviço desejado seja encontrado no dispositivo remoto selecionado.openInputStream()). Uma nova conexão é criada através das seguintes instruções: CRBluetoothME.master=false.streamConnection. Após aberta a conexão com o servidor. CRBluetoothME. As diferenças básicas são o endereço do serviço. ● serviceSearchCompleted(int. O objeto ServiceRecord apresenta Strings que contêm os caminhos que devem ser utilizados para conexão aos serviços. . através dos métodos abaixo. que apresenta o endereço Bluetooth do dispositivo remoto. basta ao cliente efetuar a abertura dos fluxos de entrada e saída.streamConnection. e iniciar a comunicação com o dispositivo remoto.entrada = new DataInputStream(CRBluetoothME. é um objeto da classe DiscoveryListener o responsável por tratar os eventos ocorridos durante a busca por serviços de dispositivos remotos. e alguns parâmetros de configuração opcionais.open(“btspp://001167B72B6C:1.

63 10.2.5 Imagens do aplicativo

Ilustração 15. Ícone de bandeja do aplicativo servidor

Ilustração 16. Menu de opções

Ilustração 17. Tela de configurações

64

Ilustração 18. Tela principal do aplicativo cliente

Ilustração 19. Tela de busca de serviço

11

CONCLUSÃO

Com base nos resultados obtidos com o desenvolvimento deste trabalho, pode-se concluir que a plataforma JAVA é uma tecnologia de desenvolvimento de sistemas preparada para possibilitar o uso das facilidades da tecnologia Bluetooth. na comunicação entre sistemas. Através da disponibilização da API JAVA para Bluetooth e de uma implementação da JSR 82 voltada para o ambiente em questão, os desenvolvedores têm a mãos as ferramentas necessárias para enriquecer seus produtos com uma comunicação de curto alcance padronizada, livre de fios, com baixo consumo de energia e compatível com um grande números de dispositivos computacionais de inúmeros fabricantes, modelos e finalidades. No entanto, tendo em vista as inúmeras implementações desta JSR presentes no mercado, voltadas a diferentes dispositivos e ambientes computacionais, conseqüência da adoção desta JSR como pertencente ao conjunto das opcionais, é importante que os desenvolvedores, projetistas e arquitetos de sistemas estejam atentos a como esta tecnologia de comunicação será utilizada desde o início do projeto, pois uma combinação incompatível de dispositivos de hardware e software Bluetooth pode encarecer ou atém mesmo inviabilizar um projeto. Através do aplicativo proposto desenvolvido durante este trabalho, os desenvolvedores adquiriram uma ferramenta para estudo e consulta de como utilizar a API Java para Bluetooth na comunicação entre dispositivos. Dotados deste conhecimento, podem agora aplicar sua utilização em seus produtos, desenvolvendo diferentes soluções baseadas na tecnologia Bluetooth de acordo com sua necessidade ou criatividade. Ao longo prazo, os maiores beneficiados com este resultado serão os usuários. Com base nas características expostas sobre a tecnologia Bluetooth pode-se conhecer os motivos que a tornam líder mundial na comunicação a curto alcance entre dispositivos. Este padrão aberto de comunicação possibilita que dispositivos de diversos tipos interajam entre si

Como exemplos de possíveis trabalhos futuros podemos destacar: ● Efetuar um estudo comparativo mais aprofundado sobre as implementações da JSR 82 apresentadas levando em consideração questões como desempenho e consumo de recursos computacionais. . Construir aplicativos Bluetooth com outros propósitos como jogos. ● ● ● Construir um aplicativo que permita a visualização da tela do dispositivo controlado. é bastante provável que a tecnologia Bluetooth continue a liderar este segmento de comunicação a curto alcance por mais alguns anos. entre outros. elevado número de grandes empresas que fazem parte do grupo que coordena seus próximos passos e até mesmo pela falta de um concorrente a altura. Esta popularidade de ambas as tecnologias as tornam boas parceiras no desenvolvimento de aplicativos nas mais diversas áreas. Pelo conjunto das características da tecnologia. por sua vez. A tecnologia JAVA. sistemas móveis. entre outros. mobile marketing. a linguagem JAVA é a linguagem de programação mais popular do mundo desde o segundo semestre de 2004. De acordo com pesquisas organizadas pela Tiobe Programming Community. Construir um aplicativo para o controle de múltiplos dispositivos em uma scatternet. sistemas de informação. como entretenimento. comunicação com periféricos. sua consolidação no mercado atual. também vislumbra o crescimento de seu número de usuários nos últimos anos. ● Construir um aplicativo para a troca de objetos entre as partes cliente e servidor através do perfil OBEX. conhecer cada etapa que integra estes ciclos de vida e como utilizar a API JAVA para Bluetooth para contemplar cada uma destas etapas no processo de comunicação.66 aliados a um baixo consumo de energia. O aplicativo proposto levou aproximadamente 160 horas para ser desenvolvido e as principais dificuldades encontradas ao se trabalhar com as tecnologias em questão é compreender o funcionamento do ciclo de vida Bluetooth das partes cliente e servidor. segurança.

avetana-gmbh.javabluetooth. Florianópolis. ANTONY. JSRSOFT. Disponível em: http://www. 2005. 2008.com/Bluetooth/Technology/Building/Specifications/. BLUECOVE.google.jsrsoft. Site oficial: Disponível em: http://www. DEITEL P. BLUECOVE. Acesso em: 24 de mar. Acesso em: 24 de mar. Pearson Prentice Hall. 352 p. Site oficial. BLUETOOTH SPECIAL INTEREST GROUP.ORG. R. E. Produtos. 2003.ORG.com/Bluetooth/Technology/Basics. Uma pilha de protocolos Bluetooth adaptável à aplicação. 2008. Disponível em: http://www. JAVA COMMUNITY PROCESS.tw. HOPKINS. BlueCove Documentation.com/Bluetooth/SIG/. Acesso em: 12 de set. Acesso em: 10 de ago. Disponível em: http://www. 6ª Edição. 1110 p. 2008.1. DEITEL H. 2008.org/.org/. JAVA How to Program. Acesso em: 15 de mai. Bluetooth Basics. Apress.bluetooth.com.REFERÊNCIAS BIBLIOGRÁFICAS AVETANA. 2008.xml. B. Site oficial. Acesso em: 10 de ago. Disponível em: http://www. Disponível em: http://code. BRIGHT COMPUTECH CO. Site oficial.bluetooth. 2008. Bluetooth for JAVA. 2008. Disponível em: http://www. Avetana JSR-82 Implementation. BLUETOOTH SPECIAL INTEREST GROUP. Disponível em: http://jcp. Trabalho de conclusão de curso (Ciência da Computação) – Universidade Federal de Santa Catarina. BILLO. .bluetooth.com/p/bluecove/wiki/Documentation. Disponível em: http://www. JAVABLUETOOTH. BLUETOOTH SPECIAL INTEREST GROUP. Acesso em: 09 de ago. 2008. Acesso em: 10 de set.htm.de/ avetana-gmbh/produkte/jsr82. About the SIG.bluecove. 2008. Acesso em: 24 de mar. 2003. J.brightcomputech.eng. 2008. M. Disponível em: http://www. Bluetooth Specification Version 2.com.org/. Acesso em: 14 de mai.

TIOBE PROGRAMMING COMMUNITY. J. Tutorial Banda Larga e VOIP: O que é Spread Spectrum. JAVA Card Technology.com/javacard. NATIONAL INSTRUMENTS. BISDIKIAN. C.sun. Acesso em: 14 de mai.br/tutoriais/tutorialss/pagina_1. Prentice Hall. Acesso em: 10 de set.sun. Bluetooth Application Programming with the JAVA APIs.com. 2008.com/overview.com/index. Guia das cidades digitais. V.com/devzone/cda/tut/p/id/3541. N. KEOGH.html. C. JAVA Technology Overview. 2008. 2003. Acesso em: 31 de mar. TELECO. 745 p.br/site/pagina/o-quebra-cabea-das-frequncias. Bluetooth revealed. The Generic Connection Framework. Disponível em: http://www. SUN MICROSYSTEMS. 189 p.com/mobility/midp/articles/genericframework/.rococosoft. SUN MICROSYSTEMS.com/java.sun. MILLER.br/link? cid=EDITORIAL_472597. Disponível em: https://developers. Acesso em: 14 de mai.tiobe. 2007. Disponível em: http://www. ROCOCO SOFTWARE LTDA. J2ME: The Complete Reference. THOMPSON. JAVA SE Technologies al a Glance. Acesso em: 09 de ago.com/javase/technologies/index. MAXIM INTEGRATED PRODUCTS. 2008. Acesso em: 14 de mai. Nokia 6085. Disponível em: http://java. 2008. Acesso em: 22 de set. Disponível em: http://www. J.nokia. Introduction to RF & Wireless Communications System.html. MISIC.maxim-ic. NOKIA BRASIL. Performance Modeling and Analysis of Bluetooth Networks.com/products/microcontrollers/tini/. 1 de ago. T. B. KLINE. Tiobe Index for September 2008. SUN MICROSYSTEMS. Disponível em: http://java. O quebra-cabeça das freqüências. 2008. 2008. DALLAS SEMICONDUCTOR. Disponível em: http://www. Impronto Development Kit. ORTIZ C.com. . SCARTEZINI. Disponível em: http://www. 2008.jsp.com. TINI Network Microcontrollers. Disponível em: http://www. McGraw-Hill.guiadascidadesdigitais. Auerbach Publications. 18 de dez. 2008.sun.asp.teleco. 2006. 2000. 2003. Disponível em: http://zone. Disponível em: http://java. Morgan Kaufmann. 2008. 2003. MISIC. Acesso em: 10 de set.68 KUMAR. 498 p. Acesso em: 31 de mar.ni.php/content/paperinfo/tpci/index. P.

out.entrada = CRBluetoothServer. public ConexaoBluetooth() { } public void run() { try { CRBluetoothServer.DataInputStream.java package comunicacao. while (!lido.IOException.util.entrada.conexao. ServicoCtrl servicoCtrl = new ServicoCtrl().io.openDataInputStream().CRBluetoothServer.println("lido: " + lido). . java. import import import import import import import import controle.ServidorCtrl. controle.Constantes.logging.openDataOutputStream(). System.readUTF(). public class ConexaoBluetooth implements Runnable { ServidorCtrl servidorCtrl = new ServidorCtrl().Level.logging. String lido = CRBluetoothServer.12 APÊNDICE A Código-fonte do aplicativo servidor ConexaoBluetooth.equals(Constantes.out.util. java.readUTF().STR_FECHA_CONEXAO)){ servicoCtrl.io. principal. java.println("lido: " + lido). CRBluetoothServer. utils. lido = CRBluetoothServer.conexao.saida = CRBluetoothServer.avaliar(lido).entrada.Logger.ServicoCtrl. java. System.

java package comunicacao. javax.Level.StreamConnectionNotifier.printStackTrace().Connector. import import import import import import import import import import import import controle.logging. String connectionString = "btspp://localhost:" + serviceUUID + ".microedition. java. } } } IniciarServicoBluetooth. java. servidorCtrl.DiscoveryAgent. while (true) { CRBluetoothServer. javax.util. javax.clienteConectado().GIA C).microedition.conexao = CRBluetoothServer. } .ServidorCtrl.setDiscoverable(DiscoveryAgent.io.microedition. } finally { servidorCtrl.SERVICE_UUID. javax.util.clienteDesconectado().logging.bluetooth. private final String serviceName = Constantes.CRBluetoothServer. principal.getLocalDevice(). CRBluetoothServer. utils.70 } } catch (IOException ex) { ex.LocalDevice.Logger. private final String serviceUUID = Constantes. javax. javax.bluetooth. public IniciarServicoBluetooth() { } public void run() { try { LocalDevice. public class IniciarServicoBluetooth implements Runnable { ServidorCtrl servidorCtrl = new ServidorCtrl().IOException.io.bluetooth.io.Constantes.name=" + serviceName.NOME_PROGRAMA.io.servico = (StreamConnectionNotifier) Connector.open(connectionString). java.BluetoothStateException.acceptAndOpen().servico.StreamConnection.

ex).SEVERE. CRBluetoothServer.writeInt(indiceA).io.indiceC = indiceC. int indiceC. public class ConfiguracaoCtrl { public void salvarConfiguracao(int indiceA.indiceB = indiceB. output = new DataOutputStream(new FileOutputStream(file)). utils.URL.DataInputStream. try { URL url = this.CRBluetoothServer.indiceMouse = indiceMouse. int indiceB.log(L evel.io. java. principal.setWritable(true).io.EOFException.getClassLoader(). . file.SEVERE.class.FileInputStream.getClass(). java.exists()) { file. int indiceMouse) { CRBluetoothServer. } catch (IOException ex) { Logger.java package controle. java.class.bin"). CRBluetoothServer. } file. import import import import import import import import import import java.indiceD = indiceD. if (file. DataOutputStream output = null. telas.DataOutputStream. ex).getPath()).writeInt(indiceB).getName()). null.Constantes. output.71 } catch (BluetoothStateException ex) { Logger. File file = new File(url. CRBluetoothServer. java.indiceA = indiceA. int indiceD. java.log(L evel.SysTrayIcone. null.io. } } } ConfiguracaoCtrl.delete().io.getName()).getResource("recursos/conf. CRBluetoothServer.io.getLogger(IniciarServicoBluetooth.createNewFile().getLogger(IniciarServicoBluetooth.net.File.FileOutputStream. java. output.

} } catch (Throwable e) { } } public void recuperarConfiguracao() { DataInputStream input = null. CRBluetoothServer.getInstance().writeInt(indiceD). CRBluetoothServer.MSG_ERRO). CRBluetoothServer.readInt(). SysTrayIcone.NOME_PROGR AMA.close(). input. Constantes.readInt(). } } catch (Throwable e) { } } . output. output.getInstance().getClass().getResource("recursos/conf.getClassLoader().mostraMensagem(Constantes.readInt(). input = new DataInputStream(new FileInputStream(file)).72 output.getPath()).indiceC = input. } finally { try { if (output != null) { output. } catch (Throwable e) { SysTrayIcone.bin").close().readInt(). SysTrayIcone. try { URL url = this.flush().setReadable(true). } catch (EOFException eof) { } catch (Throwable e) { SysTrayIcone. CRBluetoothServer.mostraMensagem(Constantes.writeInt(indiceMouse). output.indiceMouse = input.readInt().close(). file.indiceA = input.indiceB = input.writeInt(indiceC).MSG_ERRO_CARREGAR_CONF. CRBluetoothServer.indiceD = input. } finally { try { if (input != null) { input.MSG_ERRO_SALVAR_CONF. Constantes.MSG_ERRO).NOME_PROGR } AMA. File file = new File(url.

RequisicaoMouseMove.equals(Constantes.EIXO_PARADO.SERVICO_MOUSE_LEFT)) { requisicao = new RequisicaoMouseMove(RequisicaoMouseMove.73 } } ServicoCtrl.EIXO_RECUA.SERVICO_MOUSE_UP)) { requisicao = new RequisicaoMouseMove(RequisicaoMouseMove. public void avaliar(String operacao) { requisicao = null.RequisicaoTeclado.java package controle.SERVICO_MOUSE_DOWN)) { requisicao = new RequisicaoMouseMove(RequisicaoMouseMove.EIXO_AVANCA). import import import import import import import requisicoes.RequisicaoMouseClique.EIXO_PARADO.TECLA_C).SERVICO_MOUSE_RIGHT)) { requisicao = new RequisicaoMouseMove(RequisicaoMouseMove. }else{ if(operacao. utils. if (operacao. telas. .TECLA_B).Requisicao. }else{ if (operacao.EIXO_AVANCA.EIXO_PARADO). requisicoes.SERVICO_TECLA_B)){ requisicao = new RequisicaoTeclaEspecial(RequisicaoTeclaEspecial. }else{ if(operacao.equals(Constantes.SysTrayIcone.Constantes.SERVICO_MOUSE_CLICK)){ requisicao = new RequisicaoMouseClique(). RequisicaoMouseMove. }else{ if (operacao.equals(Constantes.TECLA_A). requisicoes.SERVICO_TECLA_A)){ requisicao = new RequisicaoTeclaEspecial(RequisicaoTeclaEspecial.equals(Constantes.equals(Constantes.EIXO_RECUA). requisicoes. RequisicaoMouseMove. public class ServicoCtrl { Requisicao requisicao = null. requisicoes.equals(Constantes.RequisicaoTeclaEspecial.SERVICO_TECLA_C)){ requisicao = new RequisicaoTeclaEspecial(RequisicaoTeclaEspecial. RequisicaoMouseMove.RequisicaoMouseMove. }else{ if(operacao. }else{ if(operacao. }else{ if (operacao.equals(Constantes.EIXO_PARADO).equals(Constantes.

conexao != null) { clienteDesconectado().awt. CRBluetoothServer. utils.getInstance().close().IOException.ConexaoBluetooth. Constantes. comunicacao. SysTrayIcone.TECLA_D). } if (CRBluetoothServer.MSG_SERVIDOR_INICIADO.servico = null.getInstance().java package controle. } catch (IOException ex) { .equals(Constantes. java.SysTrayIcone.74 }else{ if(operacao.Robot.io. telas. }}}}}}}}} if (requisicao != null) { requisicao. SysTrayIcone.getInstance().executa(). public class ServidorCtrl { public void iniciarServidor() { IniciarServicoBluetooth servico = new IniciarServicoBluetooth(). } } } ServidorCtrl.SERVICO_TECLA_D)){ requisicao = new RequisicaoTeclaEspecial(RequisicaoTeclaEspecial. import import import import import import import import comunicacao.NOME_PROGR AMA + " .MSG_INFO).MSG_SERVICO_DESCONHECIDO + operacao.Erro".mostraMensagem(Constantes.AWTException. java.MSG_ERRO).NOME_PROGRAMA.IniciarServicoBluetooth. java. } public void pararServidor() { if (CRBluetoothServer. t. SysTrayIcone.servico.awt. SysTrayIcone.mostraMensagem(Constantes. Thread t = new Thread(servico).CRBluetoothServer.start(). }else{ requisicao = new RequisicaoTeclado(operacao).servico != null) { try { CRBluetoothServer.setIniciado(true).Constantes. } else { SysTrayIcone. principal. Constantes.

robot = new Robot(). SysTrayIcone.MSG_ERRO).printStackTrace(). SysTrayIcone. try { if (CRBluetoothServer.entrada.writeUTF(Constantes.setIniciado(false).entrada. } } public void clienteDesconectado() { CRBluetoothServer. Thread t = new Thread(conBluetooth).setConectado(true).saida. } public void desconectarCliente() { try { if (CRBluetoothServer. SysTrayIcone. SysTrayIcone. Constantes.MSG_INFO). .start(). CRBluetoothServer. } ConexaoBluetooth conBluetooth = new ConexaoBluetooth().saida.saida != null) { try { CRBluetoothServer.mostraMensagem(Constantes. SysTrayIcone.mostraMensagem(Constantes.getInstance().MSG_INFO).getInstance().75 } } SysTrayIcone.printStackTrace().getInstance().printStackTrace().NOME_PROGRAMA.close(). } catch (Throwable e4) { e4.entrada != null) { CRBluetoothServer.close(). } } catch (IOException e3) { e3.STR_FECHA_C ONEXAO). Constantes. return.close(). } catch (AWTException e) { SysTrayIcone.getInstance(). } public void clienteConectado() { try { CRBluetoothServer.NOME_PROGRAMA. SysTrayIcone.MSG_ERRO_CRIAR_ROBOT. } try { if (CRBluetoothServer.saida = null.robot = null.MSG_SERVIDOR_PARADO.getInstance(). Constantes. t. } }catch (Throwable e) { e.mostraMensagem(Constantes. } CRBluetoothServer.MSG_DISPOSITIVO_CONECTADO.NOME_PROGR AMA.entrada != null) { CRBluetoothServer.

conexao. conf. DataInputStream entrada = null. } public void fecharServidor() { pararServidor(). java.76 CRBluetoothServer. } } catch (IOException e2) { e2. System. CRBluetoothServer.MSG_INFO). SysTrayIcone.exit(0). } try { if (CRBluetoothServer. } } CRBuetoothServer. telas. SysTrayIcone icon = SysTrayIcone. indiceB = 1.io. import import import import import import import controle.DataOutputStream.DataInputStream. Constantes.setConectado(false).recuperarConfiguracao().java package principal.StreamConnection.io. } SysTrayIcone.awt.conexao = null. Robot robot = null.Robot. javax.StreamConnectionNotifier. } } catch (IOException e1) { e1. javax.printStackTrace().microedition. java.MSG_DISPOSITIVO_DESCONECTADO.printStackTrace(). indiceMouse = 2.getInstance(). . int int int int int indiceA = 0.entrada = null. SysTrayIcone.getInstance().conexao != null) { CRBluetoothServer. StreamConnection conexao = null.SysTrayIcone.io. public static void main(String args[]) { ConfiguracaoCtrl conf = new ConfiguracaoCtrl(). indiceC = 2.io.getInstance().microedition.NOME_PROGRAMA.close(). java. DataOutputStream saida = null.mostraMensagem(Constantes.ConfiguracaoCtrl. public class CRBluetoothServer { public public public public public public public public public public static static static static static static static static static static StreamConnectionNotifier servico = null. indiceD = 5.

java.robot. java.awt.MouseInfo.robot.y + y).mostra(true). y = (CRBluetoothServer. CRBluetoothServer.indiceMouse + 1) * direcaoY. Requisicao. } public void executa() { Point p = MouseInfo. int direcaoY) { x = (-1) * (CRBluetoothServer. public interface Requisicao { public void executa().mouseMove(p.InputEvent. public class RequisicaoMouseMove implements Requisicao { public static final int EIXO_AVANCA = 1. import import import import java.indiceMouse + 1) * direcaoX.java package requisicoes.getLocation().BUTTON1_MASK).robot.awt. } RequisicaoMouseClique.mousePress(InputEvent. public static final int EIXO_PARADO = 0. import java. } } RequisicaoMouseMove package requisicoes.event.java package requisicoes. CRBluetoothServer.BUTTON1_MASK).Robot. principal.x + x.CRBluetoothServer.Point.awt. p. private int y.77 } } icon. public RequisicaoMouseMove(int direcaoX. import principal. public class RequisicaoMouseClique implements Requisicao { public void executa() { CRBluetoothServer.getPointerInfo().CRBluetoothServer. } .awt. private int x.mouseRelease(InputEvent. public static final int EIXO_RECUA = -1.

= CRBluetoothServer. this. 2.java package requisicoes.KeyEvent.78 } RequisicaoTeclaEspecial. public class RequisicaoTeclaEspecial implements Requisicao { public static final int public static final int public static final int public static final int private int tecla = -1.Constantes. if(indiceSel < Constantes. = CRBluetoothServer. } } public void avaliar() { int indiceSel = -1. case TECLA_D: indiceSel break.robot. switch (tecla) { case TECLA_A: indiceSel break.keyRelease(key).awt. case TECLA_C: indiceSel break.avaliar().event. } = CRBluetoothServer. import utils. import principal. } catch (Throwable e) { e. import java. case TECLA_B: indiceSel break.botoes.indiceD.indiceC. } public void executa() { try { CRBluetoothServer. CRBluetoothServer.indiceA.robot. .length){ key = Constantes.teclas[indiceSel]. 1.printStackTrace().indiceB. 3.keyPress(key). = CRBluetoothServer. public RequisicaoTeclaEspecial(int tecla) { this. TECLA_A TECLA_B TECLA_C TECLA_D = = = = 0. return. private int key = -1.CRBluetoothServer.tecla = tecla.

private String resposta = "". } catch (Throwable e) { configuraNaoEncontradas(i). } else { try { CRBluetoothServer. private ArrayList<Character> naoEncontrados = new ArrayList<Character>().toUpperCase(). } indiceSel = indiceSel .Constantes.robot. i < texto. if(indiceSel < 10){ key = indiceSel + 48. telas.charAt(i).SysTrayIcone.10. } } RequisicaoTeclado. java.botoes. keyAnterior = key.length().Constantes. i++) { int c = texto.java package requisicoes.event. utils.79 } indiceSel = indiceSel .CRBluetoothServer. } if (key == -1) { configuraNaoEncontradas(i). } public void executa() { texto = texto. int keyAnterior = -1.length. .texto = t. return.keyPress(key). public class RequisicaoTeclado implements Requisicao { private String texto.robot.awt.KeyEvent. for (int i = 0. public RequisicaoTeclado(String t) { this. key = indiceSel + 65.util.keyRelease(keyAnterior). principal. import import import import import java. if (keyAnterior != -1) { CRBluetoothServer.ArrayList. int key = avaliar(c).

NOME_PROGR AMA.charAt(indice)). KeyEvent.VK_ADD.80 } } } keyAnterior = -1. } //Letras if (c >= 65 && c <= 90) { return c. SysTrayIcone.mostraMensagem(Constantes.TXT_KEY_INVALIDA. } Character c = new Character(texto.MSG_INFO). . KeyEvent.VK_DIVIDE. KeyEvent.getInstance(). } } public int avaliar(int c) { //Numeros if (c >= 48 && c <= 57) { return c. if (!resposta.equals("")) { resposta = Constantes. } switch (c) { //' case 39: return /// case 47: return //* case 42: return //+ case 43: return //case 45: //= case 61: //[ case 91: //] case 93: //\ KeyEvent. if (!naoEncontrados. } } public void configuraNaoEncontradas(int indice) { if (resposta.VK_QUOTE. resposta.VK_MULTIPLY. naoEncontrados.charAt(indice) + "\" ".add(c).equals("")) { SysTrayIcone.contains(c)) { resposta += "\"" + texto.

Toolkit. java. private TelaMenuPopUp popup. "CRBluetooth".getDefaultToolkit().setImageAutoSize(true). if (SystemTray. java.java package telas. private SystemTray tray.SystemTray.TrayIcon.awt. private Image image. public static final int MSG_ERRO = 2. popup = new TelaMenuPopUp(). trayIcon. private SysTrayIcone() { instancia = this. } } SysTrayIcone. trayIcon = new TrayIcon(image. image = Toolkit. private static SysTrayIcone instancia.81 case 92: //. private TrayIcon trayIcon.Image.net.createImage(imageURL). java.awt.isSupported()) { tray = SystemTray. public static final int MSG_INFO = 1.awt. popup). case 46: //.URL.awt. case 59: //" " case 32: return c.getResource("recursos/iconepadrao. } return -1. } } public static SysTrayIcone getInstance() { if (instancia == null) { instancia = new SysTrayIcone(). java.awt.png"). .AWTException. URL imageURL = getClass(). java. public class SysTrayIcone { public static final int MSG_NONE = 0. } return instancia.getSystemTray().getClassLoader(). case 44: //. import import import import import import java.

} else { setImage("recursos/iconestart. break.setToolTip("CRBluetooth"). trayIcon. trayIcon.getResource(caminho).displayMessage("Erro!".displayMessage(titulo.png").displayMessage(titulo.MessageType.add(trayIcon). } public void mostraMensagem(String titulo. TrayIcon. TrayIcon. txt.println("TrayIcon could not be added.setConectado(conectado). } } catch (AWTException e) { System. } } public void setIniciado(boolean iniciado) { if (iniciado) { setImage("recursos/iconestart.").err. trayIcon.Serviço iniciado!").png"). } else { setImage("recursos/iconepadrao.png"). } public void setConectado(boolean conectado) { if (conectado) { setImage("recursos/iconecon.MessageType. } catch (Throwable e) { trayIcon. } else { tray. } popup.82 } public void mostra(boolean mostra) { try { if (mostra) { tray.createImage(imageURL). txt. "" + e. image = Toolkit.Dispositivo remoto conectado!").getDefaultToolkit(). } } public void setImage(String caminho) { try { URL imageURL = getClass().setToolTip("CRBluetooth . int tipo) { switch (tipo) { case MSG_INFO: trayIcon. } popup.MessageType.png").setToolTip("CRBluetooth .setToolTip("CRBluetooth . case MSG_ERRO: trayIcon. TrayIcon.Serviço iniciado!").setIniciado(iniciado).setImage(image).remove(trayIcon). .INFO).ERROR).getClassLoader(). trayIcon. trayIcon.ERROR). String txt.

83 break. comboD. } public void inicializar() { comboA.displayMessage(titulo. } .indiceMouse). comboA.setSelectedIndex(CRBluetoothServer.addItem(texto).URL.indiceC). } instancia. comboC. java. java.awt. comboMouse.swing.setSelectedIndex(CRBluetoothServer.setSelectedIndex(CRBluetoothServer. comboMouse. txt. TrayIcon.removeAllItems(). default: trayIcon.addItem(texto). } } } TelaConfiguracao.addItem(texto). comboC.inicializar().CRBluetoothServer.botoes) { comboA.addItem(texto).setSelectedIndex(CRBluetoothServer.ConfiguracaoCtrl. import import import import import import controle.java package telas. return instancia.Constantes.removeAllItems(). comboC.indiceA).JFrame { private static TelaConfiguracao instancia = null. } /** Creates new form TelaConfiguracao */ private TelaConfiguracao() { initComponents(). public class TelaConfiguracao extends javax.removeAllItems(). comboD.indiceD). comboB. for (String texto : Constantes.Toolkit.Image.indiceB).removeAllItems().removeAllItems(). comboB. setTitle("Configurações"). principal. public static TelaConfiguracao getInstance() { if (instancia == null) { instancia = new TelaConfiguracao().NONE).setSelectedIndex(CRBluetoothServer.MessageType. java.awt.net. comboB. comboD. utils.

jLabel2. * WARNING: Do NOT modify this code. jLabel4.addItem((char) comboD.getResource("recursos/iconepadrao. i <= 90.swing. jLabel2 = new javax.swing.swing.JSeparator().JComboBox().setText("Botão C:").swing. jLabel4 = new javax.JLabel(). i++) { i). butSalvar = new javax. } /** This method is called from within the constructor to * initialize the form. i).JComboBox().addItem((char) } for (int i = 65.swing.JLabel().swing.addItem((char) comboC.JComboBox().createImage(imageURL). setResizable(false).swing. jSeparator2 = new javax. for (int i = 1.setText("Botão B:").png"). this.addItem(i).swing. } URL imageURL = getClass(). butCancelar = new javax. comboB = new javax.84 for (int i = 48.swing.JSeparator(). i). jLabel3 = new javax.swing.swing.getClassLoader().swing.setText("Botão D:"). comboMouse = new javax. i <= 10. comboA.swing. Image image = Toolkit. i). comboA = new javax.JButton(). i++) { comboMouse. jLabel1. i <= 57.setText("Botão A:").swing. The content of this method is * always regenerated by the Form Editor. .JLabel(). comboA. jLabel3.JLabel().addItem((char) comboC. comboC = new javax.addItem((char) comboD. comboD = new javax.addItem((char) comboB. i). */ // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jLabel1 = new javax. i). jLabel5 = new javax.JComboBox(). jSeparator1 = new javax.getDefaultToolkit().JComboBox().addItem((char) } i++) { i). i).JLabel().setIconImage(image).JButton().addItem((char) comboB.

setModel(new javax.addPreferredGap(javax.LayoutStyle.swing.awt.setModel(new javax.UNRELATED) .GroupLayout layout = new javax. layout.setModel(new javax.swing. butSalvar. Short.addGroup(layout.addPreferredGap(javax.addComponent(jLabel3) . } }).Alignment.GroupLayout(getContentPane()).addGroup(layout. butCancelar.event.DEFAULT_SIZE. 168. butSalvar. comboB.addComponent(jLabel2) .ActionListener() { public void actionPerformed(java.createSequentialGroup() . comboC.DefaultComboBoxModel(new String[] { "Item 1". "Item 4" })). "Item 4" })). "Item 3". 117. 0.awt.LE ADING) . 168. 0. "Item 2".swing.ActionEvent evt) { butSalvarActionPerformed(evt).addComponent(comboB.setHorizontalGroup( layout. 116.event. "Item 4" })).MAX_VALUE) . "Item 2".addGroup(layout. jLabel5.DEFAULT_SIZE.MAX_VALUE) .GroupLayou t.swing. Short.addComponent(jLabel1) .createParallelGroup(javax. javax.LEADING) .Alignment.ComponentP lacement.ActionListener() { public void actionPerformed(java. "Item 2".GroupLayout.awt.addGroup(layout.addComponent(jSeparator2.DefaultComboBoxModel(new String[] { "Item 1".UNRELATED) .addContainerGap() .createSequentialGroup() .swing.GroupLayout. "Item 4" })).swing.setLayout(layout).swing.DefaultComboBoxModel(new String[] { "Item 1". Short.ActionEvent evt) { butCancelarActionPerformed(evt).setModel(new javax.MAX_VALUE)) . "Item 3".setModel(new javax.swing. javax. "Item 2". "Item 4" })).85 comboA.MAX_VALUE)) .swing.setText("Velocidade do Mouse:").createSequentialGroup() . "Item 3". "Item 3".ComponentP lacement.LayoutStyle.swing.addPreferredGap(javax.event. getContentPane().GroupLayout.addComponent(comboA.swing. comboMouse.swing.DefaultComboBoxModel(new String[] { "Item 1".DefaultComboBoxModel(new String[] { "Item 1".createSequentialGroup() . "Item 3".addActionListener(new java.event.setText("Cancelar"). } }). Short.addGroup(layout.ComponentP lacement. javax.addComponent(jSeparator1.awt.swing. butCancelar.setText("Salvar").createParallelGroup(javax.swing. "Item 2".addActionListener(new java.LayoutStyle.UNRELATED) . comboD.

swing. 0.swing. javax.ComponentP .LayoutStyle.Alignment.RELATED) .ComponentP lacement.swing.Alignment. Short.createSequentialGroup() .addPreferredGap(javax.addComponent(comboMouse.createParallelGroup(javax.addGroup(layout.addPreferredGap(javax.ComponentPlacement .GroupLayout.addGroup(layout.GroupLayout.86 . javax.GroupLayout.addComponent(comboD.ComponentP lacement.RELATED) .addComponent(jLabel5) . 0.addPreferredGap(javax.BASELINE) . javax.GroupLayou t.swing.addComponent(comboB.MAX_VALUE)) .swing.Alignment.addComponent(jLabel1) .createParallelGroup(javax. javax.PREFERRED_SIZE.GroupLayou t.addGroup(layout.PREFERRED_SIZE)) lacement.ComponentPlacement .createSequentialGroup() .GroupLayout.swing.swing.addComponent(comboA.swing.swing.swing.createParallelGroup(javax.addPreferredGap(javax.BASELINE) . javax.GroupLayout. 0.LayoutStyle.addComponent(jLabel2) . javax.addGroup(layout. javax.DEFAULT_SIZE.LayoutStyle.swing. javax.Alignment.GroupLayou t.swing.UNRELATED) .Alignment.DEFAULT_SIZE.addPreferredGap(javax. 83.UNRELATED) .DEFAULT_SIZE.swing.GroupLayout. Short. Short.addComponent(comboC.PREFERRED_SIZE.swing.LayoutStyle.addComponent(butCancelar) .setVerticalGroup( layout.GroupLayout.swing.addComponent(comboC.DEFAULT_SIZE.BASELINE) .addComponent(butSalvar.swing.swing.ComponentPlacement .addComponent(jLabel3) . 60.swing.createSequentialGroup() .addComponent(jLabel4) .addGroup(layout.addComponent(comboD.RELATED) .swing. javax. 116.addContainerGap()) ). 116.PREFERRED_SIZE)) .PREFERRED_SIZE)) .PREFERRED_SIZE.addPreferredGap(javax.GroupLayout.addContainerGap() . javax.LayoutStyle.RELATED) .addGroup(layout.GroupLayout.addGroup(layout. javax.MAX_VALUE)) .addComponent(jLabel4) .createParallelGroup(javax.swing.GroupLayou t.LE ADING) .BASELINE) .DEFAULT_SIZE. Short.MAX_VALUE)) .swing.PREFERRED_SIZE.LayoutStyle.GroupLayout.swing.MAX_VALUE))) . javax.GroupLayout.PREFERRED_SIZE)) .swing.addGroup(layout.createSequentialGroup() . layout.createParallelGroup(javax.GroupLayout.swing. javax.GroupLayout.GroupLayout.

10.ActionEvent evt) { // TODO add your handling code here: this.swing.salvarConfiguracao(comboA.addContainerGap(javax.BASELINE) .LayoutStyle.getSelectedIndex().event. Short.PREFERRED_SIZE)) .setVisible(true).swing.awt.DEFAULT_SIZE.createParallelGroup(javax.getSelectedIndex().GroupLayout.awt. javax.ComponentPlacement . }// </editor-fold> private void butSalvarActionPerformed(java.createParallelGroup(javax.PREFERRED_SIZE) .GroupLayout. javax.ActionEvent evt) { // TODO add your handling code here: ConfiguracaoCtrl conf = new ConfiguracaoCtrl().Alignment.addPreferredGap(javax.MAX_VALUE)) ). comboC. 10.LayoutStyle.swing.UNRELATED) .getSelectedIndex().LayoutStyle.addComponent(butSalvar)) .swing.GroupLayout. } /** * @param args the command line arguments */ public static void main(String args[]) { java.swing.GroupLayou t.swing. javax.Alignment.addGroup(layout.PREFERRED_SIZE.PREFERRED_SIZE.swing.addComponent(jSeparator2.getSelectedIndex().setVisible(false).swing. this. javax.RELATED) .DEFAULT_SIZE. conf. .addPreferredGap(javax.addGroup(layout.GroupLayout. javax.ComponentPlacement .EventQueue.swing.event.LayoutStyle. javax.GroupLayou t.addComponent(jSeparator1.ComponentPlacement . comboB.addComponent(jLabel5) . pack().GroupLayout.swing.GroupLayout.PREFERRED_SIZE) .swing.invokeLater(new Runnable() { public void run() { new TelaConfiguracao().87 .getSelectedIndex()).addPreferredGap(javax.awt.setVisible(false).GroupLayout.UNRELATED) .ComponentPlacement . } private void butCancelarActionPerformed(java.swing.GroupLayout.addPreferredGap(javax.RELATED) .PREFERRED_SIZE. comboMouse.addComponent(butCancelar) . comboD.BASELINE) .swing.swing.addComponent(comboMouse. javax.

public TelaMenuPopUp() { itemIniciar = new MenuItem("Iniciar"). itemIniciar.MenuItem. private javax. itemDesconectar. java. private javax. itemConfigurar.swing. private javax. java.ActionListener. private javax.swing.awt.awt.awt. itemDesconectar = new MenuItem("Desconectar").JComboBox comboB. java. itemDesconectar.awt. itemParar = new MenuItem("Parar"). private javax.swing.swing. private private private private private MenuItem MenuItem MenuItem MenuItem MenuItem itemSair.swing.addActionListener(eventoConfigurar).Insets.swing.JComboBox comboMouse.JComboBox comboD.awt. } } } // Variables declaration .swing.JLabel jLabel2. public class TelaMenuPopUp extends PopupMenu { private ServidorCtrl servidorCtrl = new ServidorCtrl().addActionListener(eventoParar). itemConfigurar = new MenuItem("Configurações"). private javax.JLabel jLabel4.swing. itemParar.awt.JSeparator jSeparator2.JButton butSalvar.ServidorCtrl. private javax. private javax. itemParar. private javax.swing. // End of variables declaration TelaMenuPopUp.JLabel jLabel5. itemSair = new MenuItem("Sair").event.JSeparator jSeparator1. java. itemConfigurar.Dimension.addActionListener(eventoSair).swing.JComboBox comboC.swing. . private javax.awt.88 }). private javax.swing.event. private javax. itemSair.swing.Toolkit.ActionEvent.JComboBox comboA.JLabel jLabel3. java.JLabel jLabel1. itemIniciar.addActionListener(eventoIniciar).java package telas.swing. java. import import import import import import import import controle.addActionListener(eventoDesconectar).do not modify private javax. private javax.JButton butCancelar.PopupMenu. java.

} }. } }.clienteDesconectado().add(itemConfigurar). } else { this. this.insert(itemParar.height . } } private ActionListener eventoSair = new ActionListener() { public void actionPerformed(ActionEvent e) { servidorCtrl.getInstance().remove(itemIniciar).getScreenSize(). tela. } }. .getInstance().bottom)) .insert(itemIniciar.pararServidor(). this.remove(itemDesconectar). TelaConfiguracao.getDefaultToolkit().width . this.iniciarServidor(). } else { this.getWidth().add(itemSair). } } public void setIniciado(boolean iniciado) { if (iniciado) { this.setVisible(true).top)) tela. private ActionListener eventoDesconectar = new ActionListener() { public void actionPerformed(ActionEvent e) { servidorCtrl.89 this.add(itemIniciar).getScreenInsets(tela.insert(itemDesconectar.(d. this.tela. Dimension d = Toolkit. this.getDefaultToolkit(). this. Insets in = Toolkit.(in.setLocation((d. } public void setConectado(boolean conectado) { if (conectado) { this.getGraphicsConfiguration() ). } }. private ActionListener eventoIniciar = new ActionListener() { public void actionPerformed(ActionEvent e) { servidorCtrl.getHeight()). 0).remove(itemParar). private ActionListener eventoConfigurar = new ActionListener() { public void actionPerformed(ActionEvent e) { TelaConfiguracao tela = TelaConfiguracao. private ActionListener eventoParar = new ActionListener() { public void actionPerformed(ActionEvent e) { servidorCtrl. 0).top + in.fecharServidor().(in.addSeparator().addSeparator().left + in. 1).

"//CRB/GAME_D".VK_HOME. KeyEvent. public final String MSG_ERRO_CRIAR_ROBOT = "Impossível criar Robot". . KeyEvent.VK_INSERT."Home". "//CRB/GAME_C". "Backspace". public final configurações!". "Page Down".VK_ENTER. SERVICO_MOUSE_RIGHT = "//CRB/RIGHT".KeyEvent.VK_END. KeyEvent. KeyEvent. "Insert"."End".java package utils. public final desconectado!". "Delete". public public public public final final final final String String String String SERVICO_TECLA_A SERVICO_TECLA_B SERVICO_TECLA_C SERVICO_TECLA_D = = = = "//CRB/GAME_A".awt. public final String STR_FECHA_CONEXAO = "//CRB/FECHA". public final configurações!". "Espaço".VK_TAB. public final String[] botoes = {"Enter".VK_PAGE_UP. KeyEvent. KeyEvent. "Tab".90 }. SERVICO_MOUSE_LEFT = "//CRB/LEFT". "Up".VK_DELETE.VK_BACK_SPACE. KeyEvent. KeyEvent.VK_ALT. public final String SERVICE_UUID = "061020070110198603091986". "Right"}. "Ctrl". public public public public final final final final String String String String SERVICO_MOUSE_UP = "//CRB/UP". public final String MSG_SERVIDOR_PARADO = "Serviço parado!".VK_SPACE.event. public final ". public final String TXT_KEY_INVALIDA = "Teclas não encontradas: ". "Left". import java. public final int[] teclas = {KeyEvent. } } Constantes. KeyEvent. public interface Constantes { public final String NOME_PROGRAMA = "CRBluetooth".VK_CONTROL. public final String SERVICO_MOUSE_CLICK = "//CRB/CLICK". SERVICO_MOUSE_DOWN = "//CRB/DOWN". KeyEvent. "//CRB/GAME_B". "Alt". public final conectado!". String MSG_ERRO_SALVAR_CONF = "Impossível salvar as String MSG_ERRO_CARREGAR_CONF = "Impossível carregar as String MSG_SERVICO_DESCONHECIDO = "Serviço desconhecido: String MSG_DISPOSITIVO_CONECTADO = "Dispositivo remoto String MSG_DISPOSITIVO_DESCONECTADO = "Dispositivo remoto public final String MSG_SERVIDOR_INICIADO = "Serviço iniciado!". "Down"."Page Up".

bluetooth.devices.LocalDevice. false).VK_PAGE_DOWN. String device = btDevice.bluetooth. javax.getBluetoothAddress().addElement(device).java package comm.TelaPrincipal.VK_LEFT. CRBluetoothME. public class BuscaServicos implements Runnable { private Vector devicesDiscovered.DeviceClass.bluetooth. KeyEvent.getFriendlyName(false).util.TelaBusca. main.devices = new Vector(). try { device = btDevice.io.RemoteDevice. javax.UUID. KeyEvent. view. view. } .bluetooth.ServiceRecord. javax.bluetooth.servicos = new Vector().CRBluetoothME. KeyEvent.Vector.DiscoveryListener. javax.VK_UP. static final UUID uuid = new UUID(serverUUID.addElement(btDevice). } Código-fonte do aplicativo cliente BuscaServicos. DeviceClass devicesDiscovered.VK_DOWN. public TelaBusca tela. KeyEvent.bluetooth.DiscoveryAgent. public BuscaServicos(TelaBusca tela) { this. } catch (IOException cantGetDeviceName) { } CRBluetoothME. java. static final String serverUUID = "061020070110198603091986".IOException.91 KeyEvent. javax.VK_RIGHT}. } public void run() { final Object inquiryCompletedEvent = new Object(). devicesDiscovered = new Vector(). import import import import import import import import import import import import java. CRBluetoothME.tela = tela. javax. javax.bluetooth. DiscoveryListener listener = new DiscoveryListener() { cod) { public void deviceDiscovered(RemoteDevice btDevice. final Object serviceCompleteEvent = new Object().

TelaPrincipal. } } synchronized (inquiryCompletedEvent) { inquiryCompletedEvent. UUID[] searchUuidSet = new UUID[]{uuid}. this).length > 0) { String url = servRecord[0].getLocalDevice().wait().GIAC. int[] attrIDs = new int[]{ 0x0100 // Service name }. synchronized (inquiryCompletedEvent) { try { boolean started = LocalDevice.searchServices(attrIDs.servicos. listener). i < devicesDiscovered.getInstancia()). false). try { synchronized (serviceCompleteEvent) { LocalDevice.getConnectionURL(ServiceRecord.addElement(url).wait().elementAt(i).getDiscoveryAgent(). searchUuidSet. TelaPrincipal.92 public void inquiryCompleted(int discType) { for (int i = 0. } } public void serviceSearchCompleted(int transID. ServiceRecord[] servRecord) { if (servRecord. if (started) { inquiryCompletedEvent.notifyAll(). } } .mostraMsgErro("Erro ao buscar serviço". } catch (Throwable e) { CRBluetoothME.mostraMsgErro("Erro ao buscar dispositivos". int respCode) { synchronized (serviceCompleteEvent) { serviceCompleteEvent. } tela.size(). } } catch (Throwable e) { CRBluetoothME. } } public void servicesDiscovered(int transID.getInstancia()). remote.getDiscoveryAgent( ).startInquiry(DiscoveryAgen t. CRBluetoothME.getLocalDevice(). } } }.notifyAll().NOAUTHENTICATE_NOENCRYPT.atualizarDispositivos(). i++) { RemoteDevice remote = (RemoteDevice) devicesDiscovered. serviceCompleteEvent.

java package comm.Constantes. javax. javax.selecionado)). tela.openInputStream()). Thread t = new Thread(testa).start(). } public void conectar() { try { CRBluetoothME.ERRO_CONEXAO). t.selec ionado)).atualizaConectado().io.tela = tela.addTexto((String)CRBluetoothME. } } } CRBluetoothME.Connector.mostra(tela).devices.io.io.DataOutputStream.Connection. TestaConexao testa = new TestaConexao().microedition. javax.open((String)CRBluetoothME.io. view.addTexto(Constantes. CRBluetoothME.TelaPrincipal.servicos.elementAt(CRBluetoothME. public class ConectaServico{ private TelaPrincipal tela.DataInputStream. .93 } } ConectaServico.microedition. import import import import import import import import java.streamConnection.java package comm.entrada = new DataInputStream(CRBluetoothME.microedition.saida = new DataOutputStream(CRBluetoothME.streamConnection.streamConnection = (StreamConnection) Connector.elementAt(CRBluetoo thME. main. CRBluetoothME. public ConectaServico(TelaPrincipal tela) { this. DesconectaServico.StreamConnection.CRBluetoothME.io. java. tela. } catch (Throwable e) { tela. util.openOutputStream()).

streamConnection = null. } } catch (Throwable e3) { } try { if (CRBluetoothME. import util. } } } EnviarMsg. } catch (Throwable e) { } } try { try { if (CRBluetoothME.enviar(Constantes.atualizaDesconectado().saida != null) { try { EnviarMsg.ERRO_DESCONECT AR).entrada = null. CRBluetoothME. } catch (Throwable e2) { TelaPrincipal.entrada != null) { CRBluetoothME.streamConnection.getInstancia(). } } catch (Throwable e3) { } TelaPrincipal.close().java package comm.CRBluetoothME. CRBluetoothME.getInstancia(). .Constantes.saida != null) { CRBluetoothME. import view.saida = null. } } catch (Throwable e3) { } try { if (CRBluetoothME. TelaPrincipal.close().TelaPrincipal. CRBluetoothME.94 import main.streamConnection != null) { CRBluetoothME.saida.STR_FECHA_CONEXAO).CRBluetoothME.close().getMessage()).addTexto("Desc: " + e2.entrada.getInstancia(). public class DesconectaServico { public void desconectar() { if (CRBluetoothME. import main.addTexto(Constantes.

desconectar().95 public class EnviarMsg { public static void enviar(String msg) { if (CRBluetoothME.desconectar(). java.equals(Constantes.java package comm.getInstancia().saida. view. } } } CRBluetoothME. import main. desconecta. } catch (Throwable e) { DesconectaServico desconecta = new DesconectaServico(). while (!lido. javax.DataOutputStream.io. javax. java. } } catch (Throwable e) { } finally { DesconectaServico desconecta = new DesconectaServico().flush(). import util.DataInputStream.*. javax. } } } } TestaConexao.readUTF().microedition.io.TelaPrincipal.writeUTF(msg). . desconecta.STR_FECHA_CONEXAO)) { lido = CRBluetoothME.midlet. TelaPrincipal.java package main.StreamConnection.util.entrada. CRBluetoothME.Vector. import import import import import import import java.CRBluetoothME.io.addTexto("lido: " + lido).microedition. public class TestaConexao implements Runnable { public void run() { try { String lido = "".saida != null) { try { CRBluetoothME.lcdui.saida.Constantes. import view.TelaPrincipal.*.microedition.

public static MIDlet midlet. alert.FOREVER). public static StreamConnection streamConnection = null. public static int selecionado. } public void startApp() { TelaPrincipal tela = TelaPrincipal.setCurrent(alert.ERROR). mostra(tela).getInstancia().getDisplay(CRBluetoothME.setTimeout(Alert.setCurrent(tela). AlertType.getDisplay(CRBluetoothME. } public static void mostra(Form tela){ Display. } public void pauseApp() { } public void destroyApp(boolean unconditional) { try { if (streamConnection != null) { streamConnection. Form proximo){ Alert alert = new Alert("CRBluetooth".notifyDestroyed(). public static DataOutputStream saida = null.close(). } } . msg. } public static void mostraMsgErro(String msg. public CRBluetoothME() { midlet = this.close(). } } catch (Throwable e) { } } public static void fim() { midlet. public static Vector devices = null. public static DataInputStream entrada = null.midlet).96 public class CRBluetoothME extends MIDlet { public static String e = null. null. Display. proximo).midlet). } } catch (Throwable e) { } try { if (saida != null) { saida. public static Vector servicos = null.

int quantidade.Graphics. javax. int altura) { super(null).Constantes. "//CRB/GAME_B".TimerTask. public public public public final final final final String String String String SERVICO_MOUSE_UP = "//CRB/UP". public class ItemCaptura extends CustomItem { private private private private private private private private Vector conteudo. KeyRepeatTask task. public public public public } final final final final String String String String SERVICO_TECLA_A SERVICO_TECLA_B SERVICO_TECLA_C SERVICO_TECLA_D = = = = "//CRB/GAME_A". conteudo = new Vector(). java.microedition. public public public public final final final final String String String String TXT_CONECTADO = "Conectado a:". TXT_DESCONECTADO = "Desconectado de:". SERVICO_MOUSE_DOWN = "//CRB/DOWN". ItemCaptura.java package view. public ItemCaptura(int largura. public interface Constantes { public final String TXT_SELECIONE_OPCAO = "Selecione uma opção".util. "//CRB/GAME_D". javax. SERVICO_MOUSE_LEFT = "//CRB/LEFT".lcdui. javax. Timer timer. Font fonte.java package util. Integer ultimaTecla. java.Vector. javax.microedition.Timer. "//CRB/GAME_C".util. public final String SERVICO_MOUSE_CLICK = "//CRB/CLICK".lcdui.Canvas.EnviarMsg.lcdui.microedition. ERRO_DESCONECTAR = "Erro ao desconectar. import import import import import import import import import comm.Font. util.microedition.lcdui.CustomItem. .97 Constantes.". ERRO_CONEXAO = "Erro ao conectar a:". java. SERVICO_MOUSE_RIGHT = "//CRB/RIGHT". int altura.util. int largura. public final String STR_FECHA_CONEXAO = "//CRB/FECHA".

setKeyRepetition(). this.largura = largura.setFont(null). if (iFinal > conteudo.getHeight()). g. } } . Font. Font.altura = altura .FACE_SYSTEM.elementAt(j). } for (int j = iInicio. j++) { String txt = (String) conteudo. } protected int getPrefContentHeight(int y) { return altura. } protected int getPrefContentWidth(int w) { return largura.LEFT | Graphics.quantidade. } protected int getMinContentHeight() { return altura.drawString(txt. repaint(). } public void limpa() { conteudo = new Vector(). } if (iInicio < 0) { iInicio = 0.STYLE_PLAIN. repaint(). (j * fonte.SIZE_MEDIUM).getHeight()).TOP). quantidade = (int) Math.1. } protected void paint(Graphics g. j <= iFinal. } protected int getMinContentWidth() { return largura.1.1) { iFinal = conteudo. int h) { int iInicio = conteudo. int w. g.size() .addElement(txt).98 fonte = Font.size() . int iFinal = iInicio + quantidade . } public void append(String txt) { conteudo. Graphics. 0.5. this.ceil((double) altura / (double) fonte.size() .getFont(Font.

0.SERVICO_MOUSE_CLICK. int viewportWidth.99 protected boolean traverse(int dir. } } } protected String teclou(int gameKey) { String texto = null.DOWN: texto = Constantes.RIGHT: texto = Constantes.SERVICO_MOUSE_LEFT. } protected void keyRepeated(int keyCode) { } private void setKeyRepetition() { task = new KeyRepeatTask(). } private class KeyRepeatTask extends TimerTask { public void run() { if (ultimaTecla != null) { String texto = teclou(ultimaTecla.FIRE: texto = Constantes.intValue()).UP: texto = Constantes. String texto = teclou(key). break. break. timer = new Timer(). case Canvas.SERVICO_MOUSE_DOWN.schedule(task. case Canvas. } protected void keyReleased(int keyCode) { ultimaTecla = null. int viewportHeight. ultimaTecla = new Integer(gameKey). 50). case Canvas. int[] visRect_inout) { return true. switch (gameKey) { case Canvas. case Canvas.SERVICO_MOUSE_UP. break. } protected void keyPressed(int keyCode) { int key = getGameAction(keyCode).LEFT: texto = Constantes.SERVICO_MOUSE_RIGHT. envia(texto). ultimaTecla = new Integer(gameKey). break.GAME_A: . timer. ultimaTecla = new Integer(gameKey). envia(texto). case Canvas. break. ultimaTecla = new Integer(gameKey).

break.size() != 0){ . 0).Form.GAME_D: texto = Constantes. public void atualizarDispositivos(){ this. append("Buscando serviço.CommandListener..removeCommand(cmConectar).devices.Busca serviço").removeCommand(cmVoltar).100 texto = Constantes. public class TelaBusca extends Form implements CommandListener { private Command cmConectar.lcdui. } } } TelaBusca. main.Command.Constantes.lcdui. import import import import import import import import comm. case Canvas.ConectaServico. case Canvas. if(CRBluetoothME. javax.").enviar(texto).SERVICO_TECLA_A.BACK.SERVICO_TECLA_C.microedition.lcdui. this. private ChoiceGroup cgDispositivos. cmVoltar = new Command("Voltar".GAME_C: texto = Constantes.SERVICO_TECLA_D. break. } } return texto.java package view. } setCommandListener(this).ChoiceGroup.CRBluetoothME. break.lcdui. javax.deleteAll(). case Canvas.Displayable.lcdui. Command.SERVICO_TECLA_B. util. 1).. cmVoltar.ITEM.microedition. public TelaBusca() { super("CRBluetooth .microedition. javax. cmConectar = new Command("Conectar".microedition. protected void envia(String texto) { if (texto != null) { EnviarMsg. javax. break. javax.GAME_B: texto = Constantes. Command.microedition. this.

devices. . public class TelaDigitar extends Form implements CommandListener { private Command cmCancelar. javax.append("Nenhum dispositivo encontrado!"). this. for(int i = 0.size().addCommand(cmConectar).lcdui.EnviarMsg. private TextField tfDigitar.getInstancia()). Displayable arg1) { if(cmd == cmVoltar){ CRBluetoothME. } } } } TelaDigitar. main. } this. private static TelaDigitar instancia. CRBluetoothME. return instancia.101 cgDispositivos = new ChoiceGroup("Dispositivos:". public static TelaDigitar getInstancia(){ if(instancia == null) instancia = new TelaDigitar().lcdui.microedition.Command. } public void commandAction(Command cmd. if(selecionado != -1){ CRBluetoothME.getInstancia()).Displayable. javax. i++){ cgDispositivos.CRBluetoothME.TXT_SELECIONE_OPCAO.append(cgDispositivos). javax.CommandListener. null). } this.java package view.Form.addCommand(cmVoltar).microedition.EXCLUSIVE).elementAt(i).getInstancia()).conectar(). } if(cmd == cmConectar){ int selecionado = cgDispositivos. }else{ this. javax. }else{ CRBluetoothME. cmLimpar. cmEnviar.lcdui.append((String) CRBluetoothME.microedition.devices.selecionado = selecionado.mostraMsgErro(Constantes.mostra(TelaPrincipal. conecta.TextField. javax. import import import import import import import comm.mostra(TelaPrincipal. ConectaServico conecta = new ConectaServico(TelaPrincipal. ChoiceGroup.getSelectedIndex(). this).microedition. i < CRBluetoothME.lcdui.microedition.lcdui.

cmSair. .getString()).Digitar").ITEM. comm.mostra(TelaPrincipal. cmEnviar = new Command("Enviar".microedition.lcdui. main.java package view. Command.microedition. CRBluetoothME.microedition. Command.lcdui.microedition. 1). 0).mostra(TelaPrincipal. cmDigitar. } public void commandAction(Command com. TextField.CommandListener. Command. public class TelaPrincipal extends Form implements CommandListener{ private Command cmBuscar.Displayable.lcdui. addCommand(cmEnviar). cmCancelar = new Command("Cancelar".Command. } } if(com == cmLimpar){ tfDigitar. 128.CANCEL.setString("").ANY). private ItemCaptura item. javax. 2). import import import import import import import import comm. util. tfDigitar = new TextField("Teclas:".OK. }else{ EnviarMsg.getString(). } } } TelaPrincipal. setCommandListener(this).102 } private TelaDigitar(){ super("CRBluetooth . cmLimpar = new Command("Limpar".BuscaServicos. javax. } if(com == cmEnviar){ if(tfDigitar.getInstancia()). addCommand(cmCancelar).getInstancia()). append(tfDigitar).enviar(tfDigitar.DesconectaServico. javax. Displayable arg1) { if(com == cmCancelar){ CRBluetoothME.mostraMsgErro("Informe pelo menos uma tecla".CRBluetoothME.lcdui. cmDesconectar.Form. addCommand(cmLimpar).Constantes. javax. this).equals("")){ CRBluetoothME. "".

cmDesconectar = new Command("Desconectar". this.getWidth().mostra(tela)..."). BuscaServicos busca = new BuscaServicos(tela). t. Displayable arg1) { if(com == cmSair){ CRBluetoothME.103 private static TelaPrincipal instancia = null. } } public void atualizaConectando(){ item. cmBuscar = new Command("Buscar Servico". setCommandListener(this). Command. . Command. 0). } public void atualizaConectado(){ item. } if(com == cmDesconectar){ DesconectaServico desconecta = new DesconectaServico().getInstancia()).limpa().ITEM.fim().append(texto). Command.append("Conectando. CRBluetoothME. Thread t = new Thread(busca).EXIT.getHeight()).mostra(TelaDigitar. 1). public static TelaPrincipal getInstancia(){ if(instancia == null) instancia = new TelaPrincipal(). } public void commandAction(Command com. cmSair = new Command("Sair".limpa().ITEM. item. //addCommand(cmDigitar). append(item). } if(com == cmBuscar){ TelaBusca tela = new TelaBusca(). return instancia. } if(com == cmDigitar){ CRBluetoothME.start(). } public void addTexto(String texto){ item. 2). } private TelaPrincipal(){ super("CRBluetooth"). //addCommand(cmDesconectar). Command. cmDigitar = new Command("Digitar". addCommand(cmSair).desconectar(). addCommand(cmBuscar). item = new ItemCaptura(this. desconecta.ITEM. 3).

e != null) this. item. item. this.removeCommand(cmDesconectar).append((String) CRBluetoothME.append((String) CRBluetoothME.TXT_DESCONECTADO). this. } public void atualizaDesconectado(){ item. item.append(Constantes. item.append(Constantes. this.addCommand(cmDigitar).append((String) CRBluetoothME.elementAt(CRBluetoothME.devices.addCommand(cmBuscar).append(Constantes.elementAt(CRBluetoothME.devices. } } .elementAt(CRBluetoothME.limpa().e). this. this.TXT_CONECTADO).selecionado)). this.devices.addCommand(cmDesconectar).removeCommand(cmDigitar). if(CRBluetoothME.ERRO_CONEXAO). } public void atualizaErroConexao(){ item.limpa().addTexto(CRBluetoothME.selecionado)).104 item.selecionado)).removeCommand(cmBuscar). item.