Android 如何检测蓝牙何时完成读取?

Android 如何检测蓝牙何时完成读取?,android,bluetooth,Android,Bluetooth,我正在使用Android Studio,目前的任务是使用蓝牙连接外围设备并读取从远程设备发送的数据。一切正常,但这些数据是一块一块来的,当InputStrem完成读取时,如何处理 private class ConnectedThread extends Thread { private BluetoothSocket mSocket; private InputStream mInStrem; public ConnectedThread(BluetoothSocke

我正在使用Android Studio,目前的任务是使用蓝牙连接外围设备并读取从远程设备发送的数据。一切正常,但这些数据是一块一块来的,当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());
            }
        }
    }
}
这是传输的数据,我如何才能仅获取“E2005175880D0242236024C9”此字符串?

蓝牙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);
}

我想使用Thread.sleep()等待数据进入一个字符串。有可能丢失任何字符吗?理论上,您肯定会丢失数据。这是一个无限的数据流,缓冲区有限。但在实践中,如果你只睡了一小部分的时间,它就会起作用。我不知道细节。所以你必须测试它。我已经测试过好几次了,我试了2秒钟,效果很好,但我担心会丢失字符:/但是我认为2秒钟就足够扫描NFC标签了。
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);
}