1

通过我的安卓应用程序上的蓝牙 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

问题是:输入流中的数据是否可能丢失?

4

0 回答 0