2016-03-21 8 views
0

Я использую малину Pi для получения UID некоторых RFID-карт от считывателя RC522. Сценарий python, который я запускаю, находится здесь: https://github.com/mxgxw/MFRC522-pythonJava-запуск скрипта Python и непрерывного вывода монитора

По различным причинам я не буду заниматься, я должен обработать эти идентификаторы на Java.

Кажется, наиболее жизнеспособным решением является запуск сценария python и чтение результата в Java. Проблема в том, что код Python дает непрерывный вывод, , то есть он распечатает идентификатор карты в окне консоли, когда и когда карта будет прослушиваться на считывателе и будет завершена только по команде пользователя.

Я в настоящее время использую ProcessBuilder для выполнения сценария, однако, похоже, что это больше подходит для запуска программы и чтения в непосредственном результате обратно в Java (что, конечно, нуль, если я не постучал карту на считыватель). Я пытался выполнять код в некоторое время (правда) цикл непрерывно начать процесс - но это не работает:

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/улове, чтобы увидеть, если есть что-нибудь вообще бросают, и это, кажется, не быть в случае

ответ

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

Выполнено хакерское обходное решение, но я возвращаю свой ответ, потому что это все еще дает мне очень полезные советы, поэтому спасибо! – MWoot

0

Мне удалось обойти это, отредактировав мой скрипт Python - он возвращает null, если на устройстве нет карты, а UID - если есть.

Возможно, я использую шаблон наблюдателя или аналогичный на конце Java, чтобы обнаружить, когда есть карта. Очень ресурсоемкий, но это нужно сделать сейчас!