2016-03-21 47 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端使用观察模式或类似方法来检测何时有卡。非常资源密集型,但它现在必须做!