SlideShare una empresa de Scribd logo
1 de 31
Descargar para leer sin conexión
Bluetooth Hacking
     Stefano Sanna - JUG Sardegna
    Emanuele Di Saverio - JUG Roma




                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                       Javaday IV – Roma – 30 gennaio 2010
Sommario

• Chi siamo
• L’importanza del Bluetooth sui device mobili
• Android & Bluetooth: storia di un amore mancato
• Happy hacking!
• La Bluetooth API per Android 1.x
• L’API ufficiale di Android 2.0
• Demo: Android per controllare Arduino Bluetooth
                              Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                               Javaday IV – Roma – 30 gennaio 2010
Chi siamo

• Stefano Sanna
 • Senior Solution Engineer Android @ beeweeb SpA
 • Autore del libro “Java Micro Edition”, Hoepli (2007)
 • Main designer Bluetooth API for Android 1.x

• Emanuele Di Saverio
 • Scrum Master and Senior Developer @ beeweeb SpA
 • SCMAD, SCJP
 • Committer Easy-Bluetooth framework for Android

                                  Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                   Javaday IV – Roma – 30 gennaio 2010
Bluetooth su Android

• early Android
  • Wrapper Java su Bluez
• Android 0.9
  • Sparisce l’API Bluetooth!

• Android 1.x
  • Nessuna API per gli sviluppatori
• Android 2.x
  • Introduce una API che consente il discovery di device
   remoti, di aprire connessioni RFCOMM client e server
                                   Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                    Javaday IV – Roma – 30 gennaio 2010
L’importanza del supporto Bluetooth

• Senza una API dedicata non è possibile:
  • Discovery di device e servizi
  • Trasferimento file con Bluetooth FTP e OBEX

  • Connessioni a GPS, gamepad, apparati medicali

  • Controllo remoto di moduli embedded e sensor network

  • Applicazioni di robotica (LEGO Mindstorms, etc...)
                                    Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                     Javaday IV – Roma – 30 gennaio 2010
Tanti device la’ fuori...




Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                 Javaday IV – Roma – 30 gennaio 2010
Happy
Hacking!


     Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                      Javaday IV – Roma – 30 gennaio 2010
System service & Reflection

• Il Bluetooth Service è accessibile come qualsiasi altro
   Android Service:

Object bluetoothService = context.getSystemService(“bluetooth”);


   A questo punto, ottenuta la classe, si può utilizzare la
   reflection per conoscerne (e invocarne!) i metodi:

Class bluetoothServiceClass = bluetoothService.class;

Method[] bluetoothMethods = bluetoothServiceClass.getMethods();

                                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                       Javaday IV – Roma – 30 gennaio 2010
I metodi disponibili


                     O !
public android.bluetooth.BluetoothDevice(android.bluetooth.IBluetoothDevice)




                    P O
public boolean android.bluetooth.BluetoothDevice.cancelBondProcess(java.lang.String)
public void android.bluetooth.BluetoothDevice.cancelDiscovery()




                   P S
public boolean android.bluetooth.BluetoothDevice.cancelPin(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.createBond(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.disable()




                  O ES
public boolean android.bluetooth.BluetoothDevice.disconnectRemoteDeviceAcl(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.enable()




                R L
public java.lang.String android.bluetooth.BluetoothDevice.getAddress()
public int android.bluetooth.BluetoothDevice.getBluetoothState()




              T P
public int android.bluetooth.BluetoothDevice.getBondState(java.lang.String)
public java.lang.String android.bluetooth.BluetoothDevice.getCompany()
public int android.bluetooth.BluetoothDevice.getDiscoverableTimeout()
public java.lang.String android.bluetooth.BluetoothDevice.getManufacturer()
public java.lang.String android.bluetooth.BluetoothDevice.getName()




                 M
public int android.bluetooth.BluetoothDevice.getRemoteClass(java.lang.String)
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteCompany(java.lang.String)
public [B android.bluetooth.BluetoothDevice.getRemoteFeatures(java.lang.String)




               O
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteManufacturer(java.lang.String)
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteName(java.lang.String)




             C
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteRevision(java.lang.String)
public boolean
android.bluetooth.BluetoothDevice.getRemoteServiceChannel(java.lang.String,short,android.bluetoot
h.IBluetoothDeviceCallback)

                                                     Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                                      Javaday IV – Roma – 30 gennaio 2010
Permission

• Primo passo: per accedere alle funzionalità Bluetooth
   occorre dichiarare due Permission nel Manifest:


<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />




                                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                       Javaday IV – Roma – 30 gennaio 2010
Discovery device remoti

LocalBluetoothDevice local = LocalBluetoothDevice.init(context);

local.setListener(new LocalBluetoothDeviceListener() {

      public void scanStarted() {
         // e’ partita la scansione...
      }

      public void scanCompleted(ArrayList<String> devices) {
         // scansione completata
      }
});

local.scan();     // avvia la scansione...




                                         Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                          Javaday IV – Roma – 30 gennaio 2010
Apertura di un socket RFCOMM client

RemoteBluetoothDevice dev = local.getRemoteBluetoothDevice(address);

dev.setListener(new RemoteBluetoothDeviceListener() {

   public void paired() {
     // si aprono socket e stream I/O...           3
     BluetoothSocket socket = dev.openSocket(1);
     InputStream input = socket.getInputStream();
     OutputStream output = socket.getOutputStream();
   }

   public void pinRequested() {
      // mostra la dialog per l’inserimento del PIN                  2
   }
});

dev.pair();   1
                                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                       Javaday IV – Roma – 30 gennaio 2010
Device compatibili

• HTC Dream
• HTC Magic
• HTC Tattoo
• Samsung Galaxy i7500
• Samsung Galaxy i5700
• Huawei U8220
• Sony-Ericsson XPERIA X10
                             Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                              Javaday IV – Roma – 30 gennaio 2010
Bluetooth API for Android 1.x

• Unica libreria opensource (Apache 2.0) che per
    l’accesso allo stack Bluetooth su Android 1.x
•   Funzionalità:
    • accensione/spegnimento Bluetooth
    • discovery di dispositivi remoti e della porta RFCOMM port
        di un servizio
    •   apertura connessioni RFCOMM client
• Funziona senza la necessità di accesso root
• Check it out!
    • http://code.google.com/p/android-bluetooth
                                    Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                     Javaday IV – Roma – 30 gennaio 2010
Bluetooth API for Android 1.x

• Oltre 1000 download!
• Utilizzata in progetti commerciali e free:
  • Ha ispirato la realizzazione di Bluetooth File Transfer di
      Medieval Software, l’applicazione di trasferimento file di
      maggior successo nell’Android Market
  •   È utilizzata in Amarino (sviluppato al MIT), primo
      framework di controllo di Arduino attraverso Android
  •   È utilizzata in GoPayment di Intuit Inc., per il pagamento
      con carta di credito attraverso swiper e stampante BT

                                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                       Javaday IV – Roma – 30 gennaio 2010
Principali limitazioni

• Non è possibile registrare un servizio sul database
  SDP (Service Discovery Protocol), benché sia
  possibile creare socket server RFCOMM

• Se si utilizza la funzionalità di device inquiry subito
  dopo l’avvio del telefono, la chiamata nativa
  interferisce con un processo di scansione del
  sistema e lo stack Bluetooth diventa inutilizzabile

• Problemi di compatibilità con HTC Hero
                                 Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                  Javaday IV – Roma – 30 gennaio 2010
Permission su socket dbus




  Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                   Javaday IV – Roma – 30 gennaio 2010
L’API di Android 2.x

• Android 2.0 : Bluetooth ufficialmente nell'SDK!
• Yay!
  • Niente controllo diretto sul pairing
  • Niente accesso diretto ai canali RFCOMM
  • Niente discovery dei servizi
   ...not so :
• Android style: basato su Intents and Receivers
  • paradigma Publish/Subscribe, un po’ macchinoso!
                                 Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                  Javaday IV – Roma – 30 gennaio 2010
Discovery in Android 2.x


BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();

IntentFilter filter = new IntentFilter();

filter.addAction(BluetoothDevice.ACTION_FOUND);
filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

//also can register for DISCOVERY_STARTED Action

context.registerReceiver(receiver, filter);

adapter.startDiscovery();




                                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                       Javaday IV – Roma – 30 gennaio 2010
BroadcastReceiver
private final BroadcastReceiver receiver = new BroadcastReceiver() {

 public void onReceive(Context ctx, Intent intent) {

         final String action = intent.getAction();

             if (action.equals(BluetoothDevice.ACTION_FOUND)) {
                    BluetoothDevice device = (BluetoothDevice)
                 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

                //process device
             } else if
             (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED))
             {
                //done :o)
             }
     }
};

                                          Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                           Javaday IV – Roma – 30 gennaio 2010
Socket e stream I/O

//given a valid “BluetoothDevice”...

UUID uuidOfTargetService =
UUID.nameUUIDFromBytes(“2d26618601fb47c28d9f10b8ec891363”);

BluetoothSocket socket =
rbd.createRfcommSocketToServiceRecord(uuidOfTargetService);

socket.connect();

InputStream input = socket.getInputStream();
OutputStream output = socket.getOutputStream();

....

socket.close();


                                       Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                        Javaday IV – Roma – 30 gennaio 2010
Buone pratiche su Android

• È importante tenere a mente le buone usanze di
 programmazione Android (e Java!):

  • operazioni di I/O sempre su un Thread separato

  • aggiornare la UI via Handler

  • deregistrare i Receivers prima di terminare un Context


                                   Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                    Javaday IV – Roma – 30 gennaio 2010
Serve ancora una libreria custom?

• Malgrado l’API di Android 2.0, una libreria Bluetooth
 avrebbe ancora la sua utilità!

  • Accesso alle feature nascoste (via reflection)
  • Esposizione di una API più semplice
  • Astrazione 1.x vs 2.0    Retrocompatibilità!

• ....in lavorazione Easy Bluetooth
  • Check it out:
   http://android-bluetooth.googlecode.com/svn/
                                  Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                   Javaday IV – Roma – 30 gennaio 2010
Android controlla Arduino

• Vogliamo utilizzare Android per
 controllare via Bluetooth un LED e
 leggere una temperatura




                               Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                Javaday IV – Roma – 30 gennaio 2010
Arduino

• “Arduino is an open-source electronics prototyping
    platform based on flexible, easy-to-use hardware and
    software. [...] It can sense the environment by
    receiving input from a variety of sensors and can
    affect its surroundings by controlling lights, motors,
    and other actuators.
•   Rigorosamente MADE IN ITALY!

• http://www.arduino.cc

                                 Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                  Javaday IV – Roma – 30 gennaio 2010
Sorgente Arduino
int LED_PIN = 13;    int LM35_PIN = 2;

void setup() {                                    Hardware utilizzato:
  Serial.begin(115200);

}
  pinMode(LED_PIN, OUTPUT);
                                                  • Arduino Bluetooth
                                                  • Prototype shield e breadboard
void loop() {                                     • LM35 Temperature Sensor
  if (Serial.available() > 0) {
    int inByte = Serial.read();

    switch (inByte) {
       case '1':
         digitalWrite(LED_PIN, HIGH);
         Serial.write('1');
         break;
       case '0':                         void readTemp() {
         digitalWrite(LED_PIN, LOW);       int temp = analogRead(LM35_PIN);
         Serial.write('0');                temp= ( 5.0 * temp * 100.0) / 1024.0;
         break;                            Serial.write(temp);
       case 'r':
                                         }
         readTemp();
         break;
    }
}

                                            Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                             Javaday IV – Roma – 30 gennaio 2010
Sorgente Android


// definiamo i comandi...
byte LED_ON_REQUEST = ‘1’;
byte LED_OFF_REQUEST = ‘0’;
byte READ_TEMPERATURE = ‘r’;

[...]

// all’interno del Thread inviamo comandi e leggiamo le risposte...
output.write(request);
final int response = input.read();

if (request == 'r') {
   handler.post(new Runnable() {
      public void run() {
         String temp = Integer.toString(response);
         Toast.makeText(Controller.this, "LM35 Sensor: " + temp + "°C", 4000).show();

        });
}


                                                     Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                                      Javaday IV – Roma – 30 gennaio 2010
DEMO!

                                   Starring:

Motorola Milestone (Android 2.0), HTC Magic (Android 1.6) and Arduino Bluetooth



                                           Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                            Javaday IV – Roma – 30 gennaio 2010
Risorse

• Android
  • http://developer.android.com
  • http://source.android.com

• Bluetooth API for Android 1.x e Easy Bluetooth
  • http://code.google.com/p/android-bluetooth

• Arduino
  • http://www.arduino.cc

                                   Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                    Javaday IV – Roma – 30 gennaio 2010
Riferimenti

• Stefano Sanna
 • gerdavax AT gmail DOT com
 • http://www.gerdavax.it

• Emanuele Di Saverio
 • emanuele DOT disaverio AT gmail DOT com




                               Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                Javaday IV – Roma – 30 gennaio 2010
GRAZIE!

Stefano & Emanuele & i rispettivi JUG!




                       Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                        Javaday IV – Roma – 30 gennaio 2010

Más contenido relacionado

Similar a Android Bluetooth Hacking

Lo sbarco di Google nel pianeta Mobile Internet: primo impatto ed esempi pra...
Lo sbarco di Google nel pianeta Mobile Internet:  primo impatto ed esempi pra...Lo sbarco di Google nel pianeta Mobile Internet:  primo impatto ed esempi pra...
Lo sbarco di Google nel pianeta Mobile Internet: primo impatto ed esempi pra...Riccardo Solimena
 
2.5tier Javaday (italian)
2.5tier Javaday (italian)2.5tier Javaday (italian)
2.5tier Javaday (italian)Luigi Fugaro
 
Andrea Cartotto Le carte vincenti del Software Libero
Andrea Cartotto Le carte vincenti del Software LiberoAndrea Cartotto Le carte vincenti del Software Libero
Andrea Cartotto Le carte vincenti del Software LiberoLibreItalia
 
Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...
Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...
Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...Andrea Cartotto
 
Internet of Things - Cos'è e cosa ci posso fare?
Internet of Things - Cos'è e cosa ci posso fare?Internet of Things - Cos'è e cosa ci posso fare?
Internet of Things - Cos'è e cosa ci posso fare?Fulvio Corno
 
Impostare un sistema IOT: 5 errori da evitare
Impostare un sistema IOT: 5 errori da evitareImpostare un sistema IOT: 5 errori da evitare
Impostare un sistema IOT: 5 errori da evitareFabio Gatti
 
Freedomotic pitch 12.05.16 Smart Home Now Milano
Freedomotic pitch 12.05.16 Smart Home Now MilanoFreedomotic pitch 12.05.16 Smart Home Now Milano
Freedomotic pitch 12.05.16 Smart Home Now Milanofreedomotic
 
Corso Web 2.0: Il Web come piattaforma
Corso Web 2.0: Il Web come piattaformaCorso Web 2.0: Il Web come piattaforma
Corso Web 2.0: Il Web come piattaformaRoberto Polillo
 
Controllo di un impianto My Home da iPad iPhone-iPod touch
Controllo di un impianto My Home da iPad iPhone-iPod touch  Controllo di un impianto My Home da iPad iPhone-iPod touch
Controllo di un impianto My Home da iPad iPhone-iPod touch INGEGNI Tech Srl
 
FODD 2015 Mobile App based on ServiceMap, http://www.disit.org/fodd
FODD 2015 Mobile App based on ServiceMap, http://www.disit.org/foddFODD 2015 Mobile App based on ServiceMap, http://www.disit.org/fodd
FODD 2015 Mobile App based on ServiceMap, http://www.disit.org/foddPaolo Nesi
 
NFC (Near Field Communication - Comunicazione di prossimità)
NFC (Near Field Communication - Comunicazione di prossimità)NFC (Near Field Communication - Comunicazione di prossimità)
NFC (Near Field Communication - Comunicazione di prossimità)Luca Santoro
 
Building brain - infoFACTORY - home and building automation - smart cities
Building brain  - infoFACTORY - home and building automation - smart citiesBuilding brain  - infoFACTORY - home and building automation - smart cities
Building brain - infoFACTORY - home and building automation - smart citiesPaolo Omero
 
Piattaforma di integrazione di sistemi domotici eterogenei - infoFACTORY
Piattaforma di integrazione di sistemi domotici eterogenei - infoFACTORYPiattaforma di integrazione di sistemi domotici eterogenei - infoFACTORY
Piattaforma di integrazione di sistemi domotici eterogenei - infoFACTORYinfoFACTORY
 
Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...
Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...
Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...IWA
 
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodemotion
 
Android Code Camp for Beginners - Ecosistema Android (IT)
Android Code Camp for Beginners - Ecosistema Android (IT)Android Code Camp for Beginners - Ecosistema Android (IT)
Android Code Camp for Beginners - Ecosistema Android (IT)Alessandro Bogliolo
 

Similar a Android Bluetooth Hacking (20)

Lo sbarco di Google nel pianeta Mobile Internet: primo impatto ed esempi pra...
Lo sbarco di Google nel pianeta Mobile Internet:  primo impatto ed esempi pra...Lo sbarco di Google nel pianeta Mobile Internet:  primo impatto ed esempi pra...
Lo sbarco di Google nel pianeta Mobile Internet: primo impatto ed esempi pra...
 
Android
AndroidAndroid
Android
 
2.5 Tiers
2.5 Tiers2.5 Tiers
2.5 Tiers
 
2.5tier Javaday (italian)
2.5tier Javaday (italian)2.5tier Javaday (italian)
2.5tier Javaday (italian)
 
Andrea Cartotto Le carte vincenti del Software Libero
Andrea Cartotto Le carte vincenti del Software LiberoAndrea Cartotto Le carte vincenti del Software Libero
Andrea Cartotto Le carte vincenti del Software Libero
 
Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...
Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...
Andrea Cartotto - Le "carte vincenti" nel software libero: cittadinanza digit...
 
Internet of Things - Cos'è e cosa ci posso fare?
Internet of Things - Cos'è e cosa ci posso fare?Internet of Things - Cos'è e cosa ci posso fare?
Internet of Things - Cos'è e cosa ci posso fare?
 
Impostare un sistema IOT: 5 errori da evitare
Impostare un sistema IOT: 5 errori da evitareImpostare un sistema IOT: 5 errori da evitare
Impostare un sistema IOT: 5 errori da evitare
 
Freedomotic pitch 12.05.16 Smart Home Now Milano
Freedomotic pitch 12.05.16 Smart Home Now MilanoFreedomotic pitch 12.05.16 Smart Home Now Milano
Freedomotic pitch 12.05.16 Smart Home Now Milano
 
Corso Web 2.0: Il Web come piattaforma
Corso Web 2.0: Il Web come piattaformaCorso Web 2.0: Il Web come piattaforma
Corso Web 2.0: Il Web come piattaforma
 
Controllo di un impianto My Home da iPad iPhone-iPod touch
Controllo di un impianto My Home da iPad iPhone-iPod touch  Controllo di un impianto My Home da iPad iPhone-iPod touch
Controllo di un impianto My Home da iPad iPhone-iPod touch
 
FODD 2015 Mobile App based on ServiceMap, http://www.disit.org/fodd
FODD 2015 Mobile App based on ServiceMap, http://www.disit.org/foddFODD 2015 Mobile App based on ServiceMap, http://www.disit.org/fodd
FODD 2015 Mobile App based on ServiceMap, http://www.disit.org/fodd
 
BLUETOOTH SECURITY - part1
BLUETOOTH SECURITY - part1BLUETOOTH SECURITY - part1
BLUETOOTH SECURITY - part1
 
Android
AndroidAndroid
Android
 
NFC (Near Field Communication - Comunicazione di prossimità)
NFC (Near Field Communication - Comunicazione di prossimità)NFC (Near Field Communication - Comunicazione di prossimità)
NFC (Near Field Communication - Comunicazione di prossimità)
 
Building brain - infoFACTORY - home and building automation - smart cities
Building brain  - infoFACTORY - home and building automation - smart citiesBuilding brain  - infoFACTORY - home and building automation - smart cities
Building brain - infoFACTORY - home and building automation - smart cities
 
Piattaforma di integrazione di sistemi domotici eterogenei - infoFACTORY
Piattaforma di integrazione di sistemi domotici eterogenei - infoFACTORYPiattaforma di integrazione di sistemi domotici eterogenei - infoFACTORY
Piattaforma di integrazione di sistemi domotici eterogenei - infoFACTORY
 
Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...
Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...
Interazione multimodale su Mobile: interazione vocale, touch e grafica su div...
 
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple WatchCodice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
Codice iPhone lavato a caldo: come "restringere" la tua app per Apple Watch
 
Android Code Camp for Beginners - Ecosistema Android (IT)
Android Code Camp for Beginners - Ecosistema Android (IT)Android Code Camp for Beginners - Ecosistema Android (IT)
Android Code Camp for Beginners - Ecosistema Android (IT)
 

Más de Stefano Sanna

Mobile Security su Android - LinuxDay 2018
Mobile Security su Android - LinuxDay 2018Mobile Security su Android - LinuxDay 2018
Mobile Security su Android - LinuxDay 2018Stefano Sanna
 
Android Things, from mobile apps to physical world
Android Things, from mobile apps to physical worldAndroid Things, from mobile apps to physical world
Android Things, from mobile apps to physical worldStefano Sanna
 
Android Things Linux Day 2017
Android Things Linux Day 2017 Android Things Linux Day 2017
Android Things Linux Day 2017 Stefano Sanna
 
Android Things in action
Android Things in actionAndroid Things in action
Android Things in actionStefano Sanna
 
Introduzione alla tecnologia iBeacon
Introduzione alla tecnologia iBeaconIntroduzione alla tecnologia iBeacon
Introduzione alla tecnologia iBeaconStefano Sanna
 
Augmented Smartphone
Augmented SmartphoneAugmented Smartphone
Augmented SmartphoneStefano Sanna
 
Bluetooth Low Energy
Bluetooth Low EnergyBluetooth Low Energy
Bluetooth Low EnergyStefano Sanna
 
Google TV: la nuova frontiera Android
Google TV: la nuova frontiera AndroidGoogle TV: la nuova frontiera Android
Google TV: la nuova frontiera AndroidStefano Sanna
 
Enlarge your screen: introducing the Google TV
Enlarge your screen: introducing the Google TVEnlarge your screen: introducing the Google TV
Enlarge your screen: introducing the Google TVStefano Sanna
 
NFC: tecnologia e applicazioni
NFC: tecnologia e applicazioniNFC: tecnologia e applicazioni
NFC: tecnologia e applicazioniStefano Sanna
 
HCIM08 - Mobile Applications
HCIM08 - Mobile ApplicationsHCIM08 - Mobile Applications
HCIM08 - Mobile ApplicationsStefano Sanna
 
Playing with Mobile 2.0
Playing with Mobile 2.0Playing with Mobile 2.0
Playing with Mobile 2.0Stefano Sanna
 
Comunicazione Pervasiva
Comunicazione PervasivaComunicazione Pervasiva
Comunicazione PervasivaStefano Sanna
 
Sensoristica Avanzata per Dispositivi Mobili
Sensoristica Avanzata per Dispositivi MobiliSensoristica Avanzata per Dispositivi Mobili
Sensoristica Avanzata per Dispositivi MobiliStefano Sanna
 
Introducing the Sun SPOTs
Introducing the Sun SPOTsIntroducing the Sun SPOTs
Introducing the Sun SPOTsStefano Sanna
 
Java & LEGO Mindstorms
Java & LEGO MindstormsJava & LEGO Mindstorms
Java & LEGO MindstormsStefano Sanna
 
Java Network Programming
Java Network ProgrammingJava Network Programming
Java Network ProgrammingStefano Sanna
 

Más de Stefano Sanna (20)

Mobile Security su Android - LinuxDay 2018
Mobile Security su Android - LinuxDay 2018Mobile Security su Android - LinuxDay 2018
Mobile Security su Android - LinuxDay 2018
 
Android Things, from mobile apps to physical world
Android Things, from mobile apps to physical worldAndroid Things, from mobile apps to physical world
Android Things, from mobile apps to physical world
 
Android Things Linux Day 2017
Android Things Linux Day 2017 Android Things Linux Day 2017
Android Things Linux Day 2017
 
Android Things in action
Android Things in actionAndroid Things in action
Android Things in action
 
Introduzione alla tecnologia iBeacon
Introduzione alla tecnologia iBeaconIntroduzione alla tecnologia iBeacon
Introduzione alla tecnologia iBeacon
 
Augmented Smartphone
Augmented SmartphoneAugmented Smartphone
Augmented Smartphone
 
Bluetooth Low Energy
Bluetooth Low EnergyBluetooth Low Energy
Bluetooth Low Energy
 
Google TV: la nuova frontiera Android
Google TV: la nuova frontiera AndroidGoogle TV: la nuova frontiera Android
Google TV: la nuova frontiera Android
 
Enlarge your screen: introducing the Google TV
Enlarge your screen: introducing the Google TVEnlarge your screen: introducing the Google TV
Enlarge your screen: introducing the Google TV
 
Introduzione ad NFC
Introduzione ad NFCIntroduzione ad NFC
Introduzione ad NFC
 
NFC: tecnologia e applicazioni
NFC: tecnologia e applicazioniNFC: tecnologia e applicazioni
NFC: tecnologia e applicazioni
 
HCIM08 - Mobile Applications
HCIM08 - Mobile ApplicationsHCIM08 - Mobile Applications
HCIM08 - Mobile Applications
 
Playing with Mobile 2.0
Playing with Mobile 2.0Playing with Mobile 2.0
Playing with Mobile 2.0
 
Comunicazione Pervasiva
Comunicazione PervasivaComunicazione Pervasiva
Comunicazione Pervasiva
 
Sensoristica Avanzata per Dispositivi Mobili
Sensoristica Avanzata per Dispositivi MobiliSensoristica Avanzata per Dispositivi Mobili
Sensoristica Avanzata per Dispositivi Mobili
 
Introducing the Sun SPOTs
Introducing the Sun SPOTsIntroducing the Sun SPOTs
Introducing the Sun SPOTs
 
Mobile HW Mashup
Mobile HW MashupMobile HW Mashup
Mobile HW Mashup
 
Java & LEGO Mindstorms
Java & LEGO MindstormsJava & LEGO Mindstorms
Java & LEGO Mindstorms
 
Java AWT
Java AWTJava AWT
Java AWT
 
Java Network Programming
Java Network ProgrammingJava Network Programming
Java Network Programming
 

Android Bluetooth Hacking

  • 1. Bluetooth Hacking Stefano Sanna - JUG Sardegna Emanuele Di Saverio - JUG Roma Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 2. Sommario • Chi siamo • L’importanza del Bluetooth sui device mobili • Android & Bluetooth: storia di un amore mancato • Happy hacking! • La Bluetooth API per Android 1.x • L’API ufficiale di Android 2.0 • Demo: Android per controllare Arduino Bluetooth Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 3. Chi siamo • Stefano Sanna • Senior Solution Engineer Android @ beeweeb SpA • Autore del libro “Java Micro Edition”, Hoepli (2007) • Main designer Bluetooth API for Android 1.x • Emanuele Di Saverio • Scrum Master and Senior Developer @ beeweeb SpA • SCMAD, SCJP • Committer Easy-Bluetooth framework for Android Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 4. Bluetooth su Android • early Android • Wrapper Java su Bluez • Android 0.9 • Sparisce l’API Bluetooth! • Android 1.x • Nessuna API per gli sviluppatori • Android 2.x • Introduce una API che consente il discovery di device remoti, di aprire connessioni RFCOMM client e server Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 5. L’importanza del supporto Bluetooth • Senza una API dedicata non è possibile: • Discovery di device e servizi • Trasferimento file con Bluetooth FTP e OBEX • Connessioni a GPS, gamepad, apparati medicali • Controllo remoto di moduli embedded e sensor network • Applicazioni di robotica (LEGO Mindstorms, etc...) Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 6. Tanti device la’ fuori... Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 7. Happy Hacking! Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 8. System service & Reflection • Il Bluetooth Service è accessibile come qualsiasi altro Android Service: Object bluetoothService = context.getSystemService(“bluetooth”); A questo punto, ottenuta la classe, si può utilizzare la reflection per conoscerne (e invocarne!) i metodi: Class bluetoothServiceClass = bluetoothService.class; Method[] bluetoothMethods = bluetoothServiceClass.getMethods(); Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 9. I metodi disponibili O ! public android.bluetooth.BluetoothDevice(android.bluetooth.IBluetoothDevice) P O public boolean android.bluetooth.BluetoothDevice.cancelBondProcess(java.lang.String) public void android.bluetooth.BluetoothDevice.cancelDiscovery() P S public boolean android.bluetooth.BluetoothDevice.cancelPin(java.lang.String) public boolean android.bluetooth.BluetoothDevice.createBond(java.lang.String) public boolean android.bluetooth.BluetoothDevice.disable() O ES public boolean android.bluetooth.BluetoothDevice.disconnectRemoteDeviceAcl(java.lang.String) public boolean android.bluetooth.BluetoothDevice.enable() R L public java.lang.String android.bluetooth.BluetoothDevice.getAddress() public int android.bluetooth.BluetoothDevice.getBluetoothState() T P public int android.bluetooth.BluetoothDevice.getBondState(java.lang.String) public java.lang.String android.bluetooth.BluetoothDevice.getCompany() public int android.bluetooth.BluetoothDevice.getDiscoverableTimeout() public java.lang.String android.bluetooth.BluetoothDevice.getManufacturer() public java.lang.String android.bluetooth.BluetoothDevice.getName() M public int android.bluetooth.BluetoothDevice.getRemoteClass(java.lang.String) public java.lang.String android.bluetooth.BluetoothDevice.getRemoteCompany(java.lang.String) public [B android.bluetooth.BluetoothDevice.getRemoteFeatures(java.lang.String) O public java.lang.String android.bluetooth.BluetoothDevice.getRemoteManufacturer(java.lang.String) public java.lang.String android.bluetooth.BluetoothDevice.getRemoteName(java.lang.String) C public java.lang.String android.bluetooth.BluetoothDevice.getRemoteRevision(java.lang.String) public boolean android.bluetooth.BluetoothDevice.getRemoteServiceChannel(java.lang.String,short,android.bluetoot h.IBluetoothDeviceCallback) Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 10. Permission • Primo passo: per accedere alle funzionalità Bluetooth occorre dichiarare due Permission nel Manifest: <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 11. Discovery device remoti LocalBluetoothDevice local = LocalBluetoothDevice.init(context); local.setListener(new LocalBluetoothDeviceListener() { public void scanStarted() { // e’ partita la scansione... } public void scanCompleted(ArrayList<String> devices) { // scansione completata } }); local.scan(); // avvia la scansione... Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 12. Apertura di un socket RFCOMM client RemoteBluetoothDevice dev = local.getRemoteBluetoothDevice(address); dev.setListener(new RemoteBluetoothDeviceListener() { public void paired() { // si aprono socket e stream I/O... 3 BluetoothSocket socket = dev.openSocket(1); InputStream input = socket.getInputStream(); OutputStream output = socket.getOutputStream(); } public void pinRequested() { // mostra la dialog per l’inserimento del PIN 2 } }); dev.pair(); 1 Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 13. Device compatibili • HTC Dream • HTC Magic • HTC Tattoo • Samsung Galaxy i7500 • Samsung Galaxy i5700 • Huawei U8220 • Sony-Ericsson XPERIA X10 Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 14. Bluetooth API for Android 1.x • Unica libreria opensource (Apache 2.0) che per l’accesso allo stack Bluetooth su Android 1.x • Funzionalità: • accensione/spegnimento Bluetooth • discovery di dispositivi remoti e della porta RFCOMM port di un servizio • apertura connessioni RFCOMM client • Funziona senza la necessità di accesso root • Check it out! • http://code.google.com/p/android-bluetooth Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 15. Bluetooth API for Android 1.x • Oltre 1000 download! • Utilizzata in progetti commerciali e free: • Ha ispirato la realizzazione di Bluetooth File Transfer di Medieval Software, l’applicazione di trasferimento file di maggior successo nell’Android Market • È utilizzata in Amarino (sviluppato al MIT), primo framework di controllo di Arduino attraverso Android • È utilizzata in GoPayment di Intuit Inc., per il pagamento con carta di credito attraverso swiper e stampante BT Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 16. Principali limitazioni • Non è possibile registrare un servizio sul database SDP (Service Discovery Protocol), benché sia possibile creare socket server RFCOMM • Se si utilizza la funzionalità di device inquiry subito dopo l’avvio del telefono, la chiamata nativa interferisce con un processo di scansione del sistema e lo stack Bluetooth diventa inutilizzabile • Problemi di compatibilità con HTC Hero Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 17. Permission su socket dbus Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 18. L’API di Android 2.x • Android 2.0 : Bluetooth ufficialmente nell'SDK! • Yay! • Niente controllo diretto sul pairing • Niente accesso diretto ai canali RFCOMM • Niente discovery dei servizi ...not so : • Android style: basato su Intents and Receivers • paradigma Publish/Subscribe, un po’ macchinoso! Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 19. Discovery in Android 2.x BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); IntentFilter filter = new IntentFilter(); filter.addAction(BluetoothDevice.ACTION_FOUND); filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED); //also can register for DISCOVERY_STARTED Action context.registerReceiver(receiver, filter); adapter.startDiscovery(); Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 20. BroadcastReceiver private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context ctx, Intent intent) { final String action = intent.getAction(); if (action.equals(BluetoothDevice.ACTION_FOUND)) { BluetoothDevice device = (BluetoothDevice) intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //process device } else if (action.equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) { //done :o) } } }; Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 21. Socket e stream I/O //given a valid “BluetoothDevice”... UUID uuidOfTargetService = UUID.nameUUIDFromBytes(“2d26618601fb47c28d9f10b8ec891363”); BluetoothSocket socket = rbd.createRfcommSocketToServiceRecord(uuidOfTargetService); socket.connect(); InputStream input = socket.getInputStream(); OutputStream output = socket.getOutputStream(); .... socket.close(); Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 22. Buone pratiche su Android • È importante tenere a mente le buone usanze di programmazione Android (e Java!): • operazioni di I/O sempre su un Thread separato • aggiornare la UI via Handler • deregistrare i Receivers prima di terminare un Context Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 23. Serve ancora una libreria custom? • Malgrado l’API di Android 2.0, una libreria Bluetooth avrebbe ancora la sua utilità! • Accesso alle feature nascoste (via reflection) • Esposizione di una API più semplice • Astrazione 1.x vs 2.0 Retrocompatibilità! • ....in lavorazione Easy Bluetooth • Check it out: http://android-bluetooth.googlecode.com/svn/ Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 24. Android controlla Arduino • Vogliamo utilizzare Android per controllare via Bluetooth un LED e leggere una temperatura Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 25. Arduino • “Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. [...] It can sense the environment by receiving input from a variety of sensors and can affect its surroundings by controlling lights, motors, and other actuators. • Rigorosamente MADE IN ITALY! • http://www.arduino.cc Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 26. Sorgente Arduino int LED_PIN = 13; int LM35_PIN = 2; void setup() { Hardware utilizzato: Serial.begin(115200); } pinMode(LED_PIN, OUTPUT); • Arduino Bluetooth • Prototype shield e breadboard void loop() { • LM35 Temperature Sensor if (Serial.available() > 0) { int inByte = Serial.read(); switch (inByte) { case '1': digitalWrite(LED_PIN, HIGH); Serial.write('1'); break; case '0': void readTemp() { digitalWrite(LED_PIN, LOW); int temp = analogRead(LM35_PIN); Serial.write('0'); temp= ( 5.0 * temp * 100.0) / 1024.0; break; Serial.write(temp); case 'r': } readTemp(); break; } } Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 27. Sorgente Android // definiamo i comandi... byte LED_ON_REQUEST = ‘1’; byte LED_OFF_REQUEST = ‘0’; byte READ_TEMPERATURE = ‘r’; [...] // all’interno del Thread inviamo comandi e leggiamo le risposte... output.write(request); final int response = input.read(); if (request == 'r') { handler.post(new Runnable() { public void run() { String temp = Integer.toString(response); Toast.makeText(Controller.this, "LM35 Sensor: " + temp + "°C", 4000).show(); }); } Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 28. DEMO! Starring: Motorola Milestone (Android 2.0), HTC Magic (Android 1.6) and Arduino Bluetooth Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 29. Risorse • Android • http://developer.android.com • http://source.android.com • Bluetooth API for Android 1.x e Easy Bluetooth • http://code.google.com/p/android-bluetooth • Arduino • http://www.arduino.cc Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 30. Riferimenti • Stefano Sanna • gerdavax AT gmail DOT com • http://www.gerdavax.it • Emanuele Di Saverio • emanuele DOT disaverio AT gmail DOT com Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 31. GRAZIE! Stefano & Emanuele & i rispettivi JUG! Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010