Hallo,
nachdem ich hier schon einige Zeit mitlese und vieles aus diesem Forum lernen konnte, möchte ich nun auch mal was zurückgeben.
Ich habe ein Modul für den Identive SCL011 Contactless Reader (auch bekannt als nPA-Basisleser) geschrieben. Das Lesegerät gabs (gibts?) in Deutschland ja praktisch geschenkt (zumindest auf Ebay sehr billig) und eignet sich hervorragend als sicherer Schalter in der Hausautomatisierung (bei mir an der Haustüre zur Anwesenheitssteuerung bzw. Aktivierung/Deaktivierung der Alarmanlage).
Funktion:
Der SCL011 muss per USB am IP-Symcon Rechner angeschlossen und der entsprechende PC/SC Treiber muss installiert sein. Das Modul greift auf über den PC/SC Treiber auf das Lesegerät zu und meldet bei Anlegen einer entsprechenden Karte deren UID. Es besteht die Möglichkeit, die interne LED anzusteuern (optional). Es handelt sich prinzipiell um einen Multiformat-Reader. Es besteht aber optional auch die Möglichkeit, die Suche auf bestimmte Kartentypen einzuschränken (Funktion direkt in der Firmware). Vorerst funktioniert das Modul mit einem angeschlossenen Reader am System schon ganz gut. Ich habe eine Struktur mit eingebaut, die es erlauben sollte auch mehrere Leser über mehrere Instanzen in IP-Symcon anzusprechen. Mangels mehrerer Reader konnte ich das aber noch nicht wirklich testen.
Einbindung in IP-Symcon:
- scl011.dll in das modules Verzeichnis kopieren
- Dienst neu starten
- Instanz hinzufügen
- „RFID“ -> „SCL011“
- Hinzufügen abschließen
- Reader anstecken (wenn nicht schon dran)
- Karte auflegen (das ist notwendig, da durch die Treiberfunktionalität auf Readereinstellungen auch nur zugegriffen werden kann, wenn eine Karte aktiviert ist
- Bei der ersten Initialisierung eines Lesegerätes nach Erstellen der Instanz wird die Seriennummer des Lesegeräts übernommen. Nachfolgend funktioniert die entsprechende Instanz nur noch mit genau diesem Lesegerät. Soll das zurückgesetzt werden -> Instanz löschen / neu erzeugen oder siehe PHP-Funktionen
- Immer wenn IP-Symcon neu gestartet wird, muss die Initialisierung neu durchlaufen werden. Das passiert normalerweise mit dem ersten Auflegen einer Karte automatisch (erst dann springt ReaderStatus von -1 auf 1)
Statusvariablen:
CardState: Aktueller Kartenzustand
–> -1 = Fehler
–> 0 = Keine Karte
–> 1 = Lesefehler / Unbekannte Karte
–> 2 = Karte angelegt
–> 3 = Karte aktiviert (shared)
–> 4 = Karte aktiviert (exclusive)
Im Normalbetrieb sollte diese Variable auf 0 stehen, wenn keine Karte im Lesebereich ist, bzw. auf 3, wenn sich eine Karte im Lesebereich befindet und identifiziert wurde.
CardUID: UID (Seriennummer) der Karte - Hexcodiert
Immer wenn eine Karte neu gelesen wird, wird diese Variable aktualisiert. Scripte, die auf Leseereignise reagieren sollen verwenden am besten diese Variable als Trigger.
ReaderState: Aktueller Zustand des Lesegeräts
–> -3 = Nicht unterstütztes Lesegerät (kein SCL011) - wird ignoriert
–> -2 = Unbekanntes Lesegerät (SCL011 mir unbekannter Seriennummer) - wird ignoriert
–> -1 = Lesegerät noch nicht Initialisiert --> Karte auflegen
–> 0 = Kein Lesegerät erkannt
–> 1 = Lesegerät OK
PHP Funktionen:
- SCL011_setLedState(InstanceID:integer, bLedOn:boolean):integer
–> LED aus/einschalten
–> Dafür muss LedControlByFw auf false stehen
–> Liefert 0 bei Erfolg / -1 bei Fehler - SCL011_getLedState(InstanceID:integer):integer;
–> Zustand LED
–> Liefert -1 wenn LedControlByFw auf true steht
–> Liefert 0 bei LED aus / 1 bei LED ein - SCL011_getSerialPnp(InstanceID:integer):string
–> Liefert die PNP Info (aufgeblasene Seriennummer) des Readers - SCL011_setSerialPnp(InstanceID:integer, sSerialPnp:string);
–> Erlaubt Änderung der PNP Info
–> Handling von mehreren Lesegeräten -> ungetestet - SCL011_getCntlessType(InstanceID:integer):integer;
–> Kartentypen für die Suche (Einschränkung)
–> 0 --> alle unterstützen Kartentypen (FeliCa, Typ A, Typ B)
–> 1 --> nur Typ A (Mifare)
–> 2 --> nur Typ B
–> 3 --> Typ A und B
–> 4 --> Nur FeliCa
–> 5 --> FeliCa und Typ A
–> 6 --> FeliCa und Typ B - SCL011_setCntlessType(InstanceID:integer, iCntlessType:integer);
–> Einstellen der Katzentypen für die Suche (Nummern siehe oben)
–> Ob das wirklich spürbare Vorteile in der Reaktionszeit bringt weiß ich noch nicht
–> Es muss danach jedenfalls eine Neuinitialisierung durchgeführt werden (IP-Symcon Neustart oder Lesegerät aus-/anstecken) - SCL011_getLedControlByFw(InstanceID:integer):boolean;
–> LED per FW (true) oder aus IP-Symcon (false) steuern? - SCL011_setLedControlByFw(bLedControlByFw:boolean);
–> LED per FW (true) oder aus IP-Symcon (false) steuern?
–> Es muss danach jedenfalls eine Neuinitialisierung durchgeführt werden (IP-Symcon Neustart oder Lesegerät aus-/anstecken) - SCL011_getReaders(InstanceID:integer):string;
–> Liefere Liste der angeschlossenen Reader mit Positionsnummern
–> Handling von mehreren Lesegeräten -> ungetestet - SCL011_getReaderPosition(InstanceID:integer):integer;
–> Liefere Positionsnummer des aktuellen Readers in der oben genannten Liste - SCL011_setReaderPosition(InstanceID:integer, iReaderPos:integer);
–> Ändere Positionsnummer für den Zugriff auf einen Reader
–> Handling von mehreren Lesegeräten -> ungetestet
–> Es muss danach jedenfalls eine Neuinitialisierung durchgeführt werden (IP-Symcon Neustart oder Lesegerät aus-/anstecken)
Das ist die erste Version, die gerade eben fertig wurde. Die Grundfunktionalität sollte schon ganz gut klappen. Fehler sind natürlich nicht auszuschließen und ich würde mich über entsprechende Rückmeldungen freuen, sodass ich darauf reagieren kann. Ich übernehme natürlich keinerlei Haftung für Schäden die direkt oder indirekt im Zusammenhang mit dem Einsatz des Moduls stehen.
Featurewünsche können hier natürlich auch gerne diskutiert werden.
Schöne Grüße
EmJay
Danksagungen:
SCM Microsystems Inc. für die offene Delphi-Demo zum PC/SC-Treiberzugriff
Thomas Dreßler für die hilfreiche Doku zur IP-Symcon Modulerstellung
Symcon GmbH für IP-Symcon und das SDK
scl011.zip (323 KB)