Bluetooth for Java 2 Standard Edition Analisi delle librerie disponibili Massimo Albertin [email protected] Abstract La Java Standard Edition (Java SE at a Glance) non dispone di librerie per la comunicazione bluetooth, come invece è possibile trovare all’interno delle distribuzioni di Java Mobile Edition (The Java ME Platform — the Most Ubiquitous Application Platform for Mobile Devices) presenti su dispositivi mobili tipo cellulari. Esiste una specifica per la comunicazione bluetooth in java definita all’interno del documento JSR-82 (JSR 82: JavaTM APIs for Bluetooth), che è proprio quella implementata nella J2ME. Le librerie analizzate in questo documento permettono la comunicazione tramite bluetooth ad esempio tramite dongle Bluetooth USB. Dal momento che J2SE non dispone di una implementazione della JSR-82 e relativo supporto alla comunicazione bluetooth, è necessario un interfacciamento diretto al sistema operativo. Questo porta a vincolare l’applicazione alla piattaforma su cui dovrà essere eseguita l’applicazione, soprattutto se la libreria utilizzata non rispetta perfettamente le specifiche JSR-82. 1 Introduzione In questo documento verranno analizzate una serie di librerie per la comunicazione con dispositive Bluetooth. Alcune implementazioni rispettano le specifiche JSR-82 presentando quindi interfacce comuni e modalità di accesso standardizzate, mentre altre fanno ricorso ad interfacce proprietarie. Per accedere alla comunicazione e ai driver bluetooth alcune librerie fanno ricorso alla JNI (Java Native Interface) che si appoggia a codice nativo (prevantemente C o C++) interfacciato direttamente al driver relativo del sistema operativo. Questa soluzione rende tali librerie non cross-platform e fortemente legate alla piattaforma per cui sono state progettate. Altre librerie utilizzano invece JavaComm (Java Communication API) per interfacciarsi al dispositivo bluetooth rimanendo crossplatform. Questa soluzione permette solo in parte l’indipendenza dalla piattaforma, in quanto comunque le librerie JavaComm sono legate al sistema su cui si trovano. Esiste infatti una versione differente per linux e solaris, ma non una specifica per windows, seppur sia presente una versiona Generic. Inoltre tale librerie non sono state pensate espressamente per bluetooth ma per interfacciarsi a dispositivi RS232. Le prove delle librerie sono state effettuate con sistema operativo Windows XP SP2, Debian unstable aggiornata al 12/05/2006 e OpenSuse 10.2. Bluetooth for Java 2 Standard Edition Massimo Albertin 2 Windows Di seguito è riportata un’analisi delle librerie disponibili per piattaforma Windows. 2.1 Bluecove 1.2.1 E’ una libreria che si appoggia ai driver Microsoft presenti in Windows XP SP2 ed implementa in modo abbastanza completo le specifiche JSR-82. Permette trasferimenti con profilo RFCOMM, ma non permette l’accesso tramite L2CAP. Ciò è legato a vincoli imposti dal driver Microsoft stesso che nasconde questo livello. Sul sito web è possibile scaricare anche i sorgenti della libreria con alcuni esempi per provarne le funzionalità. La libreria non è corredata di documentazione, anche se i sorgenti della libreria sono ben commentati, si consiglia quindi di fare riferimento a documentazione per la generica JSR-82. 2.1.1 Note Questa libreria non funziona se sono si sono installati driver widcomm/broadcom che spesso vengono forniti con i Dongle Bluetooth USB. 2.1.2 Installazione Il file zip scaricabile dal sito contiene un file intelbth.dll da copiare all’interno della cartella <WINDIR>/System32 e una libreria java bluecove.jar da aggiungere al classpath del progetto java per poter utilizzare le funzioni implementate. Alternativamente è possibile aggiungere la libreria .jar al classpath dell’installazione di java. 2.1.3 Sito Web http://code.google.com/p/bluecove/ 2.2 Avelink Si tratta di un’ulteriore implementazione per Windows, in questo caso a pagamento, che rispetta le specifiche JSR82. Esistono differenti versioni per differenti dispositivi bluetooth e per diversi sistemi tra cui anche Windows CE. La documentazione è abbastanza dettagliata essendo un prodotto commerciale. L’interfacciamento con il dispositivo avviene attraverso un driver proprietario da installare al posto del driver attualmente in uso per la periferica Bluetooth. Dal sito è possibile scaricare una versione trial funzionante per 14 giorni. 2.2.1 Installazione L’installazione prevede l’aggiornamento del driver della periferica con il driver fornito da avelink. A questo punto basta aggiungere al classpath di sistema o del progetto la libreria jar per poter accedere alle funzionalità di comunicazione. 2.2.2 Sito Web http://www.avelink/Bluetooth 1 3 Linux Di seguito è riportata un’analisi delle librerie disponibili per piattaforma Linux. 3.1 Avetana Nonostante sia un po’ laboriosa l’installazione di tale software, si tratta di una implementazione di JSR-82 abbastanza completa. Comprende una implementazione dei profile bluetooth RFCOMM, L2CAP e OBEX. 3.1.1 Installazione: Questa implementazione di JSR-82 si appoggia alle librerie Bluez (Bluez) per linux che devono essere correttamente installate nel sistema. Prima di procedere con l’installazione è importante controllare i prerequisiti sia in termine di librerie che di configurazione del kernel del sistema stesso. Per quanto riguarda il kernel è fondamentale controllare e nel caso ricompilare il kernel in modo da includere (si consiglia kernel dal 2.6.16 in su) la gestione del bluetooth nella sezione: Networking-->Bluetooth abilitando tutti i possibili profili bluetooth disponibili, nelle prove effettuate è stato compilato il kernel con inclusione diretta dei driver ma si ottiene lo stesso risultato anche configurando il bluetooth come moduli. Se configurati i moduli questi devono poi essere caricati tramite modprobe prima di eseguire l’applicazione java. Per Debian è necessario installare i alcuni pacchetti tramite comando: apt-get install bluez-utils libbluetooth1 libbluetooth1-dev bluetooth bluetooth-desktop autoconf per poter poi testare il corretto funzionamento dell’interfaccia bluetooth è possibile installare anche kbluetooth tramite il comando apt-get install kbluetooth un programma per kde grafico che permette un semplice gestione dell’interfaccia bluetooth. Alternativamente utilizzando altre distribuzioni Linux è possibile scaricare queste librerie direttamente dal sito del progetto Bluez, e seguire le istruzioni di installazione presenti sul sito web. A questo punto è possibile procedere con l’installazione del pacchetto avetanabt. Per prima cosa è necessario impostare le variabili di sistema utilizzate dallo script di installazione install, in questo modo: export JDK_HOME=/jdkDirectory export JDK_PLATFORM=linux export BIN_DIR=/avetanaDirectory/binariesRiferimenti a questo punto è possibile eseguire lo script di installazione nella directory /avetanaDirectory/binaries verranno creati due files un file di libreria .so da spostare nella directory di sistema /usr/lib e un file .jar da includere al progetto java. Lo script eseguirà dapprima un configure per controllare i prerequisiti, nel caso fallisca controllare il messaggio di errore ed installare le librerie mancanti. La procedura di installazione creerà inoltre la documentazione delle classi nella cartella javadoc. La procedura di installazione con OpenSuse è del tutto analoga, una volta soddisfatte tutte le dipendenze di librerie richieste. 3.1.2 Note È fortemente consigliata questa versione del software o successive in quanto le precedenti avevano una serie di problemi legati a bug consistenti negli script di installazione. La compilazione su Open Suse 10.2 e Debian unstable aggiornata a date successive a quella indicata nell’introduzione potrebbe portare ad un fallimento. Questo perché le nuove versioni dei compilatori utilizzano regole più stringenti che portano ad un fallimento generale della compilazione della parte scritta in C++ (file bluez.cpp). 3.1.3 Sito Web http://sourceforge.net/projects/avetanabt/ 3.2 Impronto E’ una libreria commerciale che si appoggia sulle librerie Bluez di Linux. Il software è liberamente utilizzabile come studenti universitari a seguito di una registrazione sul sito del produttore. Il funzionamento è del tutto analogo a quello già visto per le librerie precedenti, anche se dai test effettuati non si è riscontrata piena compatibilità con le specifiche JSR-82 soprattutto per quanto riguarda l’inquiry. La versione commerciale oltre a fornire i driver fornisce una emulatore molto completo per i test dei dispositivi bluetooth in grado di emulare anche la locazione fisica dei dispositivi stessi. Quest’ultimo non è però disponibile in licenza gratuita studenti. La documentazione distribuita con la libreria è molto dettagliata anche nella versione gratuita e comprende oltre alla javadoc di definizione delle api un documento pdf con alcuni esempi e due esempi veri e proprio pronti da compilare. 3.2.1 Installazione L’installazione è molto semplice soprattutto in OpenSuse, dal momento che viene fornito un pacchetto .rpm autoinstallante. L’installazione guidata non fa altro che copiare la libreria java idev_bluez.jar in /usr/share/java, il codice nativo di interfacciamento alla libreria bluez in /usr/lib/ libimpronto.so e la documentazione in /usr/share/doc/impronto-1.3. Nel caso in cui si voglia installare il prodotto in Debian si consiglia di utilizzare il comando alien per produrre un pacchetto di installazione .deb a partire dall’rpm e procedere poi con l’installazione tramite dpkg –i pacchetto.deb 3.2.2 Note Affinchè la libreria funzioni correttamente è necessario includere nel classpath il file LinuzLicense.txt fornito con la mail di registrazione. Nel caso in cui si presenti un errore del tipo cannot find libbluetooth.so.1 Bluetooth for Java 2 Standard Edition Massimo Albertin 2 nonostante le bluez-libs siano state installate basta creare un link simbolico con quel nome all’interno di /usr/lib che punti alla libreria libbluetooth.so sicuramente già presente. 3.2.3 Sito Web http://www.rococosoft.com/ 3.3 JBluez Si tratta di un porting java delle librerie Bluez (Bluez) di linux che non rispettano gli standard JSR-82. Sul sito è presenta la tutta la documentazione necessaria per corretto utilizzo ed installazione, nonché le javadoc delle api fornite dalla libreria. E’ possibile scaricare anche il codice sorgente. 3.3.1 Installazione L’installazione è molto simile a quella già analizzata per le librerie per Linux, il file zip scaricabile dal sito comprende oltre ai sorgenti un file jbluez.jar da includere al classpath e un file libjbluez.so da inserire in /usr/lib. 3.3.2 Sito Web http://jbluez.sourceforge.net/ JSR 82: JavaTM APIs for Bluetooth. (n.d.). Retrieved Gennaio 13, 2007, from http://www.jcp.org/en/jsr/detail?id=82 Mahmoud, Q. H. (n.d.). The Java APIs for Bluetooth Wireless Technology. Retrieved from http://developers.sun.com/techtopics/mobility/midp/articl es/bluetooth2/ The Java ME Platform — the Most Ubiquitous Application Platform for Mobile Devices. (n.d.). Retrieved from http://java.sun.com/javame/index.jsp 3.4 JavaBluetooth E’ un implementazione JSR-82 completamente in Java, che utilizza JavaComm per interfacciarsi al dispositivo bluetooth. Supporta HCI, L2CAP e SDP ma non RFCOMM. Questa libreria non necessita di una vera e proprio installazione a patto che sia già presente la libreria JavaComm in classpath. E’ presente una documentazione javadoc, ma non sono allegati esempi di funzionamento. 4 Conclusioni Nel caso in cui si voglia utilizzare il bluetooth su piattaforma Windows la scelta migliore è sicuramente Bluecove che fornisce in licenza opensource un ottimo prodotto semplice da installare. Per quanto riguarda linux invece l’implementazione maggiormente compatibile con gli standard è la avetana, a patto che venga utilizzata su distribuzioni non troppo recenti (almeno fino all’uscita di una nuova release). Una alternativa potrebbe essere la JavaBluetooth che però fa ricorso alle JavaComm che non sono propriamente progettate per il bluetooth. Riferimenti Bluetooth Learn. (n.d.). Retrieved from http://www.bluetooth.com/Bluetooth/Learn/ Bluez. (n.d.). Retrieved from http://www.bluez.org/ Fitton, D. (2006, Novembre 22). Java Bluetooth HOWTO. Retrieved Gennaio 13, 2007, from http://www.caside.lancs.ac.uk/java_bt.php Hopkins, B., & Ranjith, A. (2003). Bluetooth for Java. Apress. Java Communication API. (n.d.). Retrieved from http://java.sun.com/products/javacomm/ Java Native Interface. (n.d.). Retrieved from http://java.sun.com/javase/6/docs/technotes/guides/jni/ind ex.html Java SE at a Glance. (n.d.). Retrieved from http://java.sun.com/javase/ Bluetooth for Java 2 Standard Edition Massimo Albertin 3