8

I am facing the same problem as in a previous (and unanswered) question, I was hesitating to edit it, as I want to add a lot more information. So here is the related question : Android bluetooth connection fails (Error: no bt sock found, scn 1).

The error occurs while attempting to make a Bluetooth connection. I doesn't always occur (why ?), but it is quite frequent. I am writing this app for Android 2.3 with Eclipse Indigo.

Here is the log I get while doing the connection before having the error (it seems like the connection succeeds before the error occurs) :

03-29 15:14:52.205: D/BLZ20_ASOCKWRP(22027): asocket_connect
03-29 15:14:52.205: I/BLZ20_WRAPPER(22027): blz20_wrp_connect: s 53
03-29 15:14:52.205: D/BLZ20_WRAPPER(22027): blz20_wrp_connect:  fd (-1:53), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0
03-29 15:14:52.205: I/BLZ20_WRAPPER(22027): __connect_prot_rfcomm: connecting to... 0440201b0800, rc chan 1
03-29 15:14:52.205: I/BLZ20_WRAPPER(22027): __connect_prot_rfcomm: non blocking mode
03-29 15:14:52.205: I/BTL_IFC(22027): send_ctrl_msg: [BTL_IFC CTRL] send BTLIF_BTS_RFC_CON_REQ (BTS) 23 pbytes (hdl 52)
03-29 15:14:52.205: D/BLZ20_WRAPPER(22027): blz20_wrp_connect: success
03-29 15:14:52.205: I/BLZ20_WRAPPER(22027): blz20_wrp_poll: nfds 2, timeout -1 ms
03-29 15:14:52.205: D/BLZ20_WRAPPER(22027): blz20_wrp_poll: pending connect fd (-1:53), bta -1, rc 1, wflags 0x0, cflags 0x1, port 0
03-29 15:14:52.205: D/BLZ20_WRAPPER(22027): btlif_wait_response: id(s) |BTLIF_BTS_RFC_CON_RSP|BTLIF_BTS_RFC_DISC_IND|
03-29 15:14:52.920: I/BTL_IFC(22027): btl_ifc_ctrl_rx: [BTL_IFC CTRL] recv BTLIF_BTS_RFC_CON_RSP (BTS) 22 pbytes (hdl 52)
03-29 15:14:52.920: I/BLZ20_WRAPPER(22027): btlif_ctrl_callback: btlif_ctrl_callback : msg id BTLIF_BTS_RFC_CON_RSP
03-29 15:14:52.920: E/BLZ20_WRAPPER(22027): ##### ERROR : btlif_process_con_rsp: no bt sock found, scn 1#####

And here is the log I get while the connection just fails (but no error)

03-29 15:20:37.100: D/BLZ20_ASOCKWRP(22027): asocket_abort [44,45,46]
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_shutdown: s 44, how 2
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_shutdown:  fd (-1:44), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_shutdown: shutdown socket
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_write: wrote 1 bytes out of 1 on fd 46
03-29 15:20:37.100: D/BLZ20_ASOCKWRP(22027): asocket_destroy
03-29 15:20:37.100: D/BLZ20_ASOCKWRP(22027): asocket_abort [44,45,46]
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_shutdown: s 44, how 2
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_shutdown:  fd (-1:44), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_shutdown: shutdown socket
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_write: wrote 1 bytes out of 1 on fd 46
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_close: s 46
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_close: std close (46)
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_close: s 45
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_close: std close (45)
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): blz20_wrp_close: s 44
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): blz20_wrp_close:  fd (-1:44), bta -1, rc 0, wflags 0x0, cflags 0x0, port 0
03-29 15:20:37.100: I/BLZ20_WRAPPER(22027): __close_prot_rfcomm: fd 44
03-29 15:20:37.100: I/BTL_IFC(22027): send_ctrl_msg: [BTL_IFC CTRL] send BTLIF_BTS_RFC_CLOSE (BTS) 8 pbytes (hdl 52)
03-29 15:20:37.100: D/BTL_IFC_WRP(22027): wrp_close_s_only: wrp_close_s_only [44] (44:-1) []
03-29 15:20:37.100: D/BTL_IFC_WRP(22027): wrp_close_s_only: data socket closed
03-29 15:20:37.100: D/BTL_IFC_WRP(22027): wsactive_del: delete wsock 44 from active list [ad439320]
03-29 15:20:37.100: D/BTL_IFC_WRP(22027): wrp_close_s_only: wsock fully closed, return to pool
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): btsk_dump_list:  fd (-1:53), bta -1, rc 1, wflags 0x900, cflags 0x0, port 0
03-29 15:20:37.100: D/BLZ20_WRAPPER(22027): btsk_free: success

While debugging I have figured out that the ConnectThread used for making the connection keeps running in the case of the error, which means it has entered an infinite loop. Hence if another Thread tries to cancel and finish this ConnectThread, the application will crash.

See here the source code of this ConnectThread which is an inner class of a Service (very similar to BluetoothChat sample):

/**
 * This thread runs while attempting to make an outgoing connection
 * with a device. It runs straight through; the connection either
 * succeeds or fails.
 */
private class ConnectThread extends Thread
{
    private final BluetoothSocket mmSocket;
    private final BluetoothDevice mmDevice;

    public ConnectThread(BluetoothDevice device)
    {
        mmDevice = device;
        // Use a temporary object that is later assigned to mmSocket,
        // because mmSocket is final
        BluetoothSocket tmp = null;

        // Get a BluetoothSocket to connect with the given BluetoothDevice
        try
        {
            // SerialPortServiceClass_UUID is the app's UUID string, also
            // used by the server code
            tmp = device.createRfcommSocketToServiceRecord(SerialPortServiceClass_UUID);
        } catch (IOException e)
        {
            if (D) Log.e(TAG, "create RFCOMM failed", e);
            // here I do something to notify the UI that the connection has failed

            // Reset the ConnectThread because the connection has failed
            synchronized (DataReceiverService.this)
            {
                mConnectThread = null;
            }
        }
        mmSocket = tmp;
    }

    public void run()
    {
        if (D) Log.i(TAG, "BEGIN mConnectThread");
        setName("ConnectThread");

        // Cancel discovery because it will slow down the connection
        mBtAdapter.cancelDiscovery();

        try
        {
            // Connect the device through the socket. This will block
            // until it succeeds or throws an exception
            mmSocket.connect();
        } catch (IOException connectException)
        {
            // Unable to connect, close the socket and get out
            try {
                mmSocket.close();
            } catch (IOException closeException)
            {
                if (D) Log.e(TAG, "unable to close() socket during connection failure", closeException);
            }
            // here I do something to notify the UI that the connection has fqiled
            return;
        }

        // Reset the ConnectThread because we're done
        synchronized (DataReceiverService.this)
        {
            mConnectThread = null;
        }

        // Do work to manage the connection (in the ConnectedThread)
        connected(mmSocket, mmDevice);
    }

    /** Will cancel an in-progress connection, and close the socket */
    public void cancel()
    {
        try {
            mmSocket.close();
        } catch (IOException e)
        {
            if (D) Log.e(TAG, "close() of connect socket failed", e);
        }
    }
}
Community
  • 1
  • 1
fripon
  • 101
  • 10
  • Happens totally randomly for me to on a Samsung GT-I9100 (Android 2.3) - however once it starts failing, I have to reboot my phone to make it work again. I wonder what the heck that "BLZ20_WRAPPER" is? Is that a Samsung-specific bluetooth implementation? – AgentKnopf Jun 29 '12 at 07:29

1 Answers1

0

check this http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html

BluetoothDevice

Represents a remote Bluetooth device. Use this to request a connection with a remote device through a BluetoothSocket or query information about the device such as its name, address, class, and bonding state.

Android Developer
  • 1,039
  • 1
  • 9
  • 33