Android Bluetooth API


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:

bluetooth_samples_01.png

bluetooth_samples_02.png

bluetooth_samples_03.png

bluetooth_samples_05.png

bluetooth_samples_08.png

bluetooth_samples_09.png

bluetooth_samples_10.png

bluetooth_samples_11.png

bluetooth_samples_12.png

bluetooth_samples_13.png

16 pensieri su “Android Bluetooth API

  1. Andrea

    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 🙂

  2. gerdavax Autore articolo

    @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…

  3. gerdavax Autore articolo

    @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….)

  4. Cristian

    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!

    😀

  5. Lokidil

    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!!

  6. mutnet

    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

    1. gerdavax Autore articolo

      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

Lascia un commento