这是我在这里发表的第一篇文章,尽管我已经在这里阅读内容很长一段时间了:)
我目前正在撰写计算机科学学士学位论文,其中我们正在使用 iBeacons 和蓝牙进行室内定位。由于智能手机的复杂性,“被发现”的设备目前是 Raspberry Pi。
我的 Raspberry Pi 上的 btmon 命令遇到了一些问题。我们程序的完整结构如下:
- 扫描蓝牙设备 (iBeacons)
- 保存输出结果<----这就是问题
- 过滤所需数据
- 发送到服务器节点
由于这是我们正在构建的程序的一部分,因此命令是通过执行终端命令的 Java 代码执行的,并将输出作为字符串返回。该方法如下所示:
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 运行时,但未能成功,并且我一直在尝试将 ProcessBuilder 与 inheritIO()
一起使用来更改其输出源,但无法获取工作要么...
到目前为止,我已经在谷歌上搜索了几天,并且遇到了一些我无法运行的 Python 脚本(可能是因为我以前从未使用过 Python ^^) .
那么,简而言之:如何保存 sudo btmon 和 sudo hcitool lescan
的输出?最好通过 Java 代码转换为字符串,但将其保存为文件也可以!
提前致谢! :)
最佳答案
我也遇到了同样的问题,花了很多天才解决这个问题。关键点是 Thread
而不是使用 &
。这是我的发现:
&
实际上在后台运行。将sudo btmon &
更改为sudo btmon
使用线程。
- 线程1 - 启动btmon(你可以得到这个线程的结果)
- 线程 2 - 启动 hcitool lescan
(btmon 应该首先 - 因为“lescan”发生 hci 事件,因此 btmon 可以获取它们)摘要 - 不要使用 &
并使用独立线程。
关于java - 保存 btmon 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36641380/