私はRC522リーダーからいくつかのRFIDカードのUIDを受け取るためにラズベリーパイを使用しています。私が実行しているPythonスクリプトはここにあります:https://github.com/mxgxw/MFRC522-pythonJava実行のPythonスクリプトとモニタ連続出力
私はこれらのIDをJavaで処理する必要があります。
Pythonスクリプトを実行して結果をJavaに読み込むのが最も実用的な解決策だと思われます。問題は、Pythonコードがの連続の出力、、すなわちであることです。つまり、カードがリーダーにタップされたときにカードのIDがコンソールウィンドウに表示され、ユーザーのコマンドでのみ終了します。
私は現在、スクリプトを実行するためにProcessBuilderを使用していますが、プログラムを実行し直ちに結果をJavaに戻すのに適しているようです(もちろん、nullです)。タップしていない場合はカードをリーダに載せる)。私は継続的にプロセスを開始するまでに(真の)ループ内でコードを実行しようとした - しかし、これは動作しません:
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さん。
大変感謝します!
おかげ
EDIT - 私がスローされるすべてのものがありますかどうかを確認するためのtry/catchで私のコードを囲まれてきた、そして私が使用した場合
こんにちは、これまでのご協力ありがとうございます! 私はあなたのソリューションを複製しました。これはtest.pyには完全に機能します。実際のプログラムに置き換えても、コンソールには "Process Started ..."以外の何も表示されません..... なぜなら、コマンドラインからRead.pyを実行すると、問題なく出力されてしまうからです。 – MWoot
ハックの回避策を実行しましたが、それでも私はいくつかの非常に役に立つヒントを与えられているので、あなたの答えをアップ投票しています。 – MWoot