2016-03-21 44 views
0

我正在使用Raspberry Pi從RC522閱讀器接收某些RFID卡的UID。我正在運行的Python腳本在這裏:https://github.com/mxgxw/MFRC522-pythonJava - 運行Python腳本和監視器連續輸出

由於各種原因,我不會進入,我必須在Java中處理這些ID。

看來最可行的解決方案是運行python腳本並將結果讀入到Java中。問題是,Python代碼給出連續輸出輸出,它將打印卡的ID到控制檯窗口中,並且當卡片被輕敲到讀取器上時,並且將僅在用戶的命令上終止。

我目前使用的ProcessBuilder執行腳本,但現在看來似乎更適合於運行程序,並在不久的結果讀回Java(當然這是如果我不被竊聽卡上的讀卡器)。我試着在一段時間(true)循環,不斷啓動進程執行的代碼 - 但是,這並不工作:

import java.io.*; 

public class PythonCaller { 

    /** 
    * @param args 
    * @throws IOException 
    */ 
    public static void main(String[] args) throws IOException { 
     // set up the command and parameter 
     String pythonScriptPath = "/home/pi/MFRC522-python/Read.py"; 
     String[] cmd = new String[3]; 
     cmd[0] = "sudo"; 
     cmd[1] = "python"; // check version of installed python: python -V 
     cmd[2] = pythonScriptPath; 

     // create runtime to execute external command 
     ProcessBuilder pb = new ProcessBuilder(cmd); 

     // retrieve output from python script 
     pb.redirectError(); 

     while(true){ 
      Process p = pb.start(); 
      System.out.println("Process Started..."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      int ret = new Integer(in.readLine()).intValue(); 
      System.out.println("value is : "+ret); 
      } 
     } 
} 

在控制檯窗口中的輸出是空白 - 沒有拋出異常,的println的。

任何幫助將大規模讚賞!

感謝

編輯 - 我已經包圍我的代碼在try/catch來看看有沒有在所有的東西被拋出,它似乎並沒有被

回答

1

我使用的情況下以下程序嘗試重現該問題

PythonCaller.java

import java.io.*;  
public class PythonCaller { 

    public static void main(String[] args) throws IOException { 
     // set up the command and parameter 
     String pythonScriptPath = "/home/pi/test.py"; 
     String[] cmd = { "python", pythonScriptPath }; 

     // create runtime to execute external command 
     ProcessBuilder pb = new ProcessBuilder(cmd); 

     // retrieve output from python script  
     pb.redirectError(); 

     while(true){ 
      Process p = pb.start(); 
      System.out.println("Process Started..."); 
      BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
      int ret = new Integer(in.readLine()).intValue(); 
      System.out.println("value is : "+ret); 
     } 
    } 
} 

test.py

uid =(123,456,789,999) 
print "Card read UID: "+str(uid[0])+","+str(uid[1])+","+str(uid[2])+","+str(uid[3]) 
  1. pb.redirectError()沒有任何修改的方法。它返回一個值,你的代碼不會對它做任何事情。 (見http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectError%28%29)。你想要的可能是redirectErrorStream(boolean redirectErrorStream)

  2. Python測試程序的第二行是直接從「Read.py」(第44行)。它會導致java intValue()方法發生錯誤。如果我用String ret = in.readLine();替換它,該程序似乎工作。

  3. 由於Process p = pb.start();位於循環內部,所以重複調用python子程序。

下一步應該是嘗試在控制檯中手動運行python程序,看看它做了什麼。 (n.b.我不得不刪除「sudo」並更改路徑以便能夠在我的系統上測試,您應該沒有問題替換您的設置)。

+0

嗨,感謝您的幫助! 我複製了你的解決方案,它完美地適用於test.py - 用實際的程序代替它仍然不會在控制檯上顯示「Process Started ...」以外的任何內容..... 奇怪的是因爲從命令行運行Read.py本身會產生所需的輸出而不會出現問題...... – MWoot

+0

完成了一個hacky的解決方法,但我對upvoting您的答案,因爲這仍然給了我一些非常有用的提示,所以謝謝! – MWoot

0

我已經設法通過編輯我的Python腳本來解決它 - 如果讀卡器上沒有卡,則返回null,如果有,則返回UID。

我可能會在Java端使用觀察模式或類似方法來檢測何時有卡。非常資源密集型,但它現在必須做!