RFID-Reader über die Keyboard-Schnittstelle nutzen (C# und JavaFX)

 

 

Für das Einlesen der Daten eines RFID-Tags gibt es diverse Möglichkeiten. Bei einigen Readern wie dem Phidgets 1024 stehen umfangreiche Software-Bibliotheken und DLLs zur Verfügung. Es gibt aber auch die Möglichkeit, die Daten über die USB-Schnitstelle (meist in Form eines virtuellen COM-Ports) zu lesen und zu schreiben oder ganz einfach die Tastatur-Funktion zu nutzen. Das Einlesen des Tags geschieht dabei absolut identisch, wie das Einlesen über das Keyboard. Diese Methode ist zwar nicht so flexibel, wie die Arbeit mit einer Bibliothek und Sie können damit auch nur Chips auslesen, allerdings funktoniert das Ganze im einfachsten Fall auch ohne eine Zeile Programmcode. Ein weiterer Vorteil: Egal, ob Sie einen LF- oder HF-Reader oder Gerät von unterschiedlichen Herstellern verwenden, der auswertenden Software ist das vollkommen egal. Schauen wir uns das konkret an dem HF-Reader 29-1-21-1000 an, Sie können es aber auf alle RFID-Leser anwenden, die über eine Keyboard-Funktion verfügen.

Nach dem Anschluss an die serielle Schnittstelle passiert erstmal nichts. Es wird kein Treiber installiert, weil eine Tastatur mit dem schon vorhandenen HID-Treiber von Windows arbeitet. Bei anderen Betriebssystemen ist das ähnlich.

Die LED signalisiert die Bereitschaft und leuchtet in diesem Zustand rot.

ZT-SMT-R20C

Öffnen Sie nun ein beliebiges Programm, das auf Tastatureingaben reagiert, z. B. Word, Excel, einen Editor, die Kommandozeilen-Eingabe. Wir wollen hier den Editor Ultra Edit nutzen. Wenn Sie das Programm geöffnet haben, blinkt der Cursor im Textfenster.

RFID-Keyboard_1

Würden Sie nun eine Taste drücken, erscheint die Eingabe und genauso läuft das auch mit dem Reader ab. Bringen Sie also einen Tag in den Empfangsbereich des Readers, wird der Speicherinhalt eingelesen und im Programm dargestellt. In unserem Fall ist die Tag-ID = "3795885876".

RFID-Keyboard_2

Der Reader hängt an das Ende der Tag-Daten automatisch ein Carriage-Return an. Lesen Sie mehrere Tags hintereinander ein, so werden diese untereinander gelistet.

Mit dieser einfachen Funktionalität können Sie z. B. Passworteingaben automatisieren. Wenn Sie bei einem Login ein Passwort vergeben müssen, tun Sie dies über den Reader mit einem entsprechenden Tag und bestätigen Sie die Eingabe in der gleichen Art und Weise. Wenn Sie nun bei späteren Logins nach dem Passwort gefragt werden, können Sie dies einfach über den Tag eingeben. 

Die Keyboard-Funktion im Programm nutzen

Dieses Vorgehen ist zwar sehr einfach, Sie sind allerdings auf die Funktionalität des Programms beschränkt. Programmtechnisch können Sie allerdings in jeder Programmiersprache Tastatur-Events abfangen und darauf reagieren. Hervorragend sind dafür Sprachen geeignet, die mit grafischen Controls arbeiten, denn diese Objekte erledigen fast die ganze Arbeit der Ereignisbehandlung für uns, wir müssen die Daten nur noch weiter verwenden. Schauen wir uns das zunächst am Beispiel von C# an.

Einlesen in ein TextBox-Objekt in C#

Wir legen zunächst ein neues Projekt und zwar eine "WindowsForms-Anwendung" an, die wir z. B. "RFIDKeyboardReader" nennen. Auf das Programmformular ziehen wir ein TextBox-Objekt und benennen es in "tbTag" um.

RFID-Keyboard_3

Prinzipiell ist das schon alles, denn wenn wir ein Formular mit einem Control anlegen, liegt der Eingabefokus automatisch nach dem Starten auf diesem Control. Um sicher zu gehen, setzen wir den Focus aber noch einmal explizit über "tbTag.Focus()" auf dieses Element:

RFID-Keyboard_4

Führen wir das Programm nun aus, so öffnet sich das Fenster mit dem kleinen Textbox-Element und wenn Sie einen Tag an den Reader halten, wird der Wert eingelesen und erscheint in der Textbox:

RFID-Keyboard_5

Die Tag-ID ist eingelesen und kann nun mit der Methode "tbTag.text()" innerhalb des Programm genutzt werden. Zur Übung wollen wir die eingelesenen Tags in einem Listenfeld speichern und dazu mit einem Zeitstempel versehen. Da wir aber entscheiden wollen, ob gespeichert wird oder nicht, brauchen wir noch zwei Button. Die Oberfläche sind nun folgendermaßen aus:

RFID-Keyboard_6

Der Code dazu ist simpel:

RFID-Keyboard_7

 

Beim Drücken des "Speichern"-Buttons wird die aktuelle Zeit aus dem statischen "DateTime"-Objekt gelesen und in der Variablen "zeit" vom Typ DateTime gespeichert. Es wird ein Listeneintrag in der Listbox erzeugt, das aus dem Eintrag der Textbox besteht (tbTag.Text) und dem dann die Variable "zeit" in Form eines Strings angehängt wird. Danach wird die Textbox geleert und der Focus wieder darauf gesetzt. Beim Drücken des Löschen-Buttons wird der aktuelle Eintrag in der Textbox verworfen. 

Reaktion auf Tastaturereignisse in JavaFX

Durch die Nutzung eines Eingabe-Controls haben wir uns zwar um das Event-Handling "gedrückt", aber die Funktionalität ist doch noch etwas beschränkt. So kann unser Programm in der bisherigen Version zwar sofort eingelesen, die weitergehenden Aktionen müssen wir aber konkret auslösen. Wir wollen nun ein Programm schreiben, das beim Einlesen eines Tags sofort eine vorgegebene Aktion ausführt und zwar je nach Tag-ID den Bildschirm in einer anderen Farbe färbt. Wir arbeiten dieses Mal in Java und zwar in JavaFX weil Swing sich doch so langsam aber sicher verabschiedet und weil es einfach klarer und strukturierter ist. In C# ist das natürlich auch überhaupt kein Problem. Als IDE verwenden wir Netbeans, das Beispiel ist jedoch in allen IDE lauffähig, wenn SIe die Java SDK 1.7 oder höher installiert haben. 

Wir erstellen zunächst ein neues Projekt und zwar eine JavaFX Applikation:

RFID_Keyb_JAVA_1

 

Im nächsten Fenster vergeben wir den Namen "RFIDKeyReader". Der Rest kann einfach so übernommen werden.

 

RFID_Keyb_JAVA_2

 

Wenn Sie eine JavaFX-Applikation erstellen, wird ein lauffähiges kleines Programm erstellt, das über ein Fenster und einen Button verfügt. Den Button benötigen wir nicht, deshalb können Sie alle Code-Zeilen löschen, die damit zusammen hängen. Der erste Teil des Programms sieht nun folgenermaßen aus:

 

RFID_Keyb_JAVA_3

 

In den Zeilen 3 bis 10 finden Sie die benötigten Imports. Danach folgen die Klassenvariablen für das Root-Element und die Scene. In JavaFX baut sich ein fensterorientiertes Programm immer aus dem Fenster selbst (der Stage), einem Layout (z. B. einem StackPane) und einer Scene auf. Neben diesen Variablen brauchen wir noch eine Zeichenkette "tagStr", in der wir die Tag-ID speichern. Wenn eine Instanz der Klasse "Application" erzeugt wird, erfolgt zunächst ein Aufruf der "init"- und dann der "start"-Methode, der die Stage übergeben wird. Diese Methode ist abstrakt, deshalb müssen wir mit "@Override" angeben, dass wir sie überschreiben. In der start-Methode erzeugen wir die Instanzen der Klassenvariablen. Wir haben sie außerhalb der start-Methode deklariert, weil wir aus dem Event-Handler auf sie zugreifen müssen. Bei der Definition der scene wird das Root-Element übergeben und die Größe des Fensters festgelegt. Anschließend wählen wir einen Fenstertitel und fügen dem Basisfenster die scene hinzu. Das sind die vorbereitenden Arbeiten, die bei JavaFX immer anfallen.

Nun zur eigentlichen Funktionalität: 

RFID_Keyb_JAVA_4

Beim Drücken einer Taste wird ein "setOnKeyPressed"-Ereignis des Objekts ausgelöst, auf dem sich gerade der Fokus befindet. Wenn wir unser Hauptprogramm starten und es aktiv ist, befindet sich der Fokus auf der scene und dort bleibt er auch, da keine weiteren Elemente vorhanden sind.  Für dieses Event erzeugen wir einen neuen anonymen EventHandler vom Typ "KeyEvent". Der Handler hat eine Methode "handle", die bei jedem Ereignis aufgerufen wird. Diese Methode überschreiben wir für unsere Zwecke und zwar wie folgt:

In Zeile 32 prüfen wir, ob die Enter-Taste gedrückt, bzw. vom Reader gesendet wurde. Ist das nicht der Fall wird das nächste Zeichen gelesen, bis die Tag-ID komplett ist. Die Zeichen werden dabei einfach aneinander gehängt und im String gespeichert. 

Für die Überprüfung fragen wir den KeyCode ab. Jeder Taste ist ein fester Code zugeordnet und bei der Enter-Taste ist das "KeyCode.Enter". Den KeyCode lesen wir mit der Methode getCode() des KeyEvents ein. Eine Taste kann aber mehreren Zeichen entsprechen, z.. B. versteckt sich hinter der L-Taste ein großes oder ein kleines L, je nachdem ob die Shift-Taste auch noch gedrückt wird. Wir könnten das erkennen, indem wir die KeyCodes einlesen, also die Event-Folge "SHIFT-Taste gedrückt" -- "L-Taste gedrückt " -- " L-Taste los gelassen" -- "SHIFT-Taste los gelassen" auswerten. Einfacher geht das mit der "getText()"-Methode des KeyEvents. Die wertet das praktisch selber aus.

Wird nun ein "Enter"-Code entdeckt, durchläuft das Programm in der else-Schleife eine Abfrage, welcher Tag gelesen wurde. Dazu vergleichen wir einfach den eingelesen Wert (tagStr) mit einem fest eingegeben Tag. Wir vergleichen in diesem Beispiel 3 Werte und je nachdem welcher eingelsen wird, färbt sich der Bildschirm rot, grün oder blau. Danach wird der Zeichenspeicher wieder gelöscht und das KeyEvent als verbraucht deklariert.

Tipp: Wenn Sie das Beispiel nachvollziehen wollen, müssen Sie die Tags nicht erst auslesen und dann den Wert im Editor eingeben. Nutzen Sie einfach die Keyboard-Funktion. Das heißt, Sie platzieren den Cursor z. B. in Zeile 36 im if-Statement direkt hinter dem ersten Anführungszeichen und führen dann den Tag an den Reader. Dadurch sparen Sich sich die Tipperei und vermeiden Fehler.

Nach diesem Prinzip können Sie jetzt mit einem Tag beliebige Aktionen auslösen: Meldungen ausgeben, Zeiten speichern, Programm aufrufen oder in Verbindung mit Hardware-Baugruppen auch Steuerungen ausführen.

 

 

 

Copyright ©  Böcker Systemelektronik