这是我在这里发表的第一篇文章,虽然我已经在这里读了很长时间了。)
我目前正在攻读计算机科学的学士论文,我们正在用iBeacons和蓝牙进行室内定位。由于智能手机的复杂性,“被发现”设备目前是Raspberry Pi。
我的Raspberry Pi上的btmon命令有点问题。我们计划的完整结构如下:
由于这是我们正在构建的程序的一部分,因此命令通过执行terminal命令的Java代码执行,并将输出作为String返回。该方法如下所示:
private String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine()) != null) {
output.append(line + "\r\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
我在使用其他命令(例如ifconfig)时一切正常,因此该方法适用于普通命令,但我无法使用btmon。 我正在尝试运行的完整命令是:
sudo btmon & sudo hcitool lescan
在我看来,好像btmon作为一个不同的进程/运行时运行,这可以解释为什么上面的Java代码没有捕获它的输出。我一直试图“获取”btmon运行时但未能这样做,而且我一直在尝试使用带有inheritIO()
的ProcessBuilder来改变它的输出源但是无法使其工作。
到目前为止,我一直在谷歌搜索这几天了,我已经碰到了几个我无法工作的Python脚本(可能是因为我之前从未使用过Python ^^)
因此,简而言之:如何保存sudo btmon & sudo hcitool lescan
的输出?最好是通过Java代码的String,但将其保存为文件也可以使用!
提前致谢! :)
答案 0 :(得分:2)
我遇到了同样的问题,花了很多天才解决这个问题。关键点是Thread
,而不使用&
。这是我发现的:
&
字面意思在后台运行。将sudo btmon &
更改为sudo btmon
使用线程。
(btmon应该首先 - 因为“lescan”发生hci事件所以btmon可以得到它们)摘要 - 不要使用&
并使用独立的线程。