RFCOMM_CreateConnection - 已经打开状态:2,RFC状态:4,MCB状态:5

时间:2011-10-25 11:04:25

标签: android bluetooth rfcomm

--------解决-------------- 我正在编写一个使用RFCOMM通过蓝牙连接到设备的Android应用程序。我使用BluetoothChat示例作为建立连接的基础,一切都在大多数情况下完美运行。有时由于套接字已打开的消息,我无法重新连接:RFCOMM_CreateConnection - 已打开状态:2,RFC状态:4,MCB状态:5 如果我连接到设备,关闭应用程序(调用onDestroy()),重新打开它并尝试再次连接,这往往会发生这种情况,这导致了上述情况。

我使用此方法连接ConnectThread(ref.BluetoothChat示例): 方法m = device.getClass()。getMethod(“createRfcommSocket”,new Class [] {int.class}); tmp =(BluetoothSocket)m.invoke(device,Integer.valueOf(1));
mmSocket = tmp;

解决这个问题的唯一办法是关闭/开启Android手机的蓝牙。这让我相信套接字没有在onDestroy()上关闭,但我仍然在调用关闭所有线程,如前面提到的示例所示。 任何想法都会得到满足。

1 个答案:

答案 0 :(得分:3)

我偶然发现了这个,这就是我找到的答案:

如果多次打开和关闭蓝牙套接字连接,可能会发生此错误。

<强>解决方案

从API Level 14开始,BluetoothSocket中有一个名为isConected()的方法,如果此套接字已连接则返回true,否则返回false,这里是API的原始摘录:

  

获取此套接字的连接状态,即是否存在   与远程设备的主动连接。

对于API级别&lt; 14你可以通过在关闭连接后将蓝牙处理线程置于休眠状态来解决这个问题 - 1000毫秒就足够了,这是一个例子(btDevice属于BluetoothDevice类型,并且已经在下面的代码片段之前进行了初始化): / p>

    try {
        //Open the socket to an SPP device (UUID taken from Android API for createRfcommSocketToServiceRecord)
        BluetoothSocket btSocket = btDevice.createRfcommSocketToServiceRecord("00001101-0000-1000-8000-00805F9B34FB");
        //Connect to the socket
        btSocket.connect();
        //Close the socket
        btSocket.close();
        //Sleep time of 1000ms after closing the socket
        SystemClock.sleep(POST_RESET_DELAY);

    } catch (Throwable e) {
        // Log error message
    }

P.S。而不是SystemClock.sleep你也可以使用Thread.sleep - 但是SystemCock的睡眠不能被打断,而Thread.sleep可以被打断,所以它取决于你的用例哪个选项更适合你的目的。

来源:Louis A. Prado