我正在与蓝牙设备建立蓝牙套接字连接,并想从设备读取字节。
我已正确建立连接:
try {
Method m = mmDevice.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
temp = (BluetoothSocket) m.invoke(mmDevice, 1);
} catch (Exception e) {
}
我正在从蓝牙设备正确读取字节。
我遇到异常:
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
因此,连接中断,我的设备和蓝牙设备之间的通信也结束了。
这个问题特别出现在 Android 5.0.1 Lollipop 上
任何人都可以解决吗?
最佳答案
使用 createRfcommSocketToServiceRecord
而不是 createRfcommSocket
createRfcommSocketToServiceRecord
获取您传递的 UUID 并使用 SDP 来决定用于连接的无线信道。它还会检查以确保服务器正在使用相同的 UUID 监听远程端点。这样,它是获得连接的最可靠方式:它将始终使用正确的 channel ,并且如果打开连接成功,您就知道另一端的某些东西可以理解您的协议(protocol)。
相比之下,createRfcommSocket
只是连接到您告诉它的 channel 。无法知道远程端点上是否正在监听任何内容:您只知道设备在那里。此外,您选择的广播 channel 可能完全不合适。这就是为什么这个函数没有在 API 中发布,而首选另一个函数。
createRfcommSocket
乍一看似乎更可靠,但这是因为它没有检查另一个端点是否存在监听器:它忽略了一些错误情况。这对于实验来说可能没问题,但对于生产系统没有用,因为用户通常会忘记在另一个端点上启动服务器,您的应用程序将以令人困惑的方式失败。
当然,由于 createRfcommSocket
未在 API 中发布,因此您无法保证它会在未来的 Android 版本中继续工作。
关于android - java.io.IOException : read failed, 套接字可能关闭或超时,读取 ret : -1 on Android 5. 0.1 Lollipop 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29143695/