2016-04-15 213 views
1

這是我的第一篇文章在這裏,雖然我已經在這裏讀的東西相當長的一段時間:)保存btmon輸出

目前我在做計算機科學學士學位我的論文,我們正在做的Indoors-定位與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()來改變它的輸出源,但無法讓它工作...

到目前爲止,我一直在使用Google,並且遇到了一些Python腳本,我也無法工作(可能是因爲我以前從未使用過Python)。

因此,簡而言之:如何保存sudo btmon & sudo hcitool lescan的輸出?最好通過Java代碼對字符串進行處理,但將其另存爲文件也可行!

提前致謝! :)

回答

2

我得到了同樣的問題,並花了很多天來解決這個問題。關鍵點是Thread而不是使用&。這裏是我發現的:

  • &字面上在後臺運行。將sudo btmon &更改爲sudo btmon

  • 使用線程。

    • 線程1 - 啓動btmon(你可以導致此主題)
    • 線程2 - 啓動hcitool萊斯康

(btmon首先應該 - 因爲 「萊斯康」 發生HCI事件等等btmon可以得到它們)總結 - 不要使用&並使用獨立的線程。