2012-03-29 51 views
8

我面臨着與以前(和未回答)問題相同的問題,我猶豫編輯它,因爲我想添加更多信息。所以這裏是相關的問題:Android bluetooth connection fails (Error: no bt sock found, scn 1)Android藍牙連接錯誤(沒有找到bt襪子,scn 1) - 無限循環

嘗試進行藍牙連接時發生錯誤。我並不總是會發生(爲什麼?),但它是相當頻繁的。我正在使用Eclipse Indigo爲Android 2.3編寫此應用程序。

這裏是日誌我得到的,而這樣做有錯誤之前的連接(這似乎是連接成功,錯誤發生前):

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); 
     } 
    } 
} 
+0

完全隨機發生在三星GT-I9100(Android 2.3)上 - 但是一旦它開始失敗,我必須重新啓動手機才能重新工作。我想知道「BLZ20_WRAPPER」是什麼?這是一個三星特定的藍牙實施? – AgentKnopf 2012-06-29 07:29:21

回答