BluetoothSocket.connect()抛出异常"读取失败"

时间:2012-11-30 15:41:04

标签: android bluetooth

我有一个通过蓝牙连接到设备的项目。它过去工作相当可靠,但现在它每次都无法BluetoothSocket.connect()调用。 (好吧,我在4小时内的数千次尝试中连接了一次。)大多数代码都是从API中的标准示例聊天代码中获取的,除了获取{{{}的常见修改。 1}}设备本身:

BluetoothSocket

这是感兴趣的方法,一旦获得Method m = device.getClass().getMethod( "createRfcommSocket", new Class[] { int.class }); tmp = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); 就会运行:

BluetoothSocket

相关日志条目(在调用public void run() { setName("ConnectThread" + mSocketType); // Always cancel discovery because it will slow down a connection mAdapter.cancelDiscovery(); // Make a connection to the BluetoothSocket try { mmSocket.connect(); } catch (Exception e) { Log.e(TAG, "Connection to " + mmDevice.getName() + " at " + mmDevice.getAddress() + " failed:" + e.getMessage()); // Close the socket try { mmSocket.close(); } catch (Exception e2) { Log.e(TAG, "unable to close() " + mSocketType + " socket during connection failure", e2); } connectionFailed(e.getMessage()); return; } // Reset the ConnectThread because we're done synchronized (BluetoothChatService.this) { mConnectThread = null; } // Start the connected thread connected(mmSocket, mmDevice, mSocketType); } 时捕获异常时打印)是:

  

11-30 10:23:51.685:E / BluetoothChatService(2870):连接到   ZYNO-700091在00:06:66:42:8E:01失败:读取失败,插座可能   关闭,读取ret:-1

此错误曾经偶尔出现过。我有一个积极的重新连接系统 - 它基本上反复锤击连接,直到它连接,如果它永远断开,它开始再次锤击它。因此,它会终止连接线程并从头开始。我曾经考虑过那里可能存在一个问题 - 可能是多线程的,或者可能是处理套接字清理/初始化。但是,如果是这种情况,我仍然希望第一次连接尝试成功,因为在连接尝试失败之前该系统不会启动。

我调查了source code抛出异常。问题似乎是基础connect()没有数据。当然,这不是一个真正的答案,只是迈向它的一步。为什么流没有数据?

我正试图对潜在问题保持开放态度。我能正确地获得InputStream吗?事实上,它曾经是一个间歇性问题,现在几乎不变,这让我怀疑多线程,但与C ++相比,这是一个相对简单的Java主题 - 如果你知道自己在做什么,很难搞砸。此外,这些代码的大部分(特别是处理同步线程的部分)直接来自示例代码。

另一端的设备是嵌入式蓝牙设备,因此从这一点调试问题的希望不大。

更新===========================

我想到它可能是由于操作系统升级(我在Galaxy Nexus手机上运行 - 我有几个要测试)。所以我用4.0.4拆开了一个新手机,它工作了!然后回到两个原始测试手机上测试,两个都运行4.2,期待我一直看到的失败。奇怪的是,现在它也适用于那些手机。我想说我做了一些让这项工作重新开始的事情,但事实并非如此。我仍然感到神秘,现在还怀疑当我真的需要它时这个东西会起作用。

我想知道是否有可能以某种方式连接使用4.0.4可以正确设置服务器模块的状态,使其能够接受4.2设备?我猜想只是在黑暗中拍摄......

更新2 ===========================

我发现不配对和重新配对将允许设备连接。这是一种解决方法,但总比没有好。

5 个答案:

答案 0 :(得分:8)

Jellybean有一个完全不同的蓝牙堆栈,因此版本差异肯定会触发某些东西,但这本身并不能解释为什么它在连接旧设备后仍能正常工作或无法正常工作。这可能与配对有关吗?如果再次发生,请尝试从设备取消配对并再次配对。

答案 1 :(得分:2)

我知道这是一个老问题。但由于我无法在网络上找到任何解决方案,因此我最近创建了一个解决方法:IOException: read failed, socket might closed - Bluetooth on Android 4.3

答案 2 :(得分:0)

我通过蓝牙模块连接到arduino时遇到了同样的问题。这个问题只在与arduino连接时出现,因为它与另一个Android手机蓝牙连接顺畅。 对我有用的是更改UUID字符串..

答案 3 :(得分:0)

就我而言,这是由于createRfcommSocketToServiceRecord()函数中的UUID错误造成的。 我想连接到树莓派3中的SPP串行配置文件,并且使用了以下UUID:

private static final UUID MY_UUID_SECURE =
            UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

我在android文档的页面上找到了SPP。

答案 4 :(得分:-3)

我认为这可能有用:首先你必须连接到互联网并安装一个移动市场apk并尝试寻找FXR WiFi修复和救援并安装它们并执行,我有类似的问题我的SONY蓝牙52耳机幸运目前工作正常。