【问题标题】:PI - reading data in java from python codePI - 从 python 代码中读取 java 中的数据
【发布时间】:2019-02-18 00:21:03
【问题描述】:

我有一个简单的 Python 代码,可以读取循环运行的 RFID 卡 每当我放一张卡片时,我都能看到它的数据。 我想循环运行代码 - 当我获得新数据(新卡)时,我会在我的 java 应用程序中看到它。

类似这样的:

12:13:10

12:13:20

12:13:30

12:13:40 - 找到卡,数据是 - “大卫卡”

12:13:50

12:14:00 - 找到卡,数据是 - “凯特卡”

有人可以帮忙吗?或者也许开始告诉我如何?我是 java 新手

python 文件是 Read.py,它来自这里 https://pimylifeup.com/raspberry-pi-rfid-rc522

谢谢,

这是显示每 10 秒打印一次的 Java 代码

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Show_Time
{
    private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");

    public static void main(String[] args)
    {
        while (true)
        {
            try{
                Date date = new Date();
                System.out.println(new Timestamp(date.getTime()));
                Thread.sleep(10000);
            }
            catch(InterruptedException ex)
            {
                Thread.currentThread().interrupt();
            }
            finally {}
        }

    }
}

【问题讨论】:

    标签: java python raspberry-pi integration


    【解决方案1】:

    两个程序之间有多种通信方式。例如,您可以创建客户端-服务器架构。但是,由于您是新手,我认为最快和最简单的方法是在两个应用程序之间共享一个公共文件。

    Python方面:

    with open('RFIDdata.txt', 'w') as the_file:
        the_file.write(rfid_data)
    

    Java方面:

    public static void main(String[] args) {
        BufferedReader reader;
        try {
            reader = new BufferedReader(new FileReader(
                    "RFIDdata.txt"));
            String line = reader.readLine();
            while (line != null) {
    
                Date date = new Date();
                System.out.println(new Timestamp(date.getTime())+" "+line);
                Thread.sleep(10000);
                // read next line
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    请注意,使用此解决方案,您必须手动执行这两个程序。另一个更清洁但更先进的选择可能是使用ProcessBuilder

    Python方面:

    print(rfid_data)
    

    Java方面:

    public static void main(String[] args) {
        BufferedReader reader;
        try {
             ProcessBuilder builder = new ProcessBuilder( "python" ,"/home/pi/MFRC522-python/Read.py"); 
             builder.redirectErrorStream(true); 
             Process p = builder.start(); 
             reader = new BufferedReader (new InputStreamReader(p.getInputStream()));
    
            String line = reader.readLine();
            while (line != null) {
    
                Date date = new Date();
                System.out.println(new Timestamp(date.getTime())+" "+line);
                Thread.sleep(10000);
                // read next line
                line = reader.readLine();
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    【讨论】:

    • 不错的想法 - 但也许我可以让文件自己覆盖它?每次有新设备?
    • 因为最终的项目会从卡中获取信息,添加一些数据,然后发送到我的服务器
    • 使用 'w'(写入)而不是 'a'(追加)打开文件,每次写入时以空文件开头。不过,我不确定读取过程(java)如何对突然删除的文件做出反应。但是python只能在文件不存在时写入文件并且缓冲挂起的ID,而java在读取文件后删除文件......(见docs.python.org/3/library/functions.html#open
    • 实际上,'w' 选项应该可以解决问题。 @David12123 你能检查一下它是否有效吗?我会相应地编辑答案
    • 我做了其他事情 - ProcessBuilder builder = new ProcessBuilder( "python" , "/home/pi/MFRC522-python/Read.py"); builder.redirectErrorStream(true);进程 p = builder.start(); BufferedReader r = new BufferedReader (new InputStreamReader(p.getInputStream()));现在我可以在java中看到响应-然后使用它-我认为它比文件更好,不是吗?谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多