Ошибка подключения Android Bluetooth (bt sock не найден, scn 1) - бесконечный цикл

Я столкнулся с той же проблемой, что и в предыдущем (и оставшемся без ответа) вопросе, я не решался отредактировать его, так как хочу добавить гораздо больше информации. Итак, вот связанный с этим вопрос: Сбой подключения Android Bluetooth (Ошибка: не найдено носка bt, scn 1) .

Ошибка возникает при попытке установить соединение Bluetooth. I встречается не всегда (почему?), но довольно часто. Я пишу это приложение для Android 2.3 с Eclipse Indigo.

Вот лог, который я получаю при подключении до возникновения ошибки (похоже, что соединение успешно установлено до того, как возникает ошибка):

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#####

А вот лог, который я получаю, когда просто не удается установить соединение (но без ошибки)

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

Во время отладки я выяснил, что ConnectThread, используемый для установления соединения, продолжает работать в случае ошибки, что означает, что он вошел в бесконечный цикл. Следовательно, если другой Threadпопытается отменить и завершить этот ConnectThread, приложение рухнет.

См. здесь исходный код этого ConnectThread, который является внутренним классом Service(очень похож на образец BluetoothChat):

/**
 * 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);
        }
    }
}

8
задан Community 23 May 2017 в 10:08
поделиться