2016-03-21 21 views
0

Bir RC522 okuyucusundan bazı RFID kartlarının UID'sini almak için bir Raspberry Pi kullanıyorum. Çalıştığım python betiği: https://github.com/mxgxw/MFRC522-pythonJava - Python komut dosyasını çalıştırın ve sürekli çıkışı izleyin

Çeşitli nedenlerden dolayı, bu kimlikleri Java'da işlemek zorundayım.

En uygun çözüm, python betiğini çalıştırmak ve sonuçta Java'ya okumaktır. Sorun, Python kodunun sürekli çıktısını, , yani vermesini, kartın kimliğini okuyucuya takıldığı zaman kartın kimliğine basacak ve sadece bir kullanıcının komutunda sona erecektir.

daha uygundur gibi programı çalıştırmak ve ben aday değil eğer tabii boş olan Java (anında sonuç geri okumayı Şu anda, senaryoyu yürütmek için bir ProcessBuilder kullanıyorum ancak öyle görünüyor okuyucuya bir kart). Ben sürekli işlemini başlatmak için bir süre (doğru) döngü kodu uygulamadan denedim - ama bu işe yaramazsa:

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); 
      } 
     } 
} 

konsol penceresinde çıktı boştur - hayır atılan istisnalar veya println en.

Her türlü yardım büyük bir takdirle karşılanacaktır!

Teşekkür

DÜZENLEME - Ben atılan hiç bir şey varsa görmek için bir try/catch kodumu çevrili ettik ve

cevap

1

kullandığım durumda görünmüyor aşağıdaki programlar problemi

PythonCaller.java yeniden denemek için

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. şey değiştirmez pb.redirectError() yöntemi. Bir değer döndürür, kodlarınız onunla hiçbir şey yapmaz. (bakınız http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectError%28%29). İstediğiniz, muhtemelen "Read.py" den (44. satır) python test programının ikinci satırı alınır. Java intValue() yöntemiyle bir hataya neden olur. String ret = in.readLine(); ile değiştirirsem, program çalışır gibi görünüyor.

  2. Process p = pb.start(); döngü içinde olduğundan, python alt programı tekrar tekrar denir.

Bir sonraki adım, bir konsolda python programını el ile çalıştırmayı denemek olmalıdır, ne yaptığını görün.

(n.b. "sudo" yu kaldırmam ve sistemimde test edebilmek için yolları değiştirmem gerekti, kurulumunuz için bir şeyleri değiştirirken sorun yaşamanız gerekmedi).

+0

Merhaba, yardımlarınız için şimdiye kadar teşekkürler! Çözümünüzü çoğaltdım ve test.py için mükemmel bir şekilde çalışıyor - gerçek programla değiştirilmeye devam etmek, yine de "Proses Başla ..." dışında bir şey göstermiyor ..... Çünkü komut satırından Read.py komutunu çalıştırırsanız sorun çıkarmadan istediğiniz çıktıyı üretir ...... – MWoot

+0

Hayal kırıklığına uğramış bir çözüm yolladım ama cevabınızı kaldırıyorum çünkü bu bana hala çok yararlı ipuçları veriyor, teşekkürler! – MWoot

0

Python betiğimi düzenleyerek etrafta dolaşmayı başardım - okuyucuda kart yokken null ve varsa UID döner.

Muhtemelen kartın ne olduğunu tespit etmek için Java ucunda gözlemci deseni veya benzerlerini kullanacağım. Çok kaynak yoğun ama şimdilik bunun için yapmak zorunda!

İlgili konular