我遇到了与之前(并且未回答)问题相同的问题,我对编辑它犹豫不决,因为我想添加更多信息。以下是相关问题:Android bluetooth connection fails (Error: no bt sock found, 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 :(得分:0)
检查此http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html
BluetoothDevice类
表示远程蓝牙设备。使用此命令通过BluetoothSocket请求与远程设备的连接,或查询有关设备的信息,例如其名称,地址,类和绑定状态。