Как определить, когда Bluetooth заканчивает чтение? - PullRequest
0 голосов
/ 01 июля 2019

Я работаю с Android Studio, и моя текущая задача - подключить периферийное устройство с помощью Bluetooth и прочитать данные, отправленные с этого удаленного устройства.Все работает хорошо, но эти данные поступают по частям, и как можно обрабатывать, когда InputStrem заканчивает чтение?

private class ConnectedThread extends Thread {
    private BluetoothSocket mSocket;
    private InputStream mInStrem;

    public ConnectedThread(BluetoothSocket socket) {
        mSocket = socket;
        InputStream tmpIn = null;

        try {
            tmpIn = mSocket.getInputStream();
        } catch (IOException e) {
            Log.e(TAG, e.getMessage().toString());
        }

        mInStrem = tmpIn;
    }


    public void run() {
        mBuffer = new byte[1024];
        int numBytes;

        while (true) {
            try {
                numBytes = mInStrem.read(mBuffer);
                String str = new String(mBuffer, 0, numBytes);
            } catch (IOException e) {
                Log.e(TAG, e.getMessage().toString());
            }
        }
    }
}
CS:
.iv
EP: E2005175880D0242236024C9
OK:
C
.iv
ME: N
o Transponder found
ER:005

Это переданные данные, и как я могу получить только 'E2005175880D0242236024C9' эту строку?

1 Ответ

1 голос
/ 01 июля 2019

Bluetooth SPP (профиль последовательного порта) представляет собой бесконечный поток данных (точнее, два потока - по одному в каждом направлении).Поток заканчивается, когда соединение закрыто.

Если ваши данные нужно разделить на четко определенные пакеты, вы должны реализовать их самостоятельно.Вам понадобится какой-нибудь разделитель пакетов или помеченный конец пакета.

Типичные отметки:

  • Разрыв строки (CR, LF или CR / LF), если выиметь текстовый протокол
  • Некоторый символ или последовательность символов, которые иначе не появляются в пакетах
  • Тайм-аут, т.е. предполагается начало нового пакета, если в течение 100 мс не было передано никаких дополнительных данных

Похоже, что вы имеете дело с текстовым протоколом и можете использовать разрыв строки в качестве разделителя.Если это так, код может выглядеть следующим образом:

try (InputStreamReader isr= new InputStreamReader(mInStrem, StandardCharsets.ASCII);
        BufferedReader reader = new BufferedReader(isr)) {
    String line = reader.readLine();
    // do something with line

} catch (IOException e) {
    throw new RuntimeException(e);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...