【发布时间】:2020-07-03 15:26:11
【问题描述】:
我正在为必须通过蓝牙与其他设备通信的 Android 设备编写应用程序。 (另一个设备只是一个板子,比如带有蓝牙的 Raspery pi)
这个其他设备接受命令列表,我是单字节,如“A”、“X”、“C”等,当您发送命令时,它总是返回一些响应,如“OK”、“ERROR4”或其他数据,例如“0000000000000001230120000000”。
我已经在我的应用程序中实现了大部分命令并且它们运行良好。但是我对最后一个返回 1748 字节的命令有疑问。大多数时候我都在使用这种方法来获得响应,并且效果很好:
private String send(byte [] bytes) {
if(bluetoothService == null)
return null;
if(bluetoothSocket == null)
return null;
String line = "";
Log.wtf("BYTESARR", Arrays.toString(bytes));
try {
OutputStream outputStream = bluetoothSocket.getOutputStream();
InputStream inputStream = bluetoothSocket.getInputStream();
outputStream.write(bytes);
outputStream.flush();
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream));
line = r.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
但是对于响应为 1748 字节的命令,方法高于冻结我的应用程序。所以我只为那个命令实现了第二种方法,你在下面看到。
OutputStream outputStream = bluetoothSocket.getOutputStream();
InputStream inputStream = bluetoothSocket.getInputStream();
outputStream.write(bytes);
outputStream.flush();
char [] b = new char[1540];
BufferedReader r = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
int from = 0;
for(int i = 0; i < EXCEPTIONS_NUMBER; i++){
int asdf = r.read(b, from, 50); // from and len are related to B not R
Log.wtf("READ", asdf + " <");
from += asdf;
}
line = new String(b);
Log.wtf("LINE", line);
但该方法的问题是我的响应如下所示:(
...0000000000000������������...
这个响应的不到一半是 0(零),这是我所期望的,但是这个响应的第二部分是那些奇怪的问号(我认为应该是零),我不知道为什么会这样?
问题 1)为什么当我读取 1748 字节的响应时,第一种方法让我的应用程序冻结? 问题 2) 为什么第二种方法给我的是奇怪的问号而不是零?
编辑 [已解决]
我找到了解决方案。所以基本上我必须像这样使用ByteArrayInputStream:
byte [] b = new byte[1538];
ByteArrayInputStream bais = new ByteArrayInputStream(b);
inputStream.read(b);
这允许我从b 数组中读取所有bytes,并允许我在需要时使用bais。我不确定为什么这个解决方案有效。但我很高兴它奏效了。如果有人理解它并且可以解释会很棒。如果没有,我会更新帖子,当找出它为什么工作时,如果帖子不会被关闭/删除。
【问题讨论】:
-
.readLine() 尝试读取一行。您可以发送 1768 个字节,然后让最后一个字节成为换行符 '\n'。
-
是的,我明白这一点,但对我来说很奇怪它适用于其他命令。每个命令的响应格式都是相同的,至少我在文档中读过。
标签: java android inputstream