保存btmon输出

时间:2016-04-15 07:56:07

标签: java linux save raspberry-pi bluez

这是我在这里发表的第一篇文章,虽然我已经在这里读了很长时间了。)

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

我的Raspberry Pi上的btmon命令有点问题。我们计划的完整结构如下:

  1. 扫描蓝牙设备(iBeacons)
  2. 保存输出结果< ----这是问题
  3. 过滤所需数据
  4. 发送到服务器节点
  5. 由于这是我们正在构建的程序的一部分,因此命令通过执行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,但将其保存为文件也可以使用!

    提前致谢! :)

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,花了很多天才解决这个问题。关键点是Thread,而不使用&。这是我发现的:

  • &字面意思在后台运行。将sudo btmon &更改为sudo btmon

  • 使用线程。

    • 线程1 - 启动btmon(你可以得到这个线程的结果)
    • 线程2 - 启动hcitool lescan

(btmon应该首先 - 因为“lescan”发生hci事件所以btmon可以得到它们)摘要 - 不要使用&并使用独立的线程。