R_Zee
R_Zee

Reputation: 161

How to connect to Raspberry pi with an android app over bluetooth

I'm having trouble connecting my smartphone to my raspberry pi over bluetooth using an app.

My situation:

I'm developing a bluetooth controllable application based on a raspberry pi. I'm able to connect to the raspberry pi over bluetooth and send and receive data over an RFCOMM socket using the app "bluetooth terminal". The raspberry pi is constantly listening for RFCOMM connection.

My goal:

I want to develop an app in which the user can connect with the raspberry pi over bluetooth. The app should open the RFCOMM socket so it can communicate with the pi.

My problem:

My app is not able to connect to the raspberry pi and since i don't know the UUID of the raspberry pi, i think that might be the problem.

My code:

I'm quite new to java programming so correct me if you see anything strange. This is the method which i'm trying to connect with.

        public void BTConnect() {

    final UUID MY_UUID = UUID.fromString("0000110E-0000-1000-8000-00805F9B34FB");
    BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    BluetoothSocket socket = null;
    String RPi_MAC = "XX:XX:XX:XX:XX:XX";

    Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
    // If there are paired devices
    if (pairedDevices.size() > 0) {

        // Loop through paired devices
        for (BluetoothDevice device : pairedDevices) {
            if (device.getAddress().equals(RPi_MAC)) {
                try {
                    socket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
                } catch (IOException e0) {
                    Log.d("BT_TEST", "Cannot create socket");
                    e0.printStackTrace();
                }

                try {
                    socket.connect();
                } catch (IOException e1) {
                    try {
                        socket.close();
                        Log.d("BT_TEST", "Cannot connect");
                        e1.printStackTrace();
                    } catch (IOException e2) {
                        Log.d("BT_TEST", "Socket not closed");
                        e2.printStackTrace();
                    }
                }
            }
        }
    }
}

When I click the button to connect, this is the output of android studio:

   W/BluetoothAdapter: getBluetoothService() called with no BluetoothManagerCallback
   D/BT_TEST: Cannot connect
   W/System.err: java.io.IOException: read failed, socket might closed or timeout, read ret: -1
   W/System.err:     at android.bluetooth.BluetoothSocket.readAll(BluetoothSocket.java:599)
   W/System.err:     at android.bluetooth.BluetoothSocket.readInt(BluetoothSocket.java:610)
   W/System.err:     at android.bluetooth.BluetoothSocket.connect(BluetoothSocket.java:333)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity.BTConnect(MainActivity.java:80)
   W/System.err:     at com.example.gebruiker.soundslikepi.MainActivity$1.onClick(MainActivity.java:39)
   W/System.err:     at android.view.View.performClick(View.java:4856)
   W/System.err:     at android.view.View$PerformClick.run(View.java:19956)
   W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
   W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
   W/System.err:     at android.os.Looper.loop(Looper.java:211)
   W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5373)
   W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
   W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
   W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020)
   W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815)

Summarized:

So, to be able to connect with the raspberry pi from an android app, do I:

I would really like to know how to fix this problem, so any help would be appreciated.

Upvotes: 14

Views: 42849

Answers (4)

Asif Ali Khan
Asif Ali Khan

Reputation: 49

I had faced a similar problem while connecting to a raspberrypi3 bluetooth via my android app. First execute the following commands one by one on your pi command prompt:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install bluetooth blueman bluez
sudo reboot
sudo apt-get install python-bluetooth

After the execution of the above commands pair your app's bluetooth with pi's bluetooth. Now you need to add the SP profile to the Pi. Edit this file:

Execute the following command on the pi command prompt:

sudo nano /etc/systemd/system/dbus-org.bluez.service

A file will open and add the compatibility flag, ' -C', at the end of the 'ExecStart=' line. Add a new line after that to add the SP profile. The two lines should look like this:

ExecStart=/usr/lib/bluetooth/bluetoothd -C

ExecStartPost=/usr/bin/sdptool add SP

Save and reboot your pi and this should work.

Upvotes: 2

Hans Cappelle
Hans Cappelle

Reputation: 17495

Quick answer

Similar to how you started out on this a bluetooth connection requires both device address and service UUID.

The device address (ex: 00:72:02:97:33:2C) can be obtained from paired devices (or by allowing for discovery), see Android example app for more on that.

The UUID (ex: 00001101-0000-1000-8000-00805F9B34FB) is typically defined on the server part where a Bluetooth service is running with a specific identifier.

Now if you want to avoid that last part and just want to communicate simple data you can rely on a default using the bluetooth serial port. From Android Bluetooth documentation:

Hint: If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. However if you are connecting to an Android peer then please generate your own unique UUID.

More information

Android Documentation & Sample code

The android sample BluetoothChat is a nice example on how to deal with 2 way communication between 2 android devices.

Android Bluetooth Documentation https://developer.android.com/guide/topics/connectivity/bluetooth.html

The Bluetooth Chat sample https://developer.android.com/samples/index.html. Note that you can check this project out by just selecting File > New > Sample Project and searching for Bluetooth Chat in Android Studio.

Bluetooth connection from Android to Raspberry Pi (Python & Android code)

Dealing with starting such a service on a raspberry pi can be found using this Python example: http://blog.davidvassallo.me/2014/05/11/android-linux-raspberry-pi-bluetooth-communication/. Just one of the many samples available online. This example includes Android code.

Using Default UUID for Serial Port (C++ code)

If you want to implement such a thing on the raspberry Pi using C++ code I can recommended the documentation from http://people.csail.mit.edu/albert/bluez-intro/x502.html.

That link has example code for both server and client. Since this is using RFCOMM spec and default serial port UUID there is no need to specify any UUID.

BlueTerm Android Open source App (Android code)

If you look into how to connect to this from android you will likely end up finding the BlueTerm android app. This is an open source app so you can find all sources at https://github.com/johnhowe/BlueTerm/tree/master/src/es/pymasde/blueterm. There you can find the UUID for this serial port service:

private static final UUID SerialPortServiceClass_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

The complete BluetoothSerialService class is a good way of managing a bluetooth connection including handling messages back to UI.

Upvotes: 12

Charein
Charein

Reputation: 11

I think linux use bluetooth need specify the connect port.

      try {
            Method m = remoteDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
            try {
                BluetoothSocket tmp = (BluetoothSocket)m.invoke(remoteDevice, 1);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

Upvotes: 1

Josue Martinez
Josue Martinez

Reputation: 436

you don't need to know the uuid, you have to set the uuid you want to use on both client and server

Upvotes: 0

Related Questions