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

2023-12-08

我正在编写一个 Android 应用程序,它使用 RFCOMM 通过蓝牙连接到设备。我使用 BluetoothChat 示例作为建立连接的基础,并且大多数时候一切都运行良好。

但是,有时我无法重新连接,因为出现套接字已打开的消息:

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

如果我连接到设备,关闭应用程序(调用 onDestroy()),重新打开它并尝试再次连接,就会发生这种情况,从而导致上述结果。

我在 ConnectThread 中使用此方法进行连接(参考BluetoothChat 示例):

Method m = device.getClass().getMethod("createRfcommSocket",new Class[] {int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));  
mmSocket = tmp;

解决此问题的唯一方法是关闭/打开 Android 手机的蓝牙。

这让我相信套接字没有在 onDestroy() 中关闭,但我仍然调用关闭所有线程,如前面提到的示例所示。
任何想法,将不胜感激。


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

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

Solution

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

获取此socket的连接状态,即是否有 与远程设备的活动连接。

对于 API 级别

    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
    }

附注除了 SystemClock.sleep,您还可以使用 Thread.sleep - 但是 SystemCock 的睡眠不能被中断,而 Thread.sleep 可以被中断,所以这取决于您的用例,哪个选项更适合您的目的。

Source: 路易斯·A·普拉多

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RFCOMM_CreateConnection - 已打开状态:2,RFC 状态:4,MCB 状态:5 的相关文章

随机推荐