How to prevent Android bluetooth RFCOMM connection from dying immediately after .connect()?

63,634

Solution 1

Try to change your code for creating RfcommSocket:

sock = zee.createRfcommSocketToServiceRecord(
                      UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812"));

for this code:

Method m = zee.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
sock = (BluetoothSocket) m.invoke(device, 1);

Also try to change argument value in range 1-3 in this m.invoke(device, 1); When connection will be Connected, but aborted when you try reading, call in some loop your method test() again. As simple:

for(int i=0;i<3;i++){  if(!testDone) test(); }

Solution 2

I merged code I had written and code from [android-beginners] Re: Serial over Bluetooth by XCaffeinated]1 and the above post.

To create the simplest bluetooth program possible.

The main addition for this code is add better handling on the exceptions thrown by connect().

Search for '@todo' to customize for your needs.

I hope this saves you some time!

package com.xxx; // @todo Change to your package.   

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;

/**
 * This is the simplest bluetooth program. It sends one message to one bluetooth
 * device. The message and the bluetooth hardware id for the device are hard
 * coded. <br>
 * <br>
 * It does <b>not</b> receive any data. It does not do any thread processing. <br>
 * <br>
 * 
 * This application will be useful to communicate with a bluetooth hardware
 * device such as a bar code reader, Lego Mindstorm, a PC with a com port
 * application, a PC with a terminal program with 'listening' to a com port, a
 * second android device with a terminal program such as <a href=
 * "http://www.tec-it.com/en/software/data-acquisition/getblue/android-smartphone/Default.aspx"
 * >GetBlue</a>. It is not a full android bluetooth application but more a proof
 * of concept that the bluetooth works.
 * 
 * <br>
 * <br>
 * 
 * This code should cut and paste into the <a
 * href="http://developer.android.com/resources/tutorials/hello-world.html>
 * 'HelloAndroid' example</a>. It does not use any screen io.
 * 
 * Add to your Android Manifest.xml file: <uses-permission
 * android:name="android.permission.BLUETOOTH" /> <uses-permission
 * android:name="android.permission.BLUETOOTH_ADMIN" />
 * 
 * For a proper bluetooth example with threading and receiving data see: <a
 * href=
 * "http://developer.android.com/resources/samples/BluetoothChat/index.html"
 * >http://developer.android.com/resources/samples/BluetoothChat/index.html</a>
 * 
 * @see <a
 *      href="http://developer.android.com/guide/topics/wireless/bluetooth.html">
 *      http://developer.android.com/guide/topics/wireless/bluetooth.html</a>
 * 
 */
public class BlueToothTesterActivity extends Activity {

    /** The BluetoothAdapter is the gateway to all bluetooth functions **/
    protected BluetoothAdapter bluetoothAdapter = null;

    /** We will write our message to the socket **/
    protected BluetoothSocket socket = null;

    /** The Bluetooth is an external device, which will receive our message **/
    BluetoothDevice blueToothDevice = null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Grab the BlueToothAdapter. The first line of most bluetooth programs.
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        // if the BluetoothAdapter.getDefaultAdapter(); returns null then the
        // device does not have bluetooth hardware. Currently the emulator
        // does not support bluetooth so this will this condition will be true.
        // i.e. This code only runs on a hardware device an not on the emulator.
        if (bluetoothAdapter == null) {
            Log.e(this.toString(), "Bluetooth Not Available.");
            return;
        }

        // This will find the remote device given the bluetooth hardware
        // address.
        // @todo: Change the address to the your device address
        blueToothDevice = bluetoothAdapter.getRemoteDevice("00:00:00:00:00:00");

        for (Integer port = 1; port <= 3; port++) {
            simpleComm(Integer.valueOf(port));
        }
    }

    protected void simpleComm(Integer port) {
        // byte [] inputBytes = null;

        // The documents tell us to cancel the discovery process.
        bluetoothAdapter.cancelDiscovery();

        Log.d(this.toString(), "Port = " + port);
        try {
            // This is a hack to access "createRfcommSocket which is does not
            // have public access in the current api.
            // Note: BlueToothDevice.createRfcommSocketToServiceRecord (UUID
            // uuid) does not work in this type of application. .
            Method m = blueToothDevice.getClass().getMethod(
                    "createRfcommSocket", new Class[] { int.class });
            socket = (BluetoothSocket) m.invoke(blueToothDevice, port);

            // debug check to ensure socket was set.
            assert (socket != null) : "Socket is Null";

            // attempt to connect to device
            socket.connect();
            try {
                Log.d(this.toString(),
                        "************ CONNECTION SUCCEES! *************");

                // Grab the outputStream. This stream will send bytes to the
                // external/second device. i.e it will sent it out.
                // Note: this is a Java.io.OutputStream which is used in several
                // types of Java programs such as file io, so you may be
                // familiar with it.
                OutputStream outputStream = socket.getOutputStream();

                // Create the String to send to the second device.
                // Most devices require a '\r' or '\n' or both at the end of the
                // string.
                // @todo set your message
                String message = "Data from Android and tester program!\r";

                // Convert the message to bytes and blast it through the
                // bluetooth
                // to the second device. You may want to use:
                // public byte[] getBytes (Charset charset) for proper String to
                // byte conversion.
                outputStream.write(message.getBytes());

            } finally {
                // close the socket and we are done.
                socket.close();
            }
            // IOExcecption is thrown if connect fails.
        } catch (IOException ex) {
            Log.e(this.toString(), "IOException " + ex.getMessage());
            // NoSuchMethodException IllegalAccessException
            // InvocationTargetException
            // are reflection exceptions.
        } catch (NoSuchMethodException ex) {
            Log.e(this.toString(), "NoSuchMethodException " + ex.getMessage());
        } catch (IllegalAccessException ex) {
            Log.e(this.toString(), "IllegalAccessException " + ex.getMessage());
        } catch (InvocationTargetException ex) {
            Log.e(this.toString(),
                    "InvocationTargetException " + ex.getMessage());
        }
    }

}

Solution 3

If I understand correctly, your app is unable to see any data from the device whatsoever?

One small thing: try your UUID without hiphens. In my RFCOMM apps I actually define the UUID as a long integer constant.

Also, the way your test() method is written leads me to believe the test() is making the connection, defining a thread, telling it to start and immediately returning. In other words, your thread is referencing a variable from outside of the thread which is part of the test() method but when test() dies, so does its variables.

In short, try your testing outside of a thread and get it working there first. One easy way to do this would be to use Thread.run() instead of thread.start(). .run() runs it in the foreground (and thus blocks test() so it doesn't return before the thread finished).

For a longer term solution you may wish to define your Bluetooth variables as gloibal/member variables so they don't go out of scope and are always available to your thread.

Share:
63,634

Related videos on Youtube

Gilead
Author by

Gilead

Updated on February 09, 2022

Comments

  • Gilead
    Gilead over 2 years

    This problem has been solved! Thanks a lot to Brad, Denis and junkie! You're the heroes! :)

    This is the working code. It connects to Zeemote and reads data from it.

    ===== Code =====

    public class ZeeTest extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            try {
                for (int i = 0; i < 3; i++) {
                    test();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private boolean connected = false;
        private BluetoothSocket sock;
        private InputStream in;
        public void test() throws Exception {
            if (connected) {
                return;
            }
            BluetoothDevice zee = BluetoothAdapter.getDefaultAdapter().
                getRemoteDevice("00:1C:4D:02:A6:55");
            Method m = zee.getClass().getMethod("createRfcommSocket",
                new Class[] { int.class });
            sock = (BluetoothSocket)m.invoke(zee, Integer.valueOf(1));
            Log.d("ZeeTest", "++++ Connecting");
            sock.connect();
            Log.d("ZeeTest", "++++ Connected");
            in = sock.getInputStream();
            byte[] buffer = new byte[50];
            int read = 0;
            Log.d("ZeeTest", "++++ Listening...");
            try {
                while (true) {
                    read = in.read(buffer);
                    connected = true;
                    StringBuilder buf = new StringBuilder();
                    for (int i = 0; i < read; i++) {
                        int b = buffer[i] & 0xff;
                        if (b < 0x10) {
                            buf.append("0");
                        }
                        buf.append(Integer.toHexString(b)).append(" ");
                    }
                    Log.d("ZeeTest", "++++ Read "+ read +" bytes: "+ buf.toString());
                }
            } catch (IOException e) {}
            Log.d("ZeeTest", "++++ Done: test()");
        }
        @Override
        public void onDestroy() {
            try {
                if (in != null) {
                    in.close();
                }
                if (sock != null) {
                    sock.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            super.onDestroy();
        }
    }
    

    ===== Original question =====

    I'm trying to connect to a Zeemote (http://zeemote.com/) gaming controller from Moto Droid running 2.0.1 firmware. The test application below does connect to the device (LED flashes) but connection is dropped immediately after that.

    I'm pasting two test apps below: one that actually tries to read from input stream and second one that just sits there, waiting for the device to disconnect after 5 seconds. And yes, I do have third version :) which first waits for ACL_CONNECTED and then opens socket but there's nothing new in its behaviour.

    Some background info: I can connect to the Zeemote from my laptop perfectly fine using bluez tools (log attached as well). I know for sure that Droid is able to talk to Zeemote as well because 'Game Pro' from the Market works fine with it (but then it's a driver/service so maybe it uses lower-level API?).

    I noticed that 'adb bugreport' reports neither UUID nor RFCOMM channel for Zeemote while it does so for all other devices (including Moto HS815 headset, another dumb device for which 'sdp browse' reports nothing). Also, when the device boots, Zeemote's priority is 0 (others have priority 100+).

    I'm quite at a loss here, I worked on it for so long that I ran out of ideas so any help would be very much appreciated (even if you don't know the answer :) )

    Thanks, Max

    Test application No. 1

    This app tries to actually read from the device.

    ===== Code =====

    public class ZeeTest extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            try {
                test();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private BluetoothSocket sock;
        private InputStream in;
        public void test() throws IOException {
            BluetoothDevice zee = BluetoothAdapter.getDefaultAdapter().
                          getRemoteDevice("00:1C:4D:02:A6:55");
            sock = zee.createRfcommSocketToServiceRecord(
                          UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812"));
            Log.d("ZeeTest", "++++ Connecting");
            sock.connect();
            Log.d("ZeeTest", "++++ Connected");
            in = sock.getInputStream();
            byte[] buffer = new byte[1];
            int bytes = 0;
            int x = 0;
            Log.d("ZeeTest", "++++ Listening...");
            while (x < 2) {
                x++;
                try {
                    bytes = in.read(buffer);
                    Log.d("ZeeTest", "++++ Read "+ bytes +" bytes");
                } catch (IOException e) {
                    e.printStackTrace();
                    try { Thread.sleep(100); } catch (InterruptedException ie) {}
                }
            }
            Log.d("ZeeTest", "++++ Done: test()");
        }
        @Override
        public void onDestroy() {
            try {
                if (in != null) {
                    in.close();
                }
                if (sock != null) {
                    sock.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            super.onDestroy();
        }
    }
    

    ===== Log =====

    04-19 22:27:01.147: DEBUG/ZeeTest(8619): ++++ Connecting
    04-19 22:27:04.085: INFO/usbd(1062): process_usb_uevent_message(): buffer = add@/devices/virtual/bluetooth/hci0/hci0:1
    04-19 22:27:04.085: INFO/usbd(1062): main(): call select(...)
    04-19 22:27:04.327: ERROR/BluetoothEventLoop.cpp(4029): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/4121/hci0/dev_00_1C_4D_02_A6_55
    04-19 22:27:04.491: VERBOSE/BluetoothEventRedirector(7499): Received android.bleutooth.device.action.UUID
    04-19 22:27:04.905: DEBUG/ZeeTest(8619): ++++ Connected
    04-19 22:27:04.905: DEBUG/ZeeTest(8619): ++++ Listening...
    04-19 22:27:05.538: WARN/System.err(8619): java.io.IOException: Software caused connection abort
    04-19 22:27:05.600: WARN/System.err(8619):     at android.bluetooth.BluetoothSocket.readNative(Native Method)
    ...
    04-19 22:27:05.717: WARN/System.err(8619): java.io.IOException: Software caused connection abort
    04-19 22:27:05.717: WARN/System.err(8619):     at android.bluetooth.BluetoothSocket.readNative(Native Method)
    ...
    04-19 22:27:05.819: DEBUG/ZeeTest(8619): ++++ Done: test()
    04-19 22:27:07.155: VERBOSE/BluetoothEventRedirector(7499): Received android.bleutooth.device.action.UUID
    04-19 22:27:09.077: INFO/usbd(1062): process_usb_uevent_message(): buffer = remove@/devices/virtual/bluetooth/hci0/hci0:1
    04-19 22:27:09.085: INFO/usbd(1062): main(): call select(...)
    04-19 22:27:09.139: ERROR/BluetoothEventLoop.cpp(4029): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/4121/hci0/dev_00_1C_4D_02_A6_55
    

    Test application No. 2

    This test connects and waits -- useful for displaying the auto-disconnect issue.

    ===== Code =====

    public class ZeeTest extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            getApplicationContext().registerReceiver(receiver,
                        new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));
            getApplicationContext().registerReceiver(receiver,
                        new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED));
            try {
                BluetoothDevice zee = BluetoothAdapter.getDefaultAdapter().
                                getRemoteDevice("00:1C:4D:02:A6:55");
                sock = zee.createRfcommSocketToServiceRecord(
                                UUID.fromString("8e1f0cf7-508f-4875-b62c-fbb67fd34812"));
    
                Log.d("ZeeTest", "++++ Connecting");
                sock.connect();
                Log.d("ZeeTest", "++++ Connected");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private static final LogBroadcastReceiver receiver = new LogBroadcastReceiver();
        public static class LogBroadcastReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("ZeeReceiver", intent.toString());
                Bundle extras = intent.getExtras();
                for (String k : extras.keySet()) {
                    Log.d("ZeeReceiver", "    Extra: "+ extras.get(k).toString());
                }
            }
        }
    
        private BluetoothSocket sock;
        @Override
        public void onDestroy() {
            getApplicationContext().unregisterReceiver(receiver);
            if (sock != null) {
                try {
                    sock.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            super.onDestroy();
        }
    }
    

    ===== Log =====

    04-19 22:06:34.944: DEBUG/ZeeTest(7986): ++++ Connecting
    04-19 22:06:38.202: INFO/usbd(1062): process_usb_uevent_message(): buffer = add@/devices/virtual/bluetooth/hci0/hci0:1
    04-19 22:06:38.202: INFO/usbd(1062): main(): call select(...)
    04-19 22:06:38.217: ERROR/BluetoothEventLoop.cpp(4029): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/4121/hci0/dev_00_1C_4D_02_A6_55
    04-19 22:06:38.428: VERBOSE/BluetoothEventRedirector(7499): Received android.bleutooth.device.action.UUID
    04-19 22:06:38.968: DEBUG/ZeeTest(7986): ++++ Connected
    04-19 22:06:39.061: DEBUG/ZeeReceiver(7986): Intent { act=android.bluetooth.device.action.ACL_CONNECTED (has extras) }
    04-19 22:06:39.108: DEBUG/ZeeReceiver(7986):     Extra: 00:1C:4D:02:A6:55
    04-19 22:06:39.538: INFO/ActivityManager(4029): Displayed activity zee.test/.ZeeTest: 5178 ms (total 5178 ms)
    04-19 22:06:41.014: VERBOSE/BluetoothEventRedirector(7499): Received android.bleutooth.device.action.UUID
    04-19 22:06:43.038: INFO/usbd(1062): process_usb_uevent_message(): buffer = remove@/devices/virtual/bluetooth/hci0/hci0:1
    04-19 22:06:43.038: INFO/usbd(1062): main(): call select(...)
    04-19 22:06:43.069: ERROR/BluetoothEventLoop.cpp(4029): event_filter: Received signal org.bluez.Device:PropertyChanged from /org/bluez/4121/hci0/dev_00_1C_4D_02_A6_55
    04-19 22:06:43.124: DEBUG/ZeeReceiver(7986): Intent { act=android.bluetooth.device.action.ACL_DISCONNECTED (has extras) }
    04-19 22:06:43.124: DEBUG/ZeeReceiver(7986):     Extra: 00:1C:4D:02:A6:55
    

    System logs

    ===== Terminal log =====

    $ sdptool browse
    Inquiring ...
    Browsing 00:1C:4D:02:A6:55 ...
    
    $ sdptool records 00:1C:4D:02:A6:55
    Service Name: Zeemote
    Service RecHandle: 0x10015
    Service Class ID List:
      UUID 128: 8e1f0cf7-508f-4875-b62c-fbb67fd34812
    Protocol Descriptor List:
      "L2CAP" (0x0100)
      "RFCOMM" (0x0003)
        Channel: 1
    Language Base Attr List:
      code_ISO639: 0x656e
      encoding:    0x6a
      base_offset: 0x100
    
    $ rfcomm connect /dev/tty10 00:1C:4D:02:A6:55
    Connected /dev/rfcomm0 to 00:1C:4D:02:A6:55 on channel 1
    Press CTRL-C for hangup
    
    # rfcomm show /dev/tty10
    rfcomm0: 00:1F:3A:E4:C8:40 -> 00:1C:4D:02:A6:55 channel 1 connected [reuse-dlc release-on-hup tty-attached]
    
    # cat /dev/tty10
    (nothing here)
    
    # hcidump
    HCI sniffer - Bluetooth packet analyzer ver 1.42
    device: hci0 snap_len: 1028 filter: 0xffffffff
    < HCI Command: Create Connection (0x01|0x0005) plen 13
    > HCI Event: Command Status (0x0f) plen 4
    > HCI Event: Connect Complete (0x03) plen 11
    < HCI Command: Read Remote Supported Features (0x01|0x001b) plen 2
    > HCI Event: Read Remote Supported Features (0x0b) plen 11
    < ACL data: handle 11 flags 0x02 dlen 10
        L2CAP(s): Info req: type 2
    > HCI Event: Command Status (0x0f) plen 4
    > HCI Event: Page Scan Repetition Mode Change (0x20) plen 7
    > HCI Event: Max Slots Change (0x1b) plen 3
    < HCI Command: Remote Name Request (0x01|0x0019) plen 10
    > HCI Event: Command Status (0x0f) plen 4
    > ACL data: handle 11 flags 0x02 dlen 16
        L2CAP(s): Info rsp: type 2 result 0
          Extended feature mask 0x0000
    < ACL data: handle 11 flags 0x02 dlen 12
        L2CAP(s): Connect req: psm 3 scid 0x0040
    > HCI Event: Number of Completed Packets (0x13) plen 5
    > ACL data: handle 11 flags 0x02 dlen 16
        L2CAP(s): Connect rsp: dcid 0x04fb scid 0x0040 result 1 status 2
          Connection pending - Authorization pending
    > HCI Event: Remote Name Req Complete (0x07) plen 255
    > ACL data: handle 11 flags 0x02 dlen 16
        L2CAP(s): Connect rsp: dcid 0x04fb scid 0x0040 result 0 status 0
          Connection successful
    < ACL data: handle 11 flags 0x02 dlen 16
        L2CAP(s): Config req: dcid 0x04fb flags 0x00 clen 4
          MTU 1013
    (events are properly received using bluez)
    

    ===== Part of adb bugreport =====

    --Known devices--
    00:19:A1:2D:16:EA     bonded (0) LG U830
        00001105-0000-1000-8000-00805f9b34fb RFCOMM channel = 17
    00:1C:4D:02:A6:55     bonded (0) Zeemote JS1
    00:0B:2E:6E:6F:00     bonded (0) Motorola HS815
        00001108-0000-1000-8000-00805f9b34fb RFCOMM channel = 1
        0000111e-0000-1000-8000-00805f9b34fb RFCOMM channel = 2
    00:1F:3A:E4:C8:40     bonded (0) BRCM BT4X
        00001105-0000-1000-8000-00805f9b34fb RFCOMM channel = 9
    00:18:42:EC:E2:99     bonded (0) N95
        00001105-0000-1000-8000-00805f9b34fb RFCOMM channel = 9
    

    ===== Excerpt from boot log =====

    04-18 21:55:10.382: VERBOSE/BluetoothEventRedirector(1985): Received android.bluetooth.adapter.action.STATE_CHANGED
    04-18 21:55:10.421: DEBUG/BT HSHFP(1237): Loaded priority 00:19:A1:2D:16:EA = 100
    04-18 21:55:10.428: DEBUG/BT HSHFP(1237): Loaded priority 00:1C:4D:02:A6:55 = 0
    04-18 21:55:10.444: DEBUG/BT HSHFP(1237): Loaded priority 00:0B:2E:6E:6F:00 = 101
    04-18 21:55:10.749: DEBUG/BT HSHFP(1237): Loaded priority 00:1F:3A:E4:C8:40 = 100
    04-18 21:55:10.780: DEBUG/BT HSHFP(1237): Loaded priority 00:18:42:EC:E2:99 = 100
    
    • KH_AJU
      KH_AJU over 6 years
      Am facing the same issue in Nougat 7.0 devices (Nougat 7.1 + working fine). Tried this workarounds but no luck so far. Any help or suggestions are highly appreciated...
  • Gilead
    Gilead about 14 years
    Hi Brad! Thank you for your answer. I tried different UUID formats but found no difference between them :( As you can see I update first test app so it doesn't use threads anymore (I wanted to do it 'by the book' with threads ;) ).
  • Brad Hein
    Brad Hein about 14 years
    You should definitely use threads - but they can be quite difficult to troubleshoot so keep them simple and move code into the thread after you get it working outside of the thread. Your UUID is probably fine - your main issue was probably just the thread. Just remember that as soon as you start the thread the method that started the thread will continue to go about its business (and even return) as the thread starts up in the background. Define your bluetooth connection as a class variable so any method/thread can access it. Then use a thread for I/O which can block so the user doesn't notice
  • Gilead
    Gilead about 14 years
    I will do it as soon as I get the bloody thing working ;) Actually I think it may be just a bug in Android's Java->Bluez glue code. Can't think of any other explanation.
  • Brad Hein
    Brad Hein about 14 years
    Although that's possible, I have a couple apps (one on the market) working great with bluetooth for some time now. My next recommendation would be to attach buffered input and output streams to the socket. You may be experiencing flow control. Using buffered streams prevents this and increases your throughput dramatically (because the data can arrive and wait in the buffer until you read it, instead of being blocked until your code reads it). import java.io.BufferedInputStream; instream = new BufferedInputStream(mobdSock.getInputStream(),INPUT_BUFFER_S‌​IZE);
  • Gilead
    Gilead about 14 years
    Sadly, none of these work :( I tried quite a lot of different services but got service discovery error for all 'generic' ones. But fair point, that was one of my guesses that I'm just connecting to the wrong UUID (and Android's API is too stupid to understand MAC/service/port addressing).
  • Amal
    Amal almost 13 years
    Why does reflection work here and not the original function ? And why only values 1-3 ?
  • jacknad
    jacknad over 12 years
    Why does this work? (The documentation for createRfcommSocketToServiceRecord says to use the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB). Should the documentation be changed?
  • ekatz
    ekatz over 12 years
    I a bit confused about this - what happened to the original UUID? how will android know what to connect to?
  • AgentKnopf
    AgentKnopf almost 12 years
    Question --> How can this solution work - isn't a UUID requried in any case? So the two communicating devices can identify each other?
  • Gilead
    Gilead almost 12 years
    @Zainodis: the zee object on which createRfcommSocket() method is called on is a BluetoothDevice which has been identified by its device address (see the sample code at the top). The channel number is device-specific.
  • AgentKnopf
    AgentKnopf almost 12 years
    @Gilead Thanks for the clarification!
  • c12
    c12 over 11 years
    thanks for the sample. Were you able to get this to work with Android phones running 2.3.3? I'm having issues outlined here stackoverflow.com/questions/12432990/… and I tried your example without success. My Motorolla Droid X encounters a Connection timed out IOException when trying to connect the socket. If I manually pair and then run your example with my SSP device, I get a Permission denied IOException. Any ideas?
  • appukrb
    appukrb over 10 years
    @Denis L How to create Application uuid?
  • user740006
    user740006 over 9 years
    Why UUID is not needed has been explained in another thread on SO.