Kampis Elektroecke

RFID

Raspberry Pi

Hier zeige ich, wie ein RFID Modul mitsamt der entsprechenden Tags an den Raspberry Pi angeschlossen und genutzt werden kann.

Die Schaltung:

Da das Modul mit 5 V arbeitet und der Raspberry Pi nur 3,3 V verträgt, benötigt man einen Spannungsteiler um die Signalpegel zu reduzieren:

Das Programm:

Jedes der RFID Tags hat eine Nummer aufgedruckt, die die ID des Tags als Dezimalzahl darstellt.

Das Modul gibt insgesamt 15 Bytes an Daten aus und eine Datenausgabe (ohne die 0x02 als Startbyte und die 0x03 als Stopbyte) sieht folgendermaßen aus:

08000A79047F

Anhand dieser Nummer kann nun einiges ausgelesen werden:

  • 800 bedeutet, dass es sich um einen Chip handelt (300 ist eine Karte)
  • A79047F ist die aufgedruckte ID des Tags
  • 7F die Checksumme.

Die Checksumme berechnet sich wie folgt (anhand des oben gegebenen Beispiels):

Byte 1 → 08
Byte 2 → 00
Byte 3 → 0A
Byte 4 → 79
Byte 5→ 04

Checksumme = (Byte 1) XOR (Byte 2) XOR (Byte 3) XOR (Byte 4) XOR (Byte 5)

Zuerst wird die UART-Schnittstelle geöffnet:

UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()

In einer Endlosschleife lese ich ein Zeichen ein und vergleiche es mit dem Startflag.

Zeichen = UART.read()

Sobald eine 0x02 empfangen und damit eine neue Datenübertragung signalisiert wird, springt das Programm in die if-Abfrage. Dort werden dann 14 weitere Bytes eingelesen und in einem String gespeichert:

for Counter in range(13):
   Zeichen = UART.read()
   ID = ID + str(Zeichen)

Jetzt muss nur noch die 0x03 aus dem String gelöscht werden:

ID = ID.replace(Endflag, "" );

Jetzt befinden sich alle wichtigen Daten in dem String ID. Mit der for-Schleife berechne ich anschließend die Checksumme :

for I in range(0, 9, 2):
   Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) +
         int(ID[I+1], 16))

Die Schleife zählt von 0-9 mit einer Schrittweite von 2. Daraus ergeben sich 5 Durchläufe und mit jedem Durchlauf vereine ich das Halbbyte aus dem String ID mit der Nummer I mit dem Halbbyte I + 1. Dadurch bekomme ich Byte Nummer 1. Dieses Byte wird mittels einer XOR-Verknüpfung mit der Variable Checksumme (die am Anfang auf 0 steht) verknüpft. Das Resultat ist, dass die Variable Checksumme den Wert des ersten Bytes annimmt.

Anschließend kommt der zweite Durchlauf, in dem erst Byte Nummer 2 gebildet wird und anschließend wird dieses Byte mit der Variable Checksumme verknüpft. Das Resultat ist, dass alle 5 Bytes miteinander verrechnet werden und die Checksumme bilden.

Nach der Checksumme filtere ich noch die drei Bytes für das Tag aus:

Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) +
         ((int(ID[3], 16)) << 0)

Und zum Abschluss gebe ich alle Daten in der Konsole aus:

print "------------------------------------------"
print "Datensatz: ", ID
print "Tag: ", Tag
print "ID: ", ID[4:10]
print "Checksumme: ", Checksumme
print "------------------------------------------"

Die reine Karten-ID befindet sich dabei an der 4. – 10. Stelle des Datensatzes. Eine komplette Ausgabe sieht dann anschließend so aus:


Wichtig:

Für eine ordnungsgemäße Funktion des Programmes muss die Zeile

#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

in der Datei /etc/inittab wie folgt umgeändert werden:

#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

Dadurch wird der UART nicht mehr für die Konsole mittels Terminal bzw. UART genutzt und ihr könnt euch dem entsprechend auch nicht mehr über UART anmelden. Wenn ihr dies nicht tut, kann es vorkommen, dass das Programm abstürzt.


Den kompletten Code gibt es bei Git zum Download.

→ Zurück zu UART & USB

83 Kommentare

  1. Hallo,
    Interessiere mich für deine RFID Tags Auslesung . Nur würde ich gerne damit jetzt noch ein gpio Ausgang schalten lassen bei einer bestimmten Karte oder /und ein Shell Befehl ausführen lassen habe nirgends sowas in der Art gesehen und selber kann ich nicht so gut programmieren . Wollte fragen ob sie mir da weiter helfen könnten ?

    1. Hey,

      klar. Sollte kein Problem sein.
      Schreib mir einfach eine E-Mail was du genau haben möchtest. Dann sehen wir weiter :)

      Gruß
      Daniel

      1. Hallo, ich wollte mal fragen ob es Möglich ist das ganze als door lock zu nutzen und dazu die ID an einen server bzw haupt pc zu senden der dann weiter mit der Id umgehen kann.

        und ich wüste gerne was das alles kösten würde.

        1. Hallo Ralph,

          interessante Idee! Ja klar ist dies möglich. Du kannst per Python einen einfachen Client (oder Server) aufsetzen und dann die Tag-Informationen zu einem Server zusenden, welcher die Daten dann auswertet.
          Kosten hast du da (bis auf das RFID-Modul und die Tags) keine zusätzlichen.

          Gruß
          Daniel

  2. Hi Kampi,

    vielen Dank für das nette Beispiel. Ich habe es nachgebaut hab aber das Problem, dass es zu mehreren ausgaben kommt, wenn ich die RFID-Karten am Empfänger halte. Wie würdest du das Problem umgehen ? Also ein debounce wäre das glaube ich, mit einem time.sleep(5.5) bin ich nicht weitergekommen. Vielleicht hast du eine Idee ?

    thanx

    1. Hey,

      im Grunde brauchst du nur das Python Modul „serial“ (eventuell auch noch „python-dev“ um es zu installieren….weiß ich jetzt nicht genau).
      Gib einfach mal

      apt-get install python-dev python-serial

      ein. Am Ende der Anleitung steht auch noch eine Info….die musst du auch noch umsetzen. Dann sollte es eigentlich funktionieren

      Gruß
      Daniel

  3. Hallo kampi,
    ich Interessiere mich für deine RFID Tags Auslesung . Nur würde ich gerne damit jetzt auch noch zu den betreffenden Tags ein Bild JPG oder PDF zuordenen und auf dem Bildschirm anzeigen lassen Selber kann ich nicht so gut programmieren . Wollte fragen ob Sie mir da weiter helfen könnten. Eventuell wie ich die Datenbank erstelle und die IDs mit den Bilder verknüpfe.
    Vielen Dank im Voraus.

    1. Hey,

      also ich habe schon eine Benutzerverknüpfung mittels RFID realisiert. Dort ist in einer Datei gespeichert welcher Benutzer welches Tag hat (also ganz ganz einfach gehalten). Wird das jeweilige Tag an den Reader gehalten, dann wird der Benutzer begrüßt.
      Auf ähnliche Weise könnte man es mit Bildern machen. Ist zwar nicht die schönste Lösung aber sie funktioniert ohne das man viel Ahnung von Datenbanken etc. braucht :)

      Gruß
      Daniel

  4. Hi Kampi,

    kannst Du bitte auch einmal ein Bild von der fertigen Schaltung posten? Ich kann einfach mit dem Schalten des Spannungsteilers nix anfangen. Newbie halt…

    Gruß
    Frank

    1. Hey,

      ein Bild habe ich nicht. Aber es sind im Grunde nur zwei Widerstände die von der Tx Leitung des Moduls nach GND gehen und am Mittelabgriff beider Widerstände schließt du Rx vom Pi an.

      Gruß
      Daniel

  5. Hallo Kampi :)

    Ich bin neu im Bereich RPi und bis jetzt haben mir schon viele deiner Beiträge geholfen. :)

    Nun hab ich aber mit meinem RFID Leser doch ein Problem. Ich hab nämlich den Sainsmart RC522.
    Der kommuniziert via SPI und davon hab ich NULL Ahnung und finde nur Spanische Anleitungen, die zwar halbwegs funktionieren, aber der Code 400 Zeilen lang ist, und dmait ganz und garnicht abreiten kann..
    Ich hoffe Du kannst mir da irgendwie weiterhelfen.

    Gruß Florian

    1. Hallo Florian,

      freut mich das die Beiträge dir geholfen haben.
      Mit SPI habe ich in Sachen Raspberry Pi selber noch nicht sooooo wahnsinnig viel gemacht und den Reader kenne ich leider auch gar nicht. Hab gerade mal einen flüchtigen Blick in das Datenblatt geworfen und das IC kann auch UART und I²C. Aber die Platine scheint nur für SPI ausgelegt zu sein….
      Also da bräuchte ich selber erst mal ordentlich Einarbeitungszeit, weil einfach ist das Modul nicht gerade….

      Gruß
      Daniel

  6. Hallo Kampi,

    Danke für deine Schnelle Antwort. Habe nach stundenlangem suchen aufeinmal doch etwas gefunden : LINK
    Klappt super. Sogar mit Reisepässen :P
    Das auszüführende Programm hab ich gerade geschrieben

    Grüße Florian

  7. Hi Daniel,
    ein weiteres Projekt von dir, bei dem ich das versuche nachzuvollziehen.
    Nur leider scheitert es irgendwodran :-(
    Ich habe z.B. nicht das von dir verwendete RFID Modul bekommen, sondern den Vorgänger (http://www.seeedstudio.com/wiki/index.php?title=125Khz_RFID_module_-_UART) der sollte aber die gleichen technischen Eigenschaften haben…
    Kann es evt. sein das noch irgendwelche Module installiert werden müssen? Wenn ich das Programm laufen lasse passiert gar nichts. Ich vermute es liest die Schnittstelle aus, aber da kommt anscheinend nix, wenn ich einen Tag drauflege. Viel falsch verkabeln kann ich ja kaum :-) Hast du irgendeine Idee woran es liegen könnte?
    Grüße Dominik

    1. Wenn ich eine LED zwischen den TX ausgang schalte, um zu testen ob etwas erkant wird flakert diese, also liegt Spannung (bzw ein SIgnal ) an. UNd das Programm „hört“ auch , aber irgendwas stimmt hier nicht ?

        1. Hi Daniel,
          daran lags :-) Super danke.
          Jetzt wird zwar noch das Tag zweifach ausgelesen, also ich bekomme die Anzeige immer doppelt, aber da schau ich doch gleich mal rein :-)

          Grüße Dominik

  8. Hallo
    ich habe mir für unsere WG ein relativ simples Konzept ausgedacht um die Türe zuöffnen.
    Zurzeit verwenden wir ein „Fertigen“ RFID Leser 7 welcher uns aber in letzter zeit nur Probleme macht, da er sich leider ab und an aufhängt und dann niemand mehr reinkommt ohne Notschlüssel.
    Der RFID Leser zieht ein Relai an welchen eine Fernbedienung ansteuert, welche das Schloss ansteuert. Das Schloss ist ein TSE System von Burgwächter.
    Nun meine Frage da ich mich und auch niemand anders hier mit den Resberry Pi beschäftigt hat:
    1. Ist es möglich die Benutzer „einfach“ per Wlan oder USB zu verwalten.
    2. Ist eine Ereignis Aufzeichnung realisierbar. Also „Hans 20:15 20.01.2014 zutritt gestattet“ oder ist diese Funktion bereits Intrigiert ?
    3. Ist die Anzahl der Nutzer limitiert ?

    MfG Dennis
    Ps. Danke für diese tolle Anleitung nur leider habe ich keine Ahnung von programmieren.

    1. Hallo Dennis,

      prinzipiell ist sowas möglich.
      Ich selber habe schon für meinen Leser ein Programm geschrieben, welches das Tag mit einem Eintrag in einer Datei abgleicht und so den Besitzer des Tags begrüßt (eine einfache Datei wo drin steht welcher Benutzer welche Tagnummer hat).
      Diese Datei kannst du nun z.B. über Web verfügbar machen, womit du sie editieren kannst.
      Eine Aufzeichnung ist ebenfalls möglich. Da musst du dein Programm nur soweit erweitern, dass es eine Art Logfile schreibt.
      Die Anzahl der Nutzer wird nur durch deine vorhandenen Tags begrenzt :)

      PS: Ich kenne jetzt euer System nicht, aber mit meinem Leser könnte ich das Problemlos realisieren. Wenn euer Leser die Daten per USB oder RS232 ausgeben kann, kannst du das da ran anpassen.

      Gruß
      Daniel

      1. Hallo Daniel

        Leider haben wir uns falsch verstanden oder ich mich falsch ausgedrückt.

        Zurzeit verwenden wir einen „CODATEX Leser 7“ welcher nun leider defekt ist.

        Nun wollen wir mithilfe des Raspberry Pi das System lealisiren.
        Ich habe gestern das oben angegebene RFID Modul und den Raspberry Pi bestellt.

        Nun hoffe ich das ich denn Pi so programmieren kann, dass er die Tags denn Benutzern zuordnen kann (eine begrüßung wird nicht benötigt) und die Tags auch die nicht zuortbaren in einen log abspeichert.

        Welche Programme werden dafür benötigt?
        Oder muss man alles selber programmieren ?

        MfG Dennis

        1. Hallo Dennis,

          wie gesagt, ich habe bereits ein Programm, welches die Tags auslesen und Vergleichen kann. Wenn du das Modul hast, kann ich es dir gerne mal geben. Dann kannst du es testen.
          Das Programm musst du dann am Ende nur deinen Bedürfnissen anpassen.

          Gruß
          Daniel

  9. Hallo Daniel,
    das wäre nett.
    Nur leider ist es mir nicht möglich irgendeien Tag auszulesen.
    Ich vermutte das ich was falsch gemacht habe.
    Ist es möglich mir ein komplettes Image zuzusenden?
    MfG Dennis

    1. Hey,

      mmh an dem Image ist eigentlich nichts besonderes dran.
      Woran merkst du den das du was falsch gemacht hast? Was erscheinen für Meldungen?

      Gruß
      Daniel

      1. Hallo
        entweder bekomme ich die Meldung das der port geöffnet ist oder einen Syntax Fehler.
        Ich habe die cmdbootline umgeschrieben und die inittab wie überall beschrieben. Desweiteren habe ich pyserial installiert allerdings offline da ich auch keine Verbindung zu meinen router bekomme -.-

        MfG Dennis

        1. Hey,

          ja seit einiger Zeit ist der ttyAMA0 die ganze Zeit geöffnet.
          Lösche einfach mal das .open() und das .close(), dann wäre das Problem schon mal erledigt.
          Das du nicht drauf kommst könnte daran liegen, dass du vielleicht die cmdbootline falsch geändert hast.
          Hast du einen Monitor um mal drauf schauen zu können?

          Gruß
          Daniel

          1. Aso, ja aber ich befinde mich derzeit noch auf der Arbeit und bin voraussichtlich ab 18 Uhr wieder daheim. Ich werde dann eimal schauen das ich meine script poste und Fotos der Fehlermeldung uploade.
            Mfg Dennis

            P.s vielen dank für die Hilfe im voraus.

  10. Hallo Daniel,

    Danke für deine tolles Tutorial! Ich habe alles so umgesetzt wie du es beschrieben hattest und deinen code über sudo python rfid.py laufen lassen. Er gibt mir sofort die Antwort:
    Traceback (most recent call last):
    File „rfid.py“, line 1, in
    import serial
    ImportError: No module named serial
    Es scheint mir so, als ob es das dinge gar nicht erkennt.
    Könntest du mir evtl. weiter helfen?

    LG Max

    1. Nachtrag:

      Nach dem Spannungsteiler kommen etwa 2V. Nicht 2,5. Könnte es daran liegen? Oder daran, dass ich den UART mode nicht aktiviert habe? Falls ja, wie aktiviere ich den?

      LG

        1. Vielen Dank für die schnell Antwort. Jetzt kommt die Fehlermeldung nicht mehr. Allerdings passiert jetzt nichts und die nächste Zeile bleibt leer.

          Ich bin über VNC im RPi. Kann es daran liegen?

          LG

  11. Hey,

    also ich habe den 1. von rechts der 5 pins auf dem RMD630 (a.k.a. TX) an den 10. GPIO auf dem RPI (a.k.a. RX) angeschlossen. Dazwischen den Spannungsteiler. Also glaube ich, dass ich das richtig angeschlossen habe.

    Danke nochmal für den „on demand“ support :)

    LG

  12. Moin noch einmal,

    ich habe mir inzwischen ein RFID Modul besorgt umd es funktioniert super mit dem Python Script. Ich hätte allerdings als Python Noop noch eine Frage zum ‚entprellen‘ des Codes:

    Wenn ein RFID Tag erkannt wird, werden in meinem erweiterten Code einige Funktionen aufgerufen, die einige Sekunden zur Ausführung brauchen. Leider passiert es immer wieder, dass der Tag gleich mehrfach nacheinander erkannt wird und die Funktionen danach mehrfach ausgeführt werden.

    Kann ich die Zeichen im UART Buffer löschen, bevor ich wieder in die While-Schleife gehe?

    Danke für hilfreiche Tips.

    Dirk

    1. Moin noch einmal,

      habe es selbst gefunden:

      time.sleep(2.5) # dann ist der Token sicher weg im Leser
      UART.flushInput() # alle bisher aufgesammelten Informationen löschen.

      Danke

  13. Hallo,
    muss jetzt einfach mal blöd fragen.
    z.B steht auf der Karte 0010621250

    im nTerminal bekomme ich folgende Ausgabe:
    ——————————————
    Datensatz: 8500A2114274
    Tag: 0x500
    ID: A21142
    Checksumme: 0x74
    ——————————————

    Ich dachte die Kartennummer (Aufdruck) ist gleich der Datensatz.

    Habe Hardware aus deiner Anleitung bestellt und alles so aufgebaut.

    Kannst du mir sagen ob das richtig ist oder ob da irgendwo ein Fehler besteht.

    1. Hallo Sven,

      die Nummer auf der Karte ist die ID als Dezimalzahl. Das was du im Terminal bekommst ist die ID als Hex-Zahl.
      Gib die ID auf der Karte mal in den Windows Taschenrechner ein und lass dir die Hex-Zahl ausgeben, dann siehst du es ;)

      Gruß
      Daniel

        1. Kein Problem :)
          Das ist auch bei mir oftmals so…ich probier sowas eigentlich immer direkt aus (gerade wenn in einem Zahlencode auch Buchstaben vorhanden sind), eben aus solchen Erfahrungen raus ;)
          Du kannst dir, wenn du möchtest, die ID auch als Dezimalzahl ausgeben lassen.
          Dazu einfach mit

          MeineZahl = int(Hex-String, 16)

          den String in eine Zahl umwandeln :)

          Gruß
          Daniel

  14. Hi Kampi & all die anderen,

    Hat von euch schon mal jemand mit dieser Schaltung den RFID mit 134,2 khz zum laufen gebracht? Oder evtl auch mit dem IC u2270b?

    Gruß, Marco

    1. Hallo Frigo,

      eventuell gab es Missverständnisse mit der Bezeichnung „Rx“ und „Tx“. Das passiert leider andauernd :(
      Aber dank dir für die Fotos :)

      Gruß
      Daniel

  15. Hallo Kampi,

    cooles Projekt, danke für die Anleitung. :)
    Bis zu welcher Entfernung funktioniert das Auslesen bei dir mit diesem Leser ca.?
    Denkst du es wäre möglich die Antenne des Lesers in ein wasserdichtes Gehäuse zu packen und trotzdem noch Tags auszulesen?

    LG Philipp

    1. Hallo Philipp,

      mmh die Entfernung habe ich jetzt nicht wirklich getestet….aber ich denke mal 5cm sollten locker gehen.
      Die Antenne solltest du in ein Gehäuse packen können…such einfach eins mit einem dünnen Deckel, dann ist das sicher kein Problem.

      Gruß
      Daniel

  16. Moin!
    Ich hab auch mal eine Frage.
    Hab ich das richtig verstanden, dass das Programm an der Stelle..
    for Counter in range(13):
    Zeichen = UART.read()
    auf das Einlesen einer Karte wartet?
    Kann man da irgendwie parallel, mit einer if Anweisung oder so, das Programm fortführen?
    Beispiel: Das Tor wird mit RFID geöffnet oder alternativ mit einem Taster!
    Gruß Christian

    1. Hallo Christian,

      ja genau. Das Programm wartet darauf das ein Zeichen empfangen wurde. Sobald dies geschehen ist werden die restlichen Zeichen empfangen und zu einer Nachricht zusammen gebaut.
      Programmier doch für den Taster einen Interrupt und lass über den Interrupt das Tor öffnen :)

      Gruß
      Daniel

      1. Moin!
        Der Interrupt war eine gute Idee. Aber da das Programm auf den rfid wartet, scheint es blind zu sein was da noch so passiert.
        Ich habe grad versucht den Taster in programm1 abzufragen und rfid läuft dann in programm2. Aber auch da scheinen sich die beiden zu stören.
        Hätte da eventuell noch jemand eine Idee?
        Gruß Christian

  17. Hallo,

    bin auch gerade am testen, aber leider bekomme ich nichts raus. Die LED an TX leuchtet permanent. Ist der der Spannungsteiler notwendig? Was passiert, wenn er nicht dazwischen ist? Die Anschlüsse habe ich richtig angeschlossen, TX vom RFID nach Pin10 (GPIO 15) am Pi. Vielleicht habt ihr noch eine Idee.

    Gruß Sven

    1. Hallo Sven,

      der Spannungsteiler ist notwendig, wenn du das Modul mit 5V betreibst, da der IO des Raspberry Pi nur 3,3V verträgt und dann bei 5V Pegel kaputt gehen kann.
      Wie empfängst du die Daten? Und welches Modul benutzt du? Eventuell ist da ein Fehler.

      Gruß
      Daniel

      1. Ich nutze ein ähnliches Modul mit einem RDM6300. Die Daten sollen per UART gesendet werden und über die RX vom Pi empfangen werden. Haben eben mit Putty mal die Schnittstelle aufgemacht und RX und TX gebrückt. Der Daten-transfer funktioniert. Hänge ich nun den RFID-Chip dran, erscheint da nichts. Nicht mal ein Zeichen. Muss man den RFID erst aktivieren oder sendet er permanent, wenn er den Chip ausgelesen hat?

  18. Hallo,

    ich habe gerade ein kleines Verständnisproblem und komme nicht wirklich weiter.
    Ich habe vor eine Alarmanlage zu programmieren, die zum einen permanent den Status von Sensoren überwacht (Abfrage an FHEM) und zum andern permanent auf dem seriellem Port lauscht, ob die Anlage üner RFID einen Input bekommt.

    Teil1 ist kein Problem, das Script lauft permanent und reagiert mit Änderung der Anzeige am Display, wenn sich im FHEM was tut. Bei der Einbindung des RFID Zeugs habe ich allerdings Probleme. Das Auslesen funktioniert, allerdings scheint es so, als würde das Programm immer am seriellen Port hören, bis etwas ankommt und dann mit der Ausführung des Scripts fortfahren.

    Wie baue ich das am besten auf? Ich vermute fast, ich muss den RFID Teil in einem separaten Script laufen lassen und beide Scripte parallel starten oder? Wie komme ich dann im Hauptscript am besten an die RFID Infos?

    Anders, wie muss ich das RFID Script umbauen, damit während der Zeit, wo nichts über die serielle Schnittstelle kommt, anderer Code (egal welcher) ausgeführt wird?

    VG
    Sven

    1. Hallo Sven,

      du kannst das Skript so umbauen, dass es die Ausgabe in eine Datei schreibt. Diese Datei ließt du dann einfach regelmäßig aus.
      Das RFID-Skript lässt du dann einfach im Hintergrund laufen.

      Gruß
      Daniel

      1. Danke, ich hab jetzt 2 Scripte. Eins für die RFID´s, das den Reader überwacht und bei Eingabe den Wert mit der Datenbank abgleicht und dann in FHEM den Status anzeigt. Das Zweite Script ist für die Anzeige auf dem Display und die Aktionen im Alarmfall zuständig.

  19. Hej Kampi ich hätte eine Frage, würde das Programm von dir auch für ein anderes RFID Modul funktionieren(z.B 13 MHz oder von einem anderen Herrsteller).

    Gruß Nermin

      1. weißt du vielleicht wie ich die Reichweite bei RDM6300 vergrößer weil ich nur 1 cm Reichweite habe. Ich hätte noch eine Frage ob du ein C-Programm hättest mit dem man die ID auslesen kann.

        1. Hallo Nermin,

          ein C-Programm habe ich leider nicht. Die Reichweite des Moduls wirst du wahrscheinlich nicht erhöhen können.
          Die ist meistens fest vorgegeben (außer das Modul verfügt über eine Möglichkeit die Sendeleistung zu erhöhen).

          Gruß
          Daniel

  20. Hallo,

    erstmal besten Dank für Ihre super Ideen auf dieser Seite!
    Habe mir ein RFID-Reader mit Hilfe dieser Seite erstellt, welcher mir eine Schleusentür steuert. Die ID’s usw. werden in einer Datenbank gespeichert und können nun auch über eine .php Seite angepasst werden. Nun habe ich mir vorgenommen dies auch fest zu verbauen und habe mir einen neuen Raspberry geholt (leider gibt es für den ersten Raspberry kein großes Hutschienengehäuse). Nun wird ja seit diesem Jahr das Jessie Raspbian angeboten, nur leider funktioniert das Auslesen des RFID’Chips nicht mehr!

    Könnten Sie das überprüfen und mit ggf. einen Tipp geben? Ich bekomme immer die Fehlermeldung „serial.serialutil.SerialException: Port is already open.“!
    Habe schon stunden gesucht, komme aber leider nicht weiter!

    Vielen Dank im Voraus!!!

    1. Hallo David,

      es kann sein, dass der Kernel den Port nutzt. Gib mal „raspi-config“ in der Konsole ein und unter „Advanced“ (meine so heißt das Menü) kannst du die serielle Konsole ausstellen.
      Zusätzlich baust du noch eine Abfrage in das Programm um zu prüfen ob der Port bereits offen ist:

      if(!UART.isOpen()):
      UART.open()

      Hoffe das hilft. Ansonsten noch einmal schreiben :)

      Gruß
      Daniel

      1. Hi Daniel,

        leider haben deine Tipps nicht zum Erfolg geführt.
        Habe nun ein weiteres Script zum auslesen gefunden.

        def read_rfid():
        ser = serial.Serial(„/dev/ttyAMA0“)
        ser.baudrate = 9600

        dies funktioniert.

        Warum deine Variante nun nicht geht kann ich mir nicht erklären!

        Gruß David

        1. Hallo David,

          hast du den Pi mal neu gestartet, nachdem du die serielle Konsole deaktiviert hast?
          Die Einstellung wird (glaube ich) erst dann wirksam.
          In wie weit der Codeschnipsel funktionieren soll erschließt sich mir nicht ganz, da du da nur eine Funktion definierst :)

          Gruß
          Daniel

          1. Hallo,

            ja ich hatte den Pi neugestartet, glaube er schlägt einem das beim Verlassen auch vor.

            Mit dem Codeschnipsel wollte ich nur veranschaulichen, dass ich jetzt eine andere Möglichkeit gefunden habe auf die Serielle Schnittstelle zu „lauschen“. Das ganze Skript gibt es hier: http://www.elektronx.de/tutorials/rfid-tags-auslesen/ (wenn ich „Werbung“ machen darf, ansonsten lösch es einfach wieder).

            Das Jessie kommt wohl nicht mit deinem „UART.open()“ klar. Hatte es auch einfach mal auskommentiert, aber das brachte auch keinen Erfolg.

            Gruß David

  21. Hallo ich habe das RDM6300 modul und das Spuckt ein Anfangszeichen und ein Endzeichen aus das man nicht Zuordnen kann. Wie kann man die 2 Zeichen wegretuschieren ?
    Danke .

  22. Moin,
    ich habe die Grundversion auf von hier. Habe es bei uns im Verein mehr oder weniger erfolgreich genutzt. Das wichtigste ist, dass man mögliche Fehler abfängt und somit nicht das Programm beendet wird.

    Fehler die bei mir aufgetretten sind:
    – Checksumme war rechnerisch nur einstellig z.B. „9“ aber beim Lesen „09“
    – Das Startflag war wie auch immer „\x00“ -> Error String kann nicht zu int konvertiert werden
    – Programm stürzt ab und das Display wird beim Absturz nicht resetet. Also auch über das ganze Programm ein „try“ und im except das ganz Programm vernünfigt beenden.

    Hier meine Lösung. Vielleicht hilft Sie ja jemanden.
    try:
    while continue_reading:
    try:
    # Variablen loeschen
    Checksumme = 0
    ID = „“
    chkrech = „“
    chklesen = “ “
    Zeichen = „“
    timervorhanden = False

    ## Zeichen einlesen
    try:
    Zeichen = UART.read()
    except Exception as e:
    loggerdebug.debug(„Fehler beim Lesen der RFID-Schnittstelle, {0}“ .format(str(e)))
    Kartendatenrichtiggelegen = False

    ## Uebertragungsstart signalisiert worden?
    if (Zeichen == Startflag):
    try: #versucht die Daten zu empfangen und Checksumme auszurechnen
    ## ID zusammen setzen / auslesen
    for Counter in range(13):
    Zeichen = UART.read()
    ID = ID + str(Zeichen)
    ID = ID.replace(Endflag, „“ ) ##Endflag aus dem String loeschen
    try:
    for I in range(0, 9, 2): ## Checksumme berechnen
    Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) + int(ID[I+1], 16))
    Checksummehex = hex(Checksumme) # Checksumme in HEX konvertieren
    except Exception as e:
    loggerdebug.debug("Fehler beim Berechnung der Chekcsumme, {0}" .format(str(e)))
    Kartendatenrichtiggelegen = False
    ## Tag herausfiltern
    #Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) + ((int(ID[3], 16)) << 0)
    #Tag = hex(Tag)
    #print ("——————————————")
    #print ("Datensatz: {0}, Tag: {1}, ID: {2}, Checksumme: {3},Checksumme Dez: {4}".format(ID, Tag, ID[0:10], Checksummehex, Checksumme))
    #print ("Checksumme aus ID (Datezsatz): {0}, Checksumme aus ID (Hex): {1}".format(ID[10:12], Checksummehex[2:4]))
    Kartendatenrichtiggelegen = True
    except Exception as e:
    loggerdebug.debug("Fehler beim Lesen der Kartendaten, {0}" .format(str(e)))
    Kartendatenrichtiggelegen = False

    if (Kartendatenrichtiggelegen == True):
    # Ausgabe der Daten

    chkrech = string.upper(Checksummehex[2:4]) #Checksumme (berechnet) zum Vergleich grossschreiben
    if (len(chkrech) == 1): # Falls die Checksumme nur einstellig ist
    chkrech = "0" + chkrech
    chklesen = string.upper(ID[10:12]) #Checksumme (gelesen) zum Vergleich grossschreiben
    if ((chkrech == chklesen) and str(ID) != "000000000000"):
    print ("——————————————")
    ID = ID[0:10] # Checksumme von der ID abschneiden
    #enf if Kartencheck per Chekcsumme
    #end if Kartendatenrichtiggelegen
    UART.flushInput()
    sleep(0.1)
    except Exception as e:
    #ende der While-Schleife
    except Exception as e:

    1. Hallo,

      das komplette Programm in einen try-catch Block zu packen ist nicht unbedingt schön (auch wenn dadurch ein eventuelles Problem gelöst wird). Das die Checksumme (im Falle einer einstelligen Checksumme) auf einen einzelnen Integer abgebildet wird stimmt natürlich. Die aufgedruckte Checksumme ist ein entsprechender ASCII-String und eine einstellige Checksumme muss dann natürlich auf die entsprechende Länge erweitert werden. Das kann durch eine entsprechende Formatierung beim print-Befehl erreicht werden.

      Warum das Startflag als „0x00“ eingelesen wird weiß ich nicht. Wurde ggf. was an dem Modul geändert (meine Anleitung ist ja auch schon paar Jahre alt…) oder ist das nur ein Übertragungsfehler gewesen?

      Gruß
      Daniel

  23. Hallo Daniel
    Schön, dass du dein Experiment mit allen teilst. Ich bin genau auf der Suche nach sowas, um mein Rolltor öffnen zu können.
    Leider fehlt in der Anleitung der Hinweis, dass die alleinige Identifizierung über UID absolut unsicher ist. Viele Handys z.B. von Sony und LG verwenden z.B. die UID 01:02:03:04. Wenn man so ein Handy programmiert, können alle mit dieser UID die Funktion ausführen. Man hat also nicht einmal die Sicherheit eines 10€ Fahrradschlosses. Ganz zu schweigen davon, dass UIDs mit NFC Card Emulator Pro aus dem Playstore emuliert werden können.
    Um es besser zu machen gäbe es verschiedene Wege. Schon bei günstigen Tags wie dem NTAG 424 DNA gibt es Sicherheitsfunktionen, bei den teureren sowieso. Verschlüsselung, sei es symmetrische oder asymmetrische, ist das Stichwort.

    1. Hallo Hans,

      danke für den Hinweis. Natürlich ist die beschriebene Anleitung alles andere als sicher und sollte niemals für kritische Bereiche genutzt werden, alleine schon weil die Kommunikation zwischen Lesegerät und Rechner komplett unverschlüsselt abläuft und man somit auch einfache Man-in-the-Middle-Angriffe fahren kann. Nicht umsonst gibt es professionelle Lösungen und ich bin auch der Meinung, dass die Leute schon mal selber nachdenken sollen, ob das System was die da bauen sicher ist ;).

      Gruß
      Daniel

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert