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