SlideShare a Scribd company logo
Bluetooth Hacking
     Stefano Sanna - JUG Sardegna
    Emanuele Di Saverio - JUG Roma




                      Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma
                                              Javaday IV – Roma – 01/30/2010
Outline

• Who we are
• The relevance of Bluetooth on mobile devices
• Android & Bluetooth: an unconsummated marriage
• Happy hacking!
• Bluetooth API for Android 1.x
• Official API for Android 2.x
• Demo: Android controls Arduino Bluetooth
                             Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                              Javaday IV – Roma – 30 gennaio 2010
Who we are

• Stefano Sanna
 • Senior Solution Engineer Android @ beeweeb SpA
 • Author of the book “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 spin-off for Android

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

• early Android
  • Wrapper Java su Bluez
• Android 0.9
  • API Bluetooth disappears!

• Android 1.x
  • No API for developers
• Android 2.x
  • Exposes an API allowing discovery of remote devices,
   opening and accepting RFCOMM connections
                                  Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                   Javaday IV – Roma – 30 gennaio 2010
The relevance of Bluetooth

• Without a dedicated API is not possible to:
  • Discovery devices and services
  • Transfer files with Bluetooth FTP and OBEX

  • GPS connections, gamepads, medical devices

  • Remote control of embedded modules and sensor networks

  • Robotic application (i.e. LEGO Mindstorms)
                                  Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                   Javaday IV – Roma – 30 gennaio 2010
A lot of devices out there...




  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 – 01/30/2010
System service & Reflection

• Bluetooth Service is accessible like every other
   Android Service:

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


   Having the right Class, we can leverage la reflection
   to know (and invoke!) the methods:

Class bluetoothServiceClass = bluetoothService.class;

Method[] bluetoothMethods = bluetoothServiceClass.getMethods();

                                      Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                       Javaday IV – Roma – 30 gennaio 2010
Available Methods
public android.bluetooth.BluetoothDevice(android.bluetooth.IBluetoothDevice)
public boolean android.bluetooth.BluetoothDevice.cancelBondProcess(java.lang.String)
public void android.bluetooth.BluetoothDevice.cancelDiscovery()
public boolean android.bluetooth.BluetoothDevice.cancelPin(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.createBond(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.disable()
public boolean android.bluetooth.BluetoothDevice.disconnectRemoteDeviceAcl(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.enable()
public java.lang.String android.bluetooth.BluetoothDevice.getAddress()
public int android.bluetooth.BluetoothDevice.getBluetoothState()
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()
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)
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteManufacturer(java.lang.String)
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteName(java.lang.String)
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
Available Methods
public android.bluetooth.BluetoothDevice(android.bluetooth.IBluetoothDevice)
public boolean android.bluetooth.BluetoothDevice.cancelBondProcess(java.lang.String)
public void android.bluetooth.BluetoothDevice.cancelDiscovery()




                          O X!
public boolean android.bluetooth.BluetoothDevice.cancelPin(java.lang.String)
public boolean android.bluetooth.BluetoothDevice.createBond(java.lang.String)




                        O E
public boolean android.bluetooth.BluetoothDevice.disable()
public boolean android.bluetooth.BluetoothDevice.disconnectRemoteDeviceAcl(java.lang.String)




                       T L
public boolean android.bluetooth.BluetoothDevice.enable()
public java.lang.String android.bluetooth.BluetoothDevice.getAddress()
public int android.bluetooth.BluetoothDevice.getBluetoothState()
public int android.bluetooth.BluetoothDevice.getBondState(java.lang.String)




                          P
public java.lang.String android.bluetooth.BluetoothDevice.getCompany()
public int android.bluetooth.BluetoothDevice.getDiscoverableTimeout()




                        M
public java.lang.String android.bluetooth.BluetoothDevice.getManufacturer()
public java.lang.String android.bluetooth.BluetoothDevice.getName()




                      O
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)




                     C
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteManufacturer(java.lang.String)
public java.lang.String android.bluetooth.BluetoothDevice.getRemoteName(java.lang.String)
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

• First Step: to access Bluetooth functionalities we
   need to declare two Permissions in the 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
Remote device discovery

LocalBluetoothDevice local = LocalBluetoothDevice.init(context);

local.setListener(new LocalBluetoothDeviceListener() {

      public void scanStarted() {
         // scan has started...
      }

      public void scanCompleted(ArrayList<String> devices) {
         // scan is over
      }
});

local.scan();     // start scan...




                                        Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma
                                                          Javaday IV – Roma – 30 gennaio 2010
Open an RFCOMM socket from client

RemoteBluetoothDevice dev = local.getRemoteBluetoothDevice(address);

dev.setListener(new RemoteBluetoothDeviceListener() {

   public void paired() {
     // we open sockets and I/O streams...         3
     BluetoothSocket socket = dev.openSocket(1);
     InputStream input = socket.getInputStream();
     OutputStream output = socket.getOutputStream();
   }

   public void pinRequested() {
      // show dialog for PIN input                                   2
   }
});

dev.pair();   1
                                      Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma
                                                        Javaday IV – Roma – 30 gennaio 2010
Compatible devices

• 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

• The only opensource library (Apache 2.0) for
    accessing Bluetooth stack on Android 1.x
•   Features:
    • turn on/off Bluetooth
    • discovery of remote devices and RFCOMM bound to a
        service
    •   opening of RFCOMM connections from client
• Works without the necessity of root access
• 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

• More than 1000 downloads!
• Used in commercial and free projects:
  • Inspired Bluetooth File Transfer by Medieval Software, the
      most succesful file transfer application on the Android
      Market
  •   Used in Amarino (developed by MIT), first framework for
      controlling Arduino via an Android device
  •   Used in GoPayment by Intuit Inc., for credit card payment
      via swiper and Bluetooth printer
  •   Used in DUBwise project, for flying helicpoters :)
                                    Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                     Javaday IV – Roma – 30 gennaio 2010
Main limitations

• It’s not possible to register an SDP (Service
  Discovery Protocol) service on the database, even
  though is possible to create RFCOMM server socket

• If a device inquiry is issue just after phone startup,
  the native call interferes with a system scan process
  and Bluetooth stack become unusable

• Compatibility problems with HTC Hero

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




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

• Android 2.0 : Bluetooth officially in the SDK!
• Yay! But...
  • No direct control over pairing
  • No direct access to RFCOMM channels
  • No service discovery
    ...not so :
• Android style: based on Intents and Receivers
  • Publish/Subscribe paradigm, a little clunky!
                                    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
Android good practices

• It’s important to keep in mind good practices of
 Android (and Java) programming!:

  • I/O operations always in a separate Thread

  • update UI via Handler

  • unregister Receivers before destroying Context


                                  Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma
                                                   Javaday IV – Roma – 30 gennaio 2010
Is a separate library still useful?

• In spite of Android 2.0 API, a Bluetooth library would
 be greatly useful!

  • Access to hidden features (via reflection)
  • Expose a simpler API
  • 1.x vs 2.x abstraction   Retrocompatibility!

• ....working out 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 controls Arduino

• We want to use Android to control
 via Bluetooth a LED and read
 a temperature




                              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.
•   Strictly MADE IN ITALY!

• http://www.arduino.cc

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

void setup() {                                   Hardware:
  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
Android Source


// define commands...
byte LED_ON_REQUEST = ‘1’;
byte LED_OFF_REQUEST = ‘0’;
byte READ_TEMPERATURE = ‘r’;

[...]

// in the Thread we send comandi and read responses...
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 – 01/30/2010
Resources

• 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
References

• 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
THANK YOU!

Stefano & Emanuele & i rispettivi JUG!




                       Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma
                                               Javaday IV – Roma – 01/30/2010

More Related Content

PDF
망고100 보드로 놀아보자 19
PPT
JSR 82 (bluetooth obex)
PDF
Air superiority for Android Apps
PPT
Computer networkppt4577
PDF
ikh331-06-distributed-programming
PPT
Socket Programming
PPTX
#5 (Remote Method Invocation)
PPTX
Slide cipher based encryption
망고100 보드로 놀아보자 19
JSR 82 (bluetooth obex)
Air superiority for Android Apps
Computer networkppt4577
ikh331-06-distributed-programming
Socket Programming
#5 (Remote Method Invocation)
Slide cipher based encryption

What's hot (19)

PPT
Ppt of socket
DOCX
Laporan multi client
PPT
Sockets intro
PDF
Concurrecy techdrop
PDF
Mattbrenner
PPT
Socket System Calls
PPTX
Java осень 2012 лекция 2
PDF
A Layered Architecture for the Model-driven Development of Distributed Simula...
PDF
Advanced Sockets Programming
PPTX
分散式系統
PPT
PDF
Network Sockets
PDF
Lecture10
PDF
There's more than web
PPT
Socket Programming
PDF
Creating an Arduino Web Server from scratch hardware and software
PDF
PDF
Socket Programming
KEY
Non blocking io with netty
Ppt of socket
Laporan multi client
Sockets intro
Concurrecy techdrop
Mattbrenner
Socket System Calls
Java осень 2012 лекция 2
A Layered Architecture for the Model-driven Development of Distributed Simula...
Advanced Sockets Programming
分散式系統
Network Sockets
Lecture10
There's more than web
Socket Programming
Creating an Arduino Web Server from scratch hardware and software
Socket Programming
Non blocking io with netty

Viewers also liked (10)

PDF
Android & Bluetooth: hacking e applicazioni
PPT
Bca 2nd sem-u-3-basic computer programming and micro programmed control
PPTX
Lecture 22
PDF
theday, windows hacking with commandline
PPT
Bluetooth Hacking
PPTX
Central processing unit
PPTX
Multiprocessor
PPTX
Micro Programmed Control Unit
PPTX
Input Output Organization
PPSX
08. Central Processing Unit (CPU)
Android & Bluetooth: hacking e applicazioni
Bca 2nd sem-u-3-basic computer programming and micro programmed control
Lecture 22
theday, windows hacking with commandline
Bluetooth Hacking
Central processing unit
Multiprocessor
Micro Programmed Control Unit
Input Output Organization
08. Central Processing Unit (CPU)

Similar to Android Bluetooth Hacking Java Day2010 Eng (20)

PPT
Rococo Software Overview Q3 2010
PPT
Rococo Software Q3 2010
PPT
JSR-82 Bluetooth tutorial
PDF
ARTIFICIAL INTELLIGENCE DESKTOP VOICE ASSISTANT IN PYTHON
PDF
The Physical World meets the Web
PPTX
Android Framework
PDF
IRJET- IOT Dune Buggy –Control it from Anywhere
PDF
IRJET- IOT Dune Buggy –Control it from Anywhere
PDF
MikroTik Hotspot 2.0 (IEEE 802.11u) - MUM Jakarta 2016
PPTX
Introduction to Home Automation
PDF
Enterprise Developer Journey to the IoT
PDF
Global Azure Bootcamp 2017 - Azure IoT Hub with LoRa Connectivity
PDF
Exploring the physical web
PDF
Gnome, linux mobile stacks, and you
PPTX
Ice cream-sandwich
PDF
Estimote beacons and simple Android application (full)
PDF
Google Developer DAy 2010 Japan: HTML5 についての最新情報 (マイク スミス)
DOC
Controlpcviabluetoothenablemobile 091028150632-phpapp01
DOC
Controlpcviabluetoothenablemobile 091028150632-phpapp01
DOC
Control Pc Via Bluetooth Enable Mobile
Rococo Software Overview Q3 2010
Rococo Software Q3 2010
JSR-82 Bluetooth tutorial
ARTIFICIAL INTELLIGENCE DESKTOP VOICE ASSISTANT IN PYTHON
The Physical World meets the Web
Android Framework
IRJET- IOT Dune Buggy –Control it from Anywhere
IRJET- IOT Dune Buggy –Control it from Anywhere
MikroTik Hotspot 2.0 (IEEE 802.11u) - MUM Jakarta 2016
Introduction to Home Automation
Enterprise Developer Journey to the IoT
Global Azure Bootcamp 2017 - Azure IoT Hub with LoRa Connectivity
Exploring the physical web
Gnome, linux mobile stacks, and you
Ice cream-sandwich
Estimote beacons and simple Android application (full)
Google Developer DAy 2010 Japan: HTML5 についての最新情報 (マイク スミス)
Controlpcviabluetoothenablemobile 091028150632-phpapp01
Controlpcviabluetoothenablemobile 091028150632-phpapp01
Control Pc Via Bluetooth Enable Mobile

More from Emanuele Di Saverio (6)

PPTX
In a Material world
PDF
Programming Sideways: Asynchronous Techniques for Android
PDF
The Android Experience
PDF
Android 1.5 to 3.0: a compatibility journey
PDF
Dive Into Android [ITA] - Long
KEY
Whymca Dive into Android [ITA]
In a Material world
Programming Sideways: Asynchronous Techniques for Android
The Android Experience
Android 1.5 to 3.0: a compatibility journey
Dive Into Android [ITA] - Long
Whymca Dive into Android [ITA]

Recently uploaded (20)

PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PPTX
Cloud computing and distributed systems.
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Spectroscopy.pptx food analysis technology
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Electronic commerce courselecture one. Pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Empathic Computing: Creating Shared Understanding
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Machine learning based COVID-19 study performance prediction
PDF
cuic standard and advanced reporting.pdf
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Big Data Technologies - Introduction.pptx
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Cloud computing and distributed systems.
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Spectroscopy.pptx food analysis technology
Advanced methodologies resolving dimensionality complications for autism neur...
sap open course for s4hana steps from ECC to s4
Reach Out and Touch Someone: Haptics and Empathic Computing
Electronic commerce courselecture one. Pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Digital-Transformation-Roadmap-for-Companies.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
The Rise and Fall of 3GPP – Time for a Sabbatical?
Empathic Computing: Creating Shared Understanding
NewMind AI Weekly Chronicles - August'25 Week I
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Machine learning based COVID-19 study performance prediction
cuic standard and advanced reporting.pdf
Mobile App Security Testing_ A Comprehensive Guide.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Big Data Technologies - Introduction.pptx

Android Bluetooth Hacking Java Day2010 Eng

  • 1. Bluetooth Hacking Stefano Sanna - JUG Sardegna Emanuele Di Saverio - JUG Roma Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 01/30/2010
  • 2. Outline • Who we are • The relevance of Bluetooth on mobile devices • Android & Bluetooth: an unconsummated marriage • Happy hacking! • Bluetooth API for Android 1.x • Official API for Android 2.x • Demo: Android controls Arduino Bluetooth Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 3. Who we are • Stefano Sanna • Senior Solution Engineer Android @ beeweeb SpA • Author of the book “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 spin-off for Android Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 4. Bluetooth on Android • early Android • Wrapper Java su Bluez • Android 0.9 • API Bluetooth disappears! • Android 1.x • No API for developers • Android 2.x • Exposes an API allowing discovery of remote devices, opening and accepting RFCOMM connections Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 5. The relevance of Bluetooth • Without a dedicated API is not possible to: • Discovery devices and services • Transfer files with Bluetooth FTP and OBEX • GPS connections, gamepads, medical devices • Remote control of embedded modules and sensor networks • Robotic application (i.e. LEGO Mindstorms) Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 6. A lot of devices out there... 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 – 01/30/2010
  • 8. System service & Reflection • Bluetooth Service is accessible like every other Android Service: Object bluetoothService = context.getSystemService(“bluetooth”); Having the right Class, we can leverage la reflection to know (and invoke!) the methods: Class bluetoothServiceClass = bluetoothService.class; Method[] bluetoothMethods = bluetoothServiceClass.getMethods(); Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 9. Available Methods public android.bluetooth.BluetoothDevice(android.bluetooth.IBluetoothDevice) public boolean android.bluetooth.BluetoothDevice.cancelBondProcess(java.lang.String) public void android.bluetooth.BluetoothDevice.cancelDiscovery() public boolean android.bluetooth.BluetoothDevice.cancelPin(java.lang.String) public boolean android.bluetooth.BluetoothDevice.createBond(java.lang.String) public boolean android.bluetooth.BluetoothDevice.disable() public boolean android.bluetooth.BluetoothDevice.disconnectRemoteDeviceAcl(java.lang.String) public boolean android.bluetooth.BluetoothDevice.enable() public java.lang.String android.bluetooth.BluetoothDevice.getAddress() public int android.bluetooth.BluetoothDevice.getBluetoothState() 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() 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) public java.lang.String android.bluetooth.BluetoothDevice.getRemoteManufacturer(java.lang.String) public java.lang.String android.bluetooth.BluetoothDevice.getRemoteName(java.lang.String) 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. Available Methods public android.bluetooth.BluetoothDevice(android.bluetooth.IBluetoothDevice) public boolean android.bluetooth.BluetoothDevice.cancelBondProcess(java.lang.String) public void android.bluetooth.BluetoothDevice.cancelDiscovery() O X! public boolean android.bluetooth.BluetoothDevice.cancelPin(java.lang.String) public boolean android.bluetooth.BluetoothDevice.createBond(java.lang.String) O E public boolean android.bluetooth.BluetoothDevice.disable() public boolean android.bluetooth.BluetoothDevice.disconnectRemoteDeviceAcl(java.lang.String) T L public boolean android.bluetooth.BluetoothDevice.enable() public java.lang.String android.bluetooth.BluetoothDevice.getAddress() public int android.bluetooth.BluetoothDevice.getBluetoothState() public int android.bluetooth.BluetoothDevice.getBondState(java.lang.String) P public java.lang.String android.bluetooth.BluetoothDevice.getCompany() public int android.bluetooth.BluetoothDevice.getDiscoverableTimeout() M public java.lang.String android.bluetooth.BluetoothDevice.getManufacturer() public java.lang.String android.bluetooth.BluetoothDevice.getName() O 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) C public java.lang.String android.bluetooth.BluetoothDevice.getRemoteManufacturer(java.lang.String) public java.lang.String android.bluetooth.BluetoothDevice.getRemoteName(java.lang.String) 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
  • 11. Permission • First Step: to access Bluetooth functionalities we need to declare two Permissions in the 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
  • 12. Remote device discovery LocalBluetoothDevice local = LocalBluetoothDevice.init(context); local.setListener(new LocalBluetoothDeviceListener() { public void scanStarted() { // scan has started... } public void scanCompleted(ArrayList<String> devices) { // scan is over } }); local.scan(); // start scan... Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 13. Open an RFCOMM socket from client RemoteBluetoothDevice dev = local.getRemoteBluetoothDevice(address); dev.setListener(new RemoteBluetoothDeviceListener() { public void paired() { // we open sockets and I/O streams... 3 BluetoothSocket socket = dev.openSocket(1); InputStream input = socket.getInputStream(); OutputStream output = socket.getOutputStream(); } public void pinRequested() { // show dialog for PIN input 2 } }); dev.pair(); 1 Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 14. Compatible devices • 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
  • 15. Bluetooth API for Android 1.x • The only opensource library (Apache 2.0) for accessing Bluetooth stack on Android 1.x • Features: • turn on/off Bluetooth • discovery of remote devices and RFCOMM bound to a service • opening of RFCOMM connections from client • Works without the necessity of root access • 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
  • 16. Bluetooth API for Android 1.x • More than 1000 downloads! • Used in commercial and free projects: • Inspired Bluetooth File Transfer by Medieval Software, the most succesful file transfer application on the Android Market • Used in Amarino (developed by MIT), first framework for controlling Arduino via an Android device • Used in GoPayment by Intuit Inc., for credit card payment via swiper and Bluetooth printer • Used in DUBwise project, for flying helicpoters :) Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 17. Main limitations • It’s not possible to register an SDP (Service Discovery Protocol) service on the database, even though is possible to create RFCOMM server socket • If a device inquiry is issue just after phone startup, the native call interferes with a system scan process and Bluetooth stack become unusable • Compatibility problems with HTC Hero Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 18. Permission on socket dbus Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 19. Android 2.x API • Android 2.0 : Bluetooth officially in the SDK! • Yay! But... • No direct control over pairing • No direct access to RFCOMM channels • No service discovery ...not so : • Android style: based on Intents and Receivers • Publish/Subscribe paradigm, a little clunky! Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. Android good practices • It’s important to keep in mind good practices of Android (and Java) programming!: • I/O operations always in a separate Thread • update UI via Handler • unregister Receivers before destroying Context Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 24. Is a separate library still useful? • In spite of Android 2.0 API, a Bluetooth library would be greatly useful! • Access to hidden features (via reflection) • Expose a simpler API • 1.x vs 2.x abstraction Retrocompatibility! • ....working out 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
  • 25. Android controls Arduino • We want to use Android to control via Bluetooth a LED and read a temperature Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 26. 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. • Strictly MADE IN ITALY! • http://www.arduino.cc Stefano Sanna & Emanuele di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 30 gennaio 2010
  • 27. Arduino Source int LED_PIN = 13; int LM35_PIN = 2; void setup() { Hardware: 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
  • 28. Android Source // define commands... byte LED_ON_REQUEST = ‘1’; byte LED_OFF_REQUEST = ‘0’; byte READ_TEMPERATURE = ‘r’; [...] // in the Thread we send comandi and read responses... 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
  • 29. 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 – 01/30/2010
  • 30. Resources • 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
  • 31. References • 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
  • 32. THANK YOU! Stefano & Emanuele & i rispettivi JUG! Stefano Sanna & Emanuele Di Saverio – JUG Sardegna / JUG Roma Javaday IV – Roma – 01/30/2010