Android e iPhone OS hanno tante cose in comune, ma una e’ davvero fastidiosa e castrante per gli sviluppatori: lo stack Bluetooth e’ accessibile solo alle applicazioni di sistema ed e’ stato totalmente escluso dalle API pubbliche disponibili sugli SDK ufficiali.
Questo significa essenzialmente che e’ impossibile scrivere applicazioni in grado di connettersi a GPS esterni (o a qualsiasi altro tipo di sensore dotato di questa interfaccia), LEGO Mindstorms NXT, Arduino Bluetooth, lettori RFID con interfaccia Bluetooth e via dicendo. Si tratta certamente di una nicchia, ma resta comunque una nicchia piuttosto interessante e chi ci lavora spesso lo fa per divertimento o sperimentazione di frontiera. Senza contare le innumerevoli applicazioni industriali. Perche’ privarsene?
Leggendo il sorgente (http://source.android.com) e usando sistematicamente la reflection di Java, ho definito una API e scritto una libreria che consente di accedere alle funzionalità base dello stack Bluetooth di Android. In particolare la libreria consente di:
- attivare/disattivare il servizio Bluetooth (e leggerne lo stato corrente)
- effettuare una scansione dei dispositivi Bluetooth limitrofi (e conoscerne l’indirizzo, la classe e il friendly name
- effettuare il pairing con un device remoto
- aprire una connessione seriale RFCOMM verso un dispositivo remoto
La Experimental Android Bluetooth Library e’ pubblicata gratuitamente sotto licenza Apache 2.0 ed e’ disponibile su:
http://code.google.com/p/android-bluetooth/
Rispetto a progetti simili, questa API (e la relativa implementazione) non richiede che l’accesso root al terminale. In altre parole, funziona su qualsiasi terminale commerciale, senza che sia necessario effettuare alcuna modifica al firmware. Essendo basata sulla reflection, funziona… finché Google non decidera’ di cambiare lo stack Bluetooth di Android (ed è verosimile che cambi, visto che il ramo del sorgente piu’ recente contiene pezzi di una nuova API e chiamate alla vecchia libreria precedente alla 0.9). Ho testato l’API con successo su Cupcake e sulla versione 1.1, il funzionamento sembra abbastanza stabile.
Una applicazione (chiamata “Bluetooth Samples”) che mostra funzionalità fornite dalla libreria è disponibile sull’Android Market. Il sorgente dell’applicazione e’ pubblicato insieme alla libreria su Google Code. L’applicazione consente anche di testare la connession RFCOMM, permettendo di connettersi ad un GPS Bluetooth del quale e’ visualizzato lo stream NMEA. Qui di seguito alcuni snapshot dell’applicazione:
Wow sembra un lavorone.
> Perche’ privarsene?
>
Tradotto: ta faisi, te ne privi? 😀
Nonostante i problemi come questo, risolti da certi geniacci che si trovano in giro per la rete, non vedo l’ora di poter provare un terminale android e magari scrivere qualche app. Speriamo calino i prezzi 🙂
Complimenti Stefano!
@Andrea: all’inizio e’ stata sperimentazione “leggera”, giusto per vedere se l’idea della reflection era campata per aria oppure poteva dare qualche risultato decente. Poi la cosa e’ andata complicandosi… Ora sto lavorando alla funzionalita’ di discovery dei servizi remoti, in particolare per trovare i channel rfcomm di un dispositivo (e, dunque, poter automatizzare tutto il processo di connessione senza che il programmatore debba mettere un numero di canale hardcoded nell’applicazione). Quanto ai prezzi, credo che il Galaxy abbia un prezzo molto interessante…
@Ottorino: Thanks 🙂
@Both: feedback sul campo molto molto graditi…
Bellizzimo!
grazie magister!
Troppo buono! Macche’ magister! Sono un umile padawan!
Anche se te li ho gia fatti rinnovo i complimenti.. Appena riesco ci do un occhiata 🙂
Non è che stai diventando di “troppo basso livello”… dai scherzo.. bravissimo!! 😀
@Andrea: grazie!
@Dario: anzi, visto che ho usato pesantemente la reflection, piu’ “ad alto livello” di cosi’ proprio non avrei potuto fare 🙂 Scherzi a parte, Bluetooth e’ una passione quasi viscerale, mi riporta alla sperimentazione con la seriale dei primi PC (e ancora piu’ indietro ai modem packet radio con AM7910, quando AMD era ancora sconosciuta….)
Sicuramente, dopo questo post, farò il porting della apps da J2ME a Android!
E poi che figata Android & Arduino! Sembrano quasi fratelli!
Grazie Ste e felice giornata!
😀
Ciao,
non riesco a trovare i sorgenti! :-s
Trovati, scusa!
hey i try to initialize the bluetooth service with the following method LocalBluetoothDevice.initLocalDevice(context) but it throws null pointer exception how can i initialize the bluetooth service plz help me!!
Is it possible to get the source code examples?
@pedro: yes, you can download the source code of the “Bluetooth Samples” application (already published on the Android Market) in the SVN repository of the library. Check it out at: http://code.google.com/p/android-bluetooth
Salve, sto cercando di utilizzare l’esempio BluetoothChat con eclipse.
Ho scaricato la libreria AndroidBluetoothAPI0.3 e l’ho aggiunta al porgetto.
IL progetto però riporta degli errori.
Come mai non funziona con Android 2.1 API 7
(neanche con le 2.3.3 API 10)
aggiungendo la libreira non dovrebbe essere tutto ok?
Mentre se uso Android 3.0 API 11 gli errori spariscono anche eliminando la libreria.
Il fatto è che poi vorrei testarlo con dei telefoni reali che non hanno Android 3.0.
Sto sbagliando qualcosa?
Grazie
Ciao.
La libreria Bluetooth che ho scritto è per Android 1.x. Per le versione 2.0 e successive puoi usare l’API standard. Il fatto che sulla 3.0 spariscano degli errori che sono presenti nela 2.1 può dipendere dall’uso di metodi non supportati dalle prime versioni della API Bluetooth di Android.
Saluti,
Stefano