COMUNICAÇÃO SERIAL EM JAVA – Uma análise comparativa entre a Java Communication API e a RXTX Native Library Lenardo C. e Silva, Marlon L. R. Silva¹ Grupo de Engenharia de Software – Universidade do Estado do Rio Grande do Norte (UERN) – Mossoró – RN - Brasil {lenardocs,marlon.lamartine}@gmail.com Abstract. This report aims to perform a comparative analysis between the Java Communication API (Application Programming Interface) and RXTX Native Library, to communication serial/parallel, describing their main characteristics and trade-offs involved, in order to facilitate the correct choice on the part of Java developers in each of its designs for Hardware / Software. Resumo. Este relatório tem como objetivo realizar uma análise comparativa entre a Java Communication API (Interface de Programação de Aplicação) e a biblioteca nativa RXTX, destinadas a comunicação serial/paralela, descrevendo suas principais características e trade-offs associados, de forma a facilitar a escolha correta por parte dos desenvolvedores Java em cada um de seus projetos de Hardware/Software. 1. Introdução Dispositivos microprocessadores e micro-controladores contêm recursos de comunicação que propiciam a correspondência de dados entre dois sistemas. Dentre as diversas formas de comunicação existentes para permuta de dados entre tais dispositivos, há dois padrões que, em geral, estão disponíveis, no caso o padrão RS-232 (cuja comunicação dar-se por meio de uma porta serial) e o padrão IEEE-1284 (destinado a comunicação paralela). A comunicação entre dois sistemas ou equipamentos de hardware exige o conhecimento mínimo de algumas áreas, como eletrônica digital, interfaces e padrões de comunicação, bem como de uma linguagem de programação com os devidos recursos disponíveis. Neste contexto, a linguagem Java vem se tornando muito comum entre os programadores, por ser uma linguagem de alto nível, com recursos avançados em termos de funcionalidades e segurança. Ela foi criada para se tornar funcional em diferentes plataformas, tal como os Sistemas Operacionais Windows e o Unix, mais precisamente na sua versão mais popular o Linux1. 1 RABELLO, L. M.; Programa em Linguagem JAVA para comunicação Serial. São Carlos, SP. 2009. 7p. (Embrapa. Comunicado Técnico). Esta pesquisa está vinculada a um projeto submetido e aprovado no EDITAL N° 001/2010-DP/PROPEG/UERN destinado a seleção de projetos e discentes bolsistas/voluntários para o Programa de Bolsas de Iniciação Científica – PIBIC. No entanto, a aprovação foi realocada na cota de bolsas PIBITI CNPq (Bolsa de Iniciação em Desenvolvimento Tecnológico e Inovação). O foco da pesquisa é desenvolver um driver ou binding (elemento de ligação) – utilizando a linguagem de programação Java – para comunicação serial que possibilite ao RFID Starter Kit realizar a comunicação com aplicações Java, dispensando o uso de bibliotecas nativas (específicas de sistemas operacionais) tornando-o mais flexível e portável. Vale salientar que o kit em questão, trata-se de um kit didático para estudo e aprendizado da tecnologia RFID (Radio Frequency IDentification), permitindo o desenvolvimento de aplicações nos mais variados cenários, dentre eles controle de acesso, rastreamento de objetos, controle de patrimônio e gerenciamento de inventário. Devido à escassez de documentação referente às soluções disponíveis em linguagem Java, além de dúvidas em comparação ao desempenho dos padrões de comunicação anteriormente mencionados, tornou-se necessário fazer uma comparação entre elas, criando assim uma referência sobre a temática para outros desenvolvedores, propiciando e incentivando o desenvolvimento de novas aplicações. 2. JAVA COMMUNICATIONS API 2.1. Definição A Java Communications API, usualmente conhecida como JavaComm API, não é uma parte do núcleo do JDK (Java Development Kit), é uma expansão que facilita o desenvolvimento de aplicações com acesso ao hardware, utilizando os padrões RS-232 (portas seriais) e IEEE-1284 (portas paralelas). Esta permite que aplicações desenvolvidas em linguagem de programação JAVA se comuniquem com diversos dispositivos computacionais através de Sistemas Embarcados, bem como outros hosts que necessitem dos dados de tais aplicações. Dentre algumas destas tecnologias pode-se mencionar os Smart Cards, dispositivos de serviços de escritórios (e.g. fax e modems), assim como equipamentos terminais e robóticos. O projeto JavaComm foi desenvolvido pela Sun Microsystems (Sun), a mesma criadora da linguagem de programação Java, por conseqüência pode ser considerada como a biblioteca oficial de comunicação serial JAVA. Infelizmente, há alguns anos a JavaComm teve seu projeto estagnado pela Sun, o que a tornou esquecida por seus desenvolvedores, embora, seja realizada periodicamente correções de erros não triviais. As últimas atualizações da JavaComm estão disponíveis para os Sistemas Operacionais Solaris SPARC, Solaris x86 e Linux x86. Cada uma das implementações disponíveis pela Sun funciona com a linha de produtos Cliente da Ray Sun, incluindo uma extensão que faz o mapeamento das portas, permitindo uma manipulação para especificar a localização das portas, sua visibilidade, nomes, e em alguns casos documentação 2. 2 Site Oficial da Sun-Oracle <http://java.sun.com> 2.2. Características da JavaComm API De acordo com (SITE OFICIAL SUN-ORACLE) a JavaComm API possui propriedades específicas para manipulação da comunicação serial/paralela, sendo elas: Enumeração das portas (mapeamento de portas configuráveis pelo administrador e pelo usuário); Configuração da porta (taxa de transmissão, velocidade, bits de parada, paridade); Acesso ao padrão EIA 232 (Electronic Industries Association) e sinais de pino: DTR (Data Terminal Ready), CD (Carrier Detect), CTS (Clear To Send), RTS (Request To Send) e DSR (Data Set Ready); Transferência de dados através de portas seriais (RS-232) e paralelas (IEEE-1284); Opções para controle de fluxo do hardware e software; Opção para a notificação de eventos assíncronos: 2.3. JavaComm API no Windows Para quem utiliza a JavaComm API no Windows, encontra uma pequena desvantagem. A Sun não disponibiliza mais a versão 2.0 do JavaComm, a única que funciona em plataforma win32, nem mesmo o download dessa versão a Sun disponibiliza em seu Web Site. A versão 3.0, que é a atual, é a única que a Sun disponibiliza e dá suporte. Segundo alguns fóruns de Java na internet, a versão 3.0 pode funcionar em plataforma win32, mas fica a cargo do usuário desenvolver ou adaptar um driver para seu funcionamento correto. 2.4. JavaComm API no Linux A JavaComm API para Linux é um conjunto de drivers oficiais da Sun, para interface serial: chamada de API Comm. Esses drivers permitem ao usuário usar portas seriais, bem como portas paralelas em outro Sistema Operacional. Como a JCL (JavaComm Linux) atualmente está incluída dentro do pacote da RXTX, eventualmente ela suporta qualquer sistema operacional suportado pela mesma. Do mesmo modo que no Windows, para quem utiliza JavaComm API no Linux também encontra uma desvantagem, não existe versão para Linux de 64 bits. Além disso, em testes realizados, a versão para Linux possui um bug (erro) em relação à j2sdk1.5, que até o momento apresenta alguns casos onde a porta serial padrão não funciona. 3. RXTX NATIVE LIBRARY A RXTX é uma biblioteca nativa que fornece comunicação serial e paralela (com possibilidade de comunicação via Universal Serial Bus – USB) para o JDK. A Sun e as demais empresas envolvidas no desenvolvimento da linguagem Java apóiam a disponibilização de diversas APIs e bibliotecas para facilitar a comunicação entre diversos dispositivos computacionais e suas aplicações, como é o caso da RXTX. Esta biblioteca é baseada na JavaComm API. Suas características são semelhantes com a vantagem sobre esta de que ela é portável para Linux, Windows e Mac, enquanto que a JavaComm ultimamente é que está ingressando o processo de desenvolvimento para múltiplas plataformas. 3.1. Características da RXTX NATIVE LIBRARY Segundo o (SITE OFICIAL DO RXTX) algumas características do RXTX são: - Transferência de dados através de portas seriais (RS-232) e paralelas (IEEE-1284); - Permite comunicação serial half-duplex; - Especifica portas disponíveis no PC (computador); - Aplicação de Event Listeners para inicializar as estruturas nativas ao abrir uma porta; - Opção para notificações de eventos; 4. Resultados da Análise Comparativa Para escolhermos a melhor entre as duas, definiremos os pontos principais ao qual vamos nos basear para fazermos a análise. O primeiro seria a viabilidade, é um fator importante que leva em conta o desempenho em relação às aplicações em diversos sistemas operacionais. O segundo seria o suporte às atualizações, que traz novidades aos desenvolvedores que podem facilitar no desenvolvimento dos projetos. E por fim a documentação, que acompanha os desenvolvedores na consulta dos métodos e parâmetros utilizados no projeto. JavaComm RXTX Viabilidade Embora esteja sendo implementada para outras plataformas, a JavaComm foi inicialmente criada para Windows, sua execução torna-se baixa devido a incompatibilidade das plataformas. Além de inumeráveis bugs encontrados em diversas aplicações relatadas. Ao contrário da JavaComm, a RXTX foi criada justamente para independer de plataformas, inclusive ser adaptada para Windows, tornando-se amplamente viável. Suporte a atualizações A JavaComm não recebe apoio da sua criadora, no caso a Sun, isso significa que atualizações para esta API não estão nos projetos futuros da empresa. Como a RXTX foi criada por usuários que necessitavam (e ainda necessitam) da sua utilização, as chances dessa API receber inovações são grandes. Documentação Embora a JavaComm esteja sem muitas atualizações, encontrar informações sobre ela na internet é relativamente fácil, embora de forma inadequada e em algumas vezes repetidas. Ao contrário da JavaComm que foi praticamente esquecida, mas fácil de encontrar informações, a RXTX tem documentação escassa, encontrando alguma informação somente em blogs ou fóruns a respeito. Tabela 1. Comparação entre as duas API’s tendo em vista três características: Viabilidade, Suporte a Atualizações e Documentação. 5. Conclusão Após realizar esta pesquisa e analisar os principais trade-offs em relação aos recursos de Java disponíveis para a comunicação serial/paralela com dispositivos computacionais, levando em consideração às informações dos próprios desenvolvedores dos dois padrões de comunicação em Java, pôde-se concluir que a biblioteca nativa RXTX é, atualmente, a melhor alternativa a ser utilizada. Isto porque, embora sua documentação seja um pouco escassa, dificultando o seu entendimento, esta é uma otimização da própria JavaComm API, ou seja, herdando suas características, com a exceção de que a RXTX está mais propícia a atualizações e os algoritmos contidos no próprio pacote são mais robustos. Além disso, hoje em dia, há uma tendência a abandonar a JavaComm API, devido ao apoio limitado da Sun (proprietária Oracle) e da documentação desatualizada. Em contrapartida, percebe-se o uso crescente da RXTX Native Library por ter uma comunidade desenvolvedora atuante e em contínua expansão. 6. Referências RABELLO, L. M.; Programa em Linguagem JAVA para comunicação Serial. São Carlos, SP. 2009. 7p. (Embrapa. Comunicado Técnico). SILVA, R. V. R., Utilizando a API RXTX para manipulação da serial. Maringá. 2007. Disponível em: <http://www.devmedia.com.br/post-6722-Utilizando-a-APIRXTX-para-manipulacao-da-serial-Parte-I.html> Acessado em: 21 ago. 2010. Wiki RXTX. Disponível em: <http://rxtx.qbang.org/wiki/index.php/Main_Page> Acessado em: 20 ago. 2010. SANTIAGO, M. de O.; API de comunicação SERIAL da SUN (JAVACOMM). 2007. Dinsponível em: <http://www.devmedia.com.br/post-4169-API-decomunicacao-SERIAL-da-SUN--Javacomm.html> Acessado em: 02 set. 2010. ORACLE – Sun Developer Network. Java Communications API. Disponível em: <www.oracle.com/technetwork/java/index-jsp-141752.html> Acessado em: 21 ago. 2010. HESTER, K.; CommAPI for Linux. 1998. Disponível em: <http://www.geeksville.com/~kevinh/linuxcomm.html> Acessado em: 21 ago. 2010. Serial Programming/Serial Java. 2010. Disponível em: <http://en.wikibooks.org/wiki/Serial_Programming/Serial_Java> Acessado em: 02 set. 2010.