Потеря данных в inputStream при получении данных через Bluetooth HC-05 в Android - PullRequest
1 голос
/ 11 марта 2019

Я не могу получить все данные из inputtream при подключении через bluetooth hc-05 в моем приложении для Android.Вот мой код:

        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()

Код моего подключенного потока:

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
        }

    }
}

}

Когда я тестировал соединение между моим устройством и приложением реального мира, я смог увидетьвсе данные.Приложение выше способно получать только около 80% данных.Я уверен, что это не ошибка устройства, потому что я могу видеть все данные в реальном приложении.Что я пробовал:

1) Добавить метод сна до / после чтения
2) обернуть inputStream в буферизованный поток
3) использовать inStream !!. ReadBytes () вместо inStream !!.read (buffer) -> поток завис на этом методе (внутри был вызов метода read ()) 4) проверка доступных данных с помощью метода method (), но это дало мне неверные результаты - то есть когда поток заканчивался, онпоказывает, что доступно 50 байт, но на самом деле я видел, что в буфере было доступно 200 байт ... В любом случае, согласно документации, я никогда не должен полагаться на этот метод.
5) Использовал IOUtils из apache commons & Bytestreams из guava ->результат такой же, как в 3-й точке, замораживание потока
6) Изменен размер буфера: пробовал 1, 10, 100, 256, 512, 1024, 10000 7

Вопрос: возможна ли потеряданные в inputStream?

...