如何检测蓝牙何时读完?

时间:2019-07-01 10:40:27

标签: android bluetooth

我正在使用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());
            }
        }
    }
}
CS:
.iv
EP: E2005175880D0242236024C9
OK:
C
.iv
ME: N
o Transponder found
ER:005

这是传输的数据,我怎么只能获取'E2005175880D0242236024C9'这个字符串?

1 个答案:

答案 0 :(得分:1)

蓝牙SPP(串行端口配置文件)是无限的数据流(或者说是两个流-每个方向一个)。关闭连接后,流结束。

如果需要将数据拆分为定义明确的数据包,则必须自己实现。您将需要某种类型的数据包分隔器或标记为数据包的结尾。

典型标记是:

  • 如果有文本协议,则换行符(CR,LF或CR / LF)
  • 包中没有出现的某些字符或字符序列
  • 如果100ms内没有进一步的数据传输,则认为是超时,即新数据包的开始

似乎您正在处理文本协议,并且可以使用换行符作为分隔符。如果是这样,代码可能看起来像:

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