通过我的安卓应用程序上的蓝牙 hc-05 连接时,我无法从输入流中获取所有数据。这是我的代码:
val knownUUIDForDevice = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb")
val remoteDevice: BluetoothDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddress)
val btSocket: BluetoothSocket = remoteDevice.createRfcommSocketToServiceRecord(knownUUIDForDevice)
btSocket.connect()
connectedThread = ConnectedThread(btSocket, rawDataMessageCallback)
connectedThread.start()
我的connectedThread代码:
class ConnectedThread(private val btSocket: BluetoothSocket)
: Thread() {
private var inStream: InputStream? = null
internal var outStream: OutputStream? = null
init {
inStream = btSocket.inputStream
outStream = btSocket.outputStream
}
override fun run() {
val buffer = ByteArray(512)
inStream = btSocket.inputStream
outStream = btSocket.outputStream
while (true) {
try {
inStream!!.read(buffer)
} catch (e: IOException) {
println(e)
break
}
}
}
}
当我测试我的设备和 realterm 应用程序之间的连接时,我能够看到所有数据。上面的应用程序只能接收大约 80% 的数据。我确定这不是设备的故障,因为我能够在实时应用程序中看到所有数据。我试过的:
1) 在读取方法之前/之后添加睡眠
2) 将 inputStream 包装到缓冲流中
3) 使用 inStream!!.readBytes() 而不是 inStream!!.read(buffer) -> 线程在此方法上冻结(内部调用读取方法()) 4)使用可用方法()检查可用数据,但它给了我不正确的结果 - 即当流即将结束时,它显示有 50 个字节可用,但实际上我看到缓冲区中有 200 个字节可用。 ..无论如何,根据文档,我永远不应该依赖这种方法。
5) 使用来自 apache commons 的 IOUtils 和来自 guava 的 Bytestreams -> 结果与第三点相同,线程冻结
6) 更改缓冲区的大小:尝试 1、10、100、256、512、1024、10000 7
问题是:输入流中的数据是否可能丢失?