2016-03-21 7 views
0

私は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で私のコードを囲まれてきた、そして私が使用した場合

答えて

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テストプログラムの2行目は、 "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

ハックの回避策を実行しましたが、それでも私はいくつかの非常に役に立つヒントを与えられているので、あなたの答えをアップ投票しています。 – MWoot

0

私はPythonスクリプトを編集して回避することができました。リーダーにカードがない場合はnullを返し、存在する場合はUIDを返します。

おそらくJavaエンドでオブザーバーパターンなどを使用して、カードがあるときを検出します。非常にリソース集約的ですが、今はやる必要があります!