我将蓝牙套接字连接到蓝牙设备,并希望从该设备读取字节。
我正确地建立了联系:
try {
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
temp = (BluetoothSocket) m.invoke(mmDevice, 1);
} catch (Exception e) {
}我正在正确地从蓝牙设备读取字节。
我得到了例外:
java.io.IOException:读取失败,套接字可能关闭或超时,读取ret:-1
由于这个原因,连接中断了,我的设备和蓝牙设备之间的通信也结束了。
这个问题在Android5.0.1棒棒糖上特别出现。
有人能找到解决办法吗?
发布于 2015-05-04 11:07:53
使用createRfcommSocketToServiceRecord而不是createRfcommSocket
createRfcommSocketToServiceRecord使用您传递的UUID,并使用SDP来决定用于连接的无线信道。它还检查服务器是否使用相同的UUID侦听远程端点。以这种方式,这是获得连接的最可靠的方式:它总是使用正确的通道,如果打开连接成功,您知道在另一端的东西可以理解您的协议。
相反,createRfcommSocket只是连接到你告诉它的频道。无法知道远程端点上是否存在任何内容:您只知道设备在那里。另外,你选择广播频道可能是完全不恰当的。这就是为什么这个函数没有在API中发布,而另一个函数是首选的。
createRfcommSocket最初看起来可能更可靠,但这是因为它没有检查另一个端点是否存在侦听器:它忽略了某些错误情况。这也许可以用于实验,但对于生产系统来说是没用的,因为用户通常会忘记在另一个端点上启动服务器,而您的应用程序会以令人困惑的方式失败。
当然,由于createRfcommSocket没有在API中发布,所以你不能保证它在将来的安卓版本中会继续工作。
发布于 2017-04-27 12:30:43
在6.0.1中,我一直面临着同样的问题,我在不同的线程/论坛/博客上读到了这个问题,我知道这是因为一个缺失的退路。您可以通过捕获异常并创建所需的回退来处理它。
更确切地说,BluetoothManager返回一个默认值-1,这是不可接受的状态,因此出现了错误。这将引发一个异常,该异常可以通过替换-1的错误来创建一个回退以解决问题。
以下是帮助我的链接:
https://github.com/don/BluetoothSerial/issues/89
参考资料:IOException: read failed, socket might closed - Bluetooth on Android 4.3
发布于 2015-05-26 19:18:20
我在Lollipop上也有类似的问题(在以前的版本中使用),并将"createRfcommSocket“替换为"createInsecureRfcommSocket”,解决了这个问题。
如果您选择官方API,您可以尝试createInsecureRfcommSocketToServiceRecord,因为createRfcommSocketToServiceRecord也不适合我。
https://stackoverflow.com/questions/29143695
复制相似问题