# Werte von Python an Java senden



## Elias177 (4. Sep 2018)

Guten Tag,

ich habe einen RPI und an diesen ist ein RFID-RC522 Card Reader angschlossen und der funktioniert auch super. Doch möchte ich die String die dort herauskommen gerne an ein Java Programm übergeben. Ich habe es bereits mit einer Sockets verbindung versucht doch habe es nicht hinbekommen habt ihr eine Idee ?

RFID-RC522 Read.py

```
#!/usr/bin/env python
# -*- coding: utf8 -*-
#
#    Copyright 2014,2018 Mario Gomez <mario.gomez@teubi.co>
#
#    This file is part of MFRC522-Python
#    MFRC522-Python is a simple Python implementation for
#    the MFRC522 NFC Card Reader for the Raspberry Pi.
#
#    MFRC522-Python is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Lesser General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    MFRC522-Python is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Lesser General Public License for more details.
#
#    You should have received a copy of the GNU Lesser General Public License
#    along with MFRC522-Python.  If not, see <http://www.gnu.org/licenses/>.
#

import RPi.GPIO as GPIO
import MFRC522
import signal

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()

# Welcome message
print "Welcome to the MFRC522 data read example"
print "Press Ctrl-C to stop."

# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
   
    # Scan for cards   
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

    # If a card is found
    if status == MIFAREReader.MI_OK:
        print "Karte gefunden"
   
    # Get the UID of the card
    (status,uid) = MIFAREReader.MFRC522_Anticoll()

    # If we have the UID, continue
    if status == MIFAREReader.MI_OK:

       
       
        # Print UID
        print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
       
       
       
        # This is the default key for authentication
        key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
       
        # Select the scanned tag
        MIFAREReader.MFRC522_SelectTag(uid)

        # Authenticate
        status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)

        # Check if authenticated
        if status == MIFAREReader.MI_OK:
            MIFAREReader.MFRC522_Read(8)
            MIFAREReader.MFRC522_StopCrypto1()
        else:
            print "Authentication error"
```

MFG

Elias177


----------



## httpdigest (4. Sep 2018)

Außer dich mit dem MFRC522 zu verbinden, machst du doch gar nichts mit Sockets in diesem Script...
Was hast du denn bisher probiert und wo sieht man das? In dem Script - was auch irgendwie von wo herkopiert aussieht - jedenfalls nicht.


----------



## dzim (5. Sep 2018)

Am einfachsten wäre wohl, wenn deine Java-Anwendung ein kleiner Server ist. 
Gibt genügend Microframeworks dafür, siehe hier: https://www.e4developer.com/2018/06/02/the-rise-of-java-microframeworks/

Die könnten ein ReST-Interface für JSON oder Plain-Text-Daten bereitstellen (und sogar nur auf Localhost hören). In Python musst du dann "nur" noch einen entsprechenden Request (POST, PUT, ...) an den Server senden, et voila - fertig.

Oder: Ein Java-Programm kann über Runtime#exec oder ProcessBuilder (Java 8, vorausgesetzt, Python ist installiert) Python ausführen und das Programm kann einfach die Daten auf die Konsole schreiben. Mit ProcessBuilder ist es recht einfach auch den OutputStream des gestarteten Prozesses zu bekommen.

Ich glaube mit Java 9 wurde etwas am Process-Zeug angepasst, aber es sollte immer noch klappen. Mit der GraalVM steht auch eine Variante von Java (kostenlos aber nur für Linux-Systeme) zur Verfügung, dass *irgendwie* (ich habe es noch nicht probiert, daher kenn ich das Procedere nicht genau) auch Python direkt auf der JVM ausführen kann.

Zusammenfassend würde ich aber Variante 1 (Microframework -> lokaler Mini-Server) bevorzugen.


----------



## Elias177 (7. Sep 2018)

Okay, aber auf der genanten seite steht nichts wie ich dass dann mit Python mache !


----------



## dzim (7. Sep 2018)

Das ist das Java-Forum, hier gibt's die Java-Hilfe. 
Google ist dein Freund: Du kannst dann an den lokal laufenden Java-Server ein POST-Request absetzen. 

https://stackoverflow.com/questions/11322430/how-to-send-post-request

Also eine vollständige Implementierung gibt es von mir jetzt hier aber nicht.


----------



## Elias177 (18. Sep 2018)

Jabe jetzt für beides etwas geschrieben doch es passiert nichts 


```
import httplib, urllib
body = r'{"jsondatastr":["data"],"action":["getbacon"]}'
headers = {"Content-type": "application/json", "Accept": "text/plain"}
conn = httplib.HTTPSConnection("server.com:8443")
conn.request("POST", "/kitchen/query", body, headers)
response = conn.getresponse()
print response.status, response.reason200
data = response.read()
conn.close()
```


```
package de.elias.viki.manager;

import java.io.BufferedReader;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.json.JSONException;
import org.json.JSONObject;

public class POST {

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        StringBuffer jb = new StringBuffer();
        String line = null;
        try {
            BufferedReader reader = request.getReader();
            while ((line = reader.readLine()) != null)
                jb.append(line);
                System.out.println(line);
        } catch (Exception e) {
            e.printStackTrace();
        }

        try {
            JSONObject jsonObject = new JSONObject(jb.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }


    }

}
```


----------



## dzim (18. Sep 2018)

Ähm... Du lädst die JS-Datei als JSON und erstellst ein JSONObject. Was soll da passieren? JSONObject ist nur eine Datenhalde, die dir den einfachen Zugriff auf JSON-Daten aus Java heraus ermöglicht. Sonst nichts.

Und wenn du etwas derart primitives wie einen POST absetzen möchtest, warum dann nicht von Java aus?

Z.B. hier beschrieben
https://stackoverflow.com/questions/3324717/sending-http-post-request-in-java

Es gibt die in Java eingebauten Methoden (die Http(s)UrlConnection-Klasse, oder HttpClient ab Java 9+) und gefühlt duzende gute Bibliotheken, die das machen können:
Apache HttpCommons: https://hc.apache.org/
OkHttp: http://square.github.io/okhttp/ (gleich mit Beispielen für Post)

Und hast du dir unsere Vorschläge überhaupt durchgelesen? Wenn ja, wären dort einige Varianten drin, wie du JS evaluieren hättest können (sprich: ausführen).


----------



## Elias177 (18. Sep 2018)

Weil ich möchte das Python daten an Java sendet


----------



## dzim (18. Sep 2018)

Alter sorry, das ist mir zu verwirrend, da es immer JS am Anfang hiess (und ja, ich hab übersehen, dass der Code oben Python ist).
Du hast nun eine Methode, die etwas tun soll (dem Namen nach setzt sie einen Post-Request ab). Aber anscheinend soll sie nicht Sender, sondern Empfänger sein.
In dem Fall kannst du ein möglichst schlankes Microframework verwenden und dort einen Server, der Daten entgegen nehmen kann, implementieren. Aber auch darüber habe ich bereits geschrieben, deswegen wiederhole ich das jetzt hier nicht mehr.

Idealerweise überlegst du noch einmal a) was du willst und b) wie du es so beschreiben kannst, dass jedermann dich versteht und nicht an deinen wenigen und ungenauen Beschreibungen verzweifelt.


----------



## Elias177 (21. Sep 2018)

Also jetzt nochmal im klaren.
Ich möchte daten die von einem NFC Card Reader ausgelesen werden von Python an Java übergeben so dass ich dan die ganzen werte in Java habe.

MFG

Elias177


----------



## dzim (22. Sep 2018)

dzim hat gesagt.:


> Am einfachsten wäre wohl, wenn deine Java-Anwendung ein kleiner Server ist.
> Gibt genügend Microframeworks dafür, siehe hier: https://www.e4developer.com/2018/06/02/the-rise-of-java-microframeworks/
> 
> Die könnten ein ReST-Interface für JSON oder Plain-Text-Daten bereitstellen (und sogar nur auf Localhost hören). In Python musst du dann "nur" noch einen entsprechenden Request (POST, PUT, ...) an den Server senden, et voila - fertig.


----------



## mihe7 (22. Sep 2018)

Normalerweise empfehle ich das nicht, aber da es im Endeffekt nur einen Client gibt, wäre eine eigene Server-Implementierung durchaus ein gangbarer Weg. Beispiele dafür gibt es wie Sand am Meer, z. B. https://de.wikibooks.org/wiki/Java_Standard:_Socket_und_ServerSocket_(java.net)

Davon und der Python-Doku abgeleitet:

```
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(8084);
        Socket client = ss.accept();
        try(BufferedReader reader = new BufferedReader(
                new InputStreamReader(client.getInputStream()))) {
            System.out.println(reader.readLine());
        }
    }
}
```
bzw.

```
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("localhost", 8084))
s.send("1234567890\n")
```


----------



## Elias177 (23. Sep 2018)

Ich habe es mal getestet es funktioniert auch aber sobald ich es in das Script vom RFID Card Reader schreibe spuckt er errors aus 

Pythonscript:

```
#!/usr/bin/env python
# -*- coding: utf8 -*-
#
#    Copyright 2014,2018 Mario Gomez <mario.gomez@teubi.co>
#
#    This file is part of MFRC522-Python
#    MFRC522-Python is a simple Python implementation for
#    the MFRC522 NFC Card Reader for the Raspberry Pi.
#
#    MFRC522-Python is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Lesser General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    MFRC522-Python is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Lesser General Public License for more details.
#
#    You should have received a copy of the GNU Lesser General Public License
#    along with MFRC522-Python.  If not, see <http://www.gnu.org/licenses/>.
#

import RPi.GPIO as GPIO
import MFRC522
import socket
import signal

continue_reading = True

# Capture SIGINT for cleanup when the script is aborted
def end_read(signal,frame):
    global continue_reading
    print "Ctrl+C captured, ending read."
    continue_reading = False
    GPIO.cleanup()

# Hook the SIGINT
signal.signal(signal.SIGINT, end_read)

# Create an object of the class MFRC522
MIFAREReader = MFRC522.MFRC522()

# Welcome message
print "Welcome to the MFRC522 data read example"
print "Press Ctrl-C to stop."

# This loop keeps checking for chips. If one is near it will get the UID and authenticate
while continue_reading:
 
    # Scan for cards
    (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL)

    # If a card is found
    if status == MIFAREReader.MI_OK:
        print "Card detected"
 
    # Get the UID of the card
    (status,uid) = MIFAREReader.MFRC522_Anticoll()
 
    # If we have the UID, continue
    if status == MIFAREReader.MI_OK:
 
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(("localhost", 177))
        s.send("1234567890\n")
 
        # Print UID
        print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
    
 
        # This is the default key for authentication
        key = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
    
        # Select the scanned tag
        MIFAREReader.MFRC522_SelectTag(uid)

        # Authenticate
        status = MIFAREReader.MFRC522_Auth(MIFAREReader.PICC_AUTHENT1A, 8, key, uid)

        # Check if authenticated
        if status == MIFAREReader.MI_OK:
            MIFAREReader.MFRC522_Read(8)
            MIFAREReader.MFRC522_StopCrypto1()
        else:
            print "Authentication error"
```

Error:

```
pi@raspberrypi:~/Desktop $ sudo python Read.py
  File "Read.py", line 69
    print "Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3])
                                                                        ^
IndentationError: unindent does not match any outer indentation level
pi@raspberrypi:~/Desktop $
```


----------



## mihe7 (23. Sep 2018)

Diesbezüglich wirst Du in einem Python-Forum besser aufgehoben sein.


----------

