RFID Reader für Raspberry

Hab es geschafft, aus den HEX Daten die über den RFID Leser reinkommen, die ID der Chipkarten zusammenzubauen.

Danke an Euch!

Gruß,
Christoph

Guten Abend

Ich habe hier einen RC522 RFID und einen Raspberry Pi.
Würde gern mittels Karten die Ab/Anwesenheit von Personen auf IPS Tracken.
Sprich, Person A kommt -> Skript A ausführen.
IPS läuft auf einem Server in meinem Netzwerk.
Gibt es hier Beispiele wie ich von Phyton Befehle per WebHook an IPS schicke?

Würde mich freuen, bin im Programmieren keine eins.

Grüße

Das wäre eine tolle Sache. Würde mich auch interessieren. Ich möchte mir auch so einen Leser basteln.

Ich hatte vor einiger Zeit mit dem Linux-Tool „netcat“ gute Erfahrungen (Werte der Temperaturmessung über 1-Wire vom PI an IPS übertragen) gemacht. Wenn ich mich recht entsinne, hatte ich dafür am IPS-Rechner in der Firewall einen Port und im IPS einen Server-Socket eingerichtet. Damit konnte ich z.B. von der Konsole des PIs per nc Daten an das IPS schicken und da auswerten.

Webhook wäre sicherlich charmanter. Allerdings ist ja auch Symcon auf dem PI lauffähig. Und wenn man die ID der Karte aus dem Python-Output in das lokale IPS bekäme, fände ich das noch besser.

Hat dazu jemand Ideen oder es sogar umgesetzt?

Nach vielem Probieren und einigen Stunde später bin in dieser Sache etwas weiter gekommen:

Zunächst habe den Code der ursprünglichen Read.py etwas gekürzt:

#!/usr/bin/env python
# -*- coding: utf8 -*-

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 "Beispielscript zum Auslesen der IDs von RFID-Tags mittels MFRC522-Leser"
print "Drücke Ctrl-C zum Abbrechen."

# 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:

        # Print UID
        card_id = str(uid[0])+str(uid[1])+str(uid[2])+str(uid[3])
        print
        print "erkannte Tag-ID: "+card_id



Auf der Linux-Konsole kann ich mir mittels

sudo python Read.py

die ID meines Transponders anzeigen:

pi@raspberrypi:~/MFRC522-python $ sudo python Read1.py
Beispielscript zum Auslesen der IDs von RFID-Tags mittels MFRC522-Leser
Drücke Ctrl-C zum Abbrechen.

erkannte Tag-ID: 3811636217

erkannte Tag-ID: 3811636217

erkannte Tag-ID: 3811636217

erkannte Tag-ID: 3811636217

erkannte Tag-ID: 3811636217

erkannte Tag-ID: 3811636217

Dabei ist mir aufgefallen, dass bei zu langem Verweilen des Tags vor dem Leser der Lesevorgang mehrmalig ausgegeben wird. Das kann man verhindern, indem man in die Schleife für das Auslesen ein

time.sleep(5)

einfügt (hier 5 Sekunden). Dafür muss oben noch das Modul „time“ importiert werden:

import time

Die ID wird in der Variablen „card_id“ gespeichert und auf der Konsole ausgegeben. Wir möchten diesen Wert nun per Webhook ans IPS senden. Dafür muss das Modul „python-requests“ installiert und geladen werden:

sudo apt-get install python-requests
import requests

Nun können wir den HTTP-Request absetzen, bei dem wir die Tag-ID übertragen. (entsprechenden Webhook vorher auf dem IPS erstellen)

Das erstmal funktionierende Scritpt:

#!/usr/bin/env python
# -*- coding: utf8 -*-

import RPi.GPIO as GPIO
import MFRC522
import signal
import time
import requests

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 "Beispielscript zum Auslesen der IDs von RFID-Tags mittels MFRC522-Leser"
print "Drücke Ctrl-C zum Abbrechen."

# 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:

        # Ausgeben der ID auf der Konsole
        card_id = str(uid[0])+str(uid[1])+str(uid[2])+str(uid[3])
        print
        print "erkannte Tag-ID: "+card_id

        # HTTP-Request absetzen
        response = requests.get("http://192.168.99.99:82/hook/tag?tag_id="+card_id)

        # Verzögerung von 5 Sekunden bis zum nächsten Lesevorgang
        time.sleep(5)


Letzte Tat bis hierhin: das Read-Script muss noch reboot-sicher gemacht werden. Mittels

sudo nano /etc/rc.local

den Code

python /home/pi/test.py &

vor „exit 0“ einfügen

Der Code ist sicherlich einfach (und ggf. unsauber) gestrickt, aber als Python-Laie freue ich mich erstmal über die Funktion.:slight_smile:

1 „Gefällt mir“