我正在使用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'这个字符串?
答案 0 :(得分:1)
蓝牙SPP(串行端口配置文件)是无限的数据流(或者说是两个流-每个方向一个)。关闭连接后,流结束。
如果需要将数据拆分为定义明确的数据包,则必须自己实现。您将需要某种类型的数据包分隔器或标记为数据包的结尾。
典型标记是:
似乎您正在处理文本协议,并且可以使用换行符作为分隔符。如果是这样,代码可能看起来像:
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);
}