java - 保存 btmon 输出

标签 java linux save raspberry-pi bluez

这是我在这里发表的第一篇文章,尽管我已经在这里阅读内容很长一段时间了:)

我目前正在撰写计算机科学学士学位论文,其中我们正在使用 iBeacons 和蓝牙进行室内定位。由于智能手机的复杂性,“被发现”的设备目前是 Raspberry Pi。

我的 Raspberry Pi 上的 btmon 命令遇到了一些问题。我们程序的完整结构如下:

  1. 扫描蓝牙设备 (iBeacons)
  2. 保存输出结果<----这就是问题
  3. 过滤所需数据
  4. 发送到服务器节点

由于这是我们正在构建的程序的一部分,因此命令是通过执行终端命令的 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/

相关文章:

VB.net : How can I prompt a user if they are about to close their program with unsaved data?

java - 一个 Java 文件中的多个枚举类 2

java - 在方法java中进行转换

java - 我的 java 连接返回服务器连接失败

linux - 从终端运行 emacs 作为单独的进程

C# 图像裁剪、拆分、保存

java - 从 csv 文件的 1 列中删除前导零

linux - 删除 Linux 中除最新文件之外的所有 .csv 文件

linux - bash 中的字符串替换 - 错误替换错误

python - 如何从电子邮件中下载附件并保留原始文件名?使用 Python/展望