2012-11-30 178 views
9

我有一个通过蓝牙连接到设备的项目。它曾经相当可靠地工作,但现在每次都不能通过BluetoothSocket.connect()。 (好吧,我在4小时内尝试了数千次尝试连接一次。)大部分代码都来自API中的标准示例聊天代码,除了在获取BluetoothSocket设备时的常见修改之外本身:BluetoothSocket.connect()抛出异常“读取失败”

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); 
} 

相关的日志条目(如果同时呼吁connect()被捕获的异常印)是这样的:

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

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

我看着source code抛出异常。问题似乎是底层的InputStream没有数据。当然,这不是一个真正的答案,只是朝着它迈出的一步。为什么这个流没有数据?

我想保持对潜在问题的开放态度。我是否正确地获得了BluetoothSocket?事实上,它曾经是一个间歇性问题,现在几乎不变,这让我怀疑是多线程的,但与C++相比,这是一个相对简单的话题 - 如果你知道自己在做什么很难搞定。此外,大部分代码(特别是涉及同步线程的部分)都是直接从示例代码中提取出来的。

另一端的设备是一个嵌入式蓝牙设备,所以从这方面调试问题没有多少希望。

UPDATE ===========================

它发生,我认为这可能是由于操作系统升级(我在Galaxy Nexus手机上运行 - 我有几个要测试)。所以我用4.0.4解开了一个新手机,它工作!然后回到原来的两款测试手机上进行测试,这两款手机都运行在4.2版本上,期待着我一直看到的失败。奇怪的是,现在它也适用于这些手机。我想说我已经做了一些工作来重新开始这项工作,但我没有。我仍然很迷惑,现在也怀疑这件事情在我真正需要时会起作用。

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

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

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

+0

我有同样的问题,我有打印通过蓝牙Datamax o'neil APEX4打印机的代码。在Galaxy Tab 7以及Honeycomb 3.2上正常工作。但在ICS或更高版本的其他设备中,请勿使用。我正在比较BluetoothSocket对象并且非常不同。你确定你还没有添加任何代码吗? – ClarkXP

+0

Jellybean有一个完全不同的蓝牙堆栈,因此版本差异肯定会触发某些东西,但这本身并不能解释为什么它保持工作或不工作 - 与旧设备连接后工作。难道是配对吗?如果再次发生,请尝试从设备取消配对并重新配对,然后查看会发生什么情况。 –

+0

@DanHulme我认为你是对的,这是导致它的不同蓝牙堆栈。我用4.1做了一些测试,并且在那里工作得很好。如果你想把它写成答案,我很乐意接受它。 –

回答

8

Jellybean有一个完全不同的蓝牙堆栈,所以版本差异肯定会触发某些东西,但这本身并不能解释为什么它保持工作或不工作 - 与旧设备连接后工作。难道是配对吗?如果再次发生,请尝试从设备取消配对并重新配对。

+2

我只有在Nexus 7,Android4.2.1上有同样的问题 - 在所有其他Android版本和其他手机/设备上,它都能正常工作。重新配对并没有帮助。还有什么需要做的,使其再次工作?非常感谢! ps die UUID ist OK – user387184

+0

我也坚持相同的问题,任何帮助将不胜感激。 –

2

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

+0

非常有趣。我必须尝试一下,看看它是否可以在我的设备上运行。谢谢! –

+0

很酷。你能否报告你的发现?我只有两个4.3设备可用atm。 – matthes

+0

恐怕我做不到。自从我上次发布以来,我无法再访问出现此错误的硬件。 –

-3

我认为这可能有效:首先,您必须连接到互联网并安装一个移动市场apk并尝试寻找FXR WiFi Fix并拯救并安装它们并执行,我有幸与我的SONY蓝牙52耳机有类似的问题,目前它正在努力工作。

+3

哦,来吧。你能提出一个程序化的解决方案吗? – SoloPilot

+3

这个答案没有任何意义 –