首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RFCOMM_CreateConnection -已打开状态:2,RFC状态:4,MCB状态:5

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

Stack Overflow用户
提问于 2011-10-25 11:04:24
回答 1查看 3.6K关注 0票数 3

我正在用RFCOMM编写一个通过蓝牙连接到设备上的android应用程序。我使用BluetoothChat示例作为建立连接的基础,并且在大多数情况下一切都是完美的。

但是,有时由于套接字已经打开的消息,我无法重新连接:

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

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

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

代码语言:javascript
复制
Method m = device.getClass().getMethod("createRfcommSocket",new Class[] {int.class });
tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1));  
mmSocket = tmp;

解决这个问题的唯一办法就是关掉Android手机的蓝牙。

这使我相信,套接字在onDestroy()中并没有被关闭,但我仍然要求关闭所有线程,如前面提到的示例所示。

任何想法都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2012-07-03 08:20:11

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

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

溶液

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

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

对于< 14的API级别,您可以通过关闭连接后让蓝牙处理线程进入休眠状态来解决此问题-- 1000 ms就足够了,下面是一个示例(btDevice是BluetoothDevice类型的,在下面的代码片段之前已经初始化):

代码语言:javascript
复制
    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可以被中断,因此它取决于您的用例--哪个选项更适合您的目的。

来源:路易斯·普拉多

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7888294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档