我有一个通过蓝牙连接到设备的项目。它曾经相当可靠地工作,但现在每次都不能通过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 ===========================
我发现,解除配对和重新配对将使设备连接。这是一种解决方法,但总比没有好。
我有同样的问题,我有打印通过蓝牙Datamax o'neil APEX4打印机的代码。在Galaxy Tab 7以及Honeycomb 3.2上正常工作。但在ICS或更高版本的其他设备中,请勿使用。我正在比较BluetoothSocket对象并且非常不同。你确定你还没有添加任何代码吗? – ClarkXP
Jellybean有一个完全不同的蓝牙堆栈,因此版本差异肯定会触发某些东西,但这本身并不能解释为什么它保持工作或不工作 - 与旧设备连接后工作。难道是配对吗?如果再次发生,请尝试从设备取消配对并重新配对,然后查看会发生什么情况。 –
@DanHulme我认为你是对的,这是导致它的不同蓝牙堆栈。我用4.1做了一些测试,并且在那里工作得很好。如果你想把它写成答案,我很乐意接受它。 –