Kampi
27.02.2013, 17:12
Heyho,
ich habe mir am Wochenende dieses RFID Modul bestellt:
http://www.watterott.com/de/Electronic-brick-125Khz-RFID-Card-Reader
Die ersten Tests sind auch erfolgreich gewesen.
Ich verwende das UART-Protokoll des Moduls und lese es über ein Python Programm aus:
import serial
import sys
import time
import string
from operator import xor
# UART
ID= ""
Zeichen = 0
Checksumme = 0
Tag = 0
# Flags
Startflag = "\x02"
Endflag = "\x03"
# User ID
User = ""
Daniel = "03003C00B08F"
# UART oeffnen
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()
while True:
# Variablen loeschen
Checksumme = 0
Checksumme_Tag = 0
ID = ""
# Zeichen einlesen
Zeichen = UART.read()
# Uebertragungsstart signalisiert worden?
if Zeichen == Startflag:
# ID zusammen setzen
for Counter in range(13):
Zeichen = UART.read()
ID = ID + str(Zeichen)
# Endflag aus dem String loeschen
ID = ID.replace(Endflag, "" );
# Checksumme berechnen
for I in range(0, 9, 2):
Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) + int(ID[I+1], 16))
Checksumme = hex(Checksumme)
# Tag herausfiltern
Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) + ((int(ID[3], 16)) << 0)
Tag = hex(Tag)
# User herausfinden
if ID in Daniel:
User = "Daniel"
else:
User = "Unbekannt"
# Ausgabe der Daten
print "------------------------------------------"
print "Datensatz: ", ID
print "Tag: ", Tag
print "ID: ", ID[4:10]
print "Checksumme: ", Checksumme
print "------------------------------------------"
print "User: ", User
Eine Ausgabe sieht dann so aus:
http://img90.imageshack.us/img90/9572/rfid.jpg (http://imageshack.us/photo/my-images/90/rfid.jpg/)
- - - Aktualisiert - - -
So hab das Programm noch mal erweitert.
Unter /home/pi/Desktop/Sicherheit gibt es nun eine Datei "ID.txt" wo User-IDs mit Namen aufgeführt sind.
Dies sieht so aus:
Daniel:3C00B0
Hans:27B7C1
Das aktuelle Python Programm öffnet diese Datei, ließt sie aus und speichert die Einträge in einem Dictionary.
Sobald eine Karte ausgelesen wurde durchsucht das Programm dieses Dictionary nach der ID der Karte und gibt anschließend den User aus.
Das klappt schon wunderbar. Ich habe zwei Karten, denen ich den User "Hans" und "Daniel" zugewiesen habe.
Das Programm erkennt die beiden Benutzer und bei einem dritten Tag meldet es "Unbekannt".
import serial
import sys
import time
from operator import xor
# UART
Datensatz = ""
Zeichen = 0
# Flags
Startflag = "\x02"
Endflag = "\x03"
# User ID
ID = 0
Tag = 0
User = ""
Liste = {}
Checksumme = 0
# UART oeffnen
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()
# Datei oeffnen
Temp = open("/home/pi/Desktop/Sicherheit/ID.txt", "r")
# Datei zeilenweise auslesen
for Zeile in Temp:
# CR aus der Textzeile entfernen
Zeile = Zeile.replace("\n", "")
# LF aus der Textzeile entfernen
Zeile = Zeile.replace("\r", "")
# Textzeile aufteilen
Zeile = Zeile.split(":")
# ID aus der Datei in eine Zahl umwandeln
Zeile[1] = int(Zeile[1])
# Daten zu der Liste hinzufuegen
Liste[Zeile[1]] = Zeile[0]
while True:
# Variablen loeschen
Checksumme = 0
Checksumme_Tag = 0
Datensatz = ""
# Zeichen einlesen
Zeichen = UART.read()
# Uebertragungsstart signalisiert worden?
if Zeichen == Startflag:
# ID zusammen setzen
for Counter in range(13):
Zeichen = UART.read()
Datensatz = Datensatz + str(Zeichen)
# Endflag aus dem String loeschen
Datensatz = Datensatz.replace(Endflag, "" );
# Checksumme berechnen
for I in range(0, 9, 2):
Checksumme = Checksumme ^ (((int(Datensatz[I], 16)) << 4) + int(Datensatz[I+1], 16))
Checksumme = hex(Checksumme)
# Tag herausfiltern
Tag = ((int(Datensatz[1], 16)) << 8) + ((int(Datensatz[2], 16)) << 4) + ((int(Datensatz[3], 16)) << 0)
Tag = hex(Tag)
# ID herausfiltern und zum Suchen in einen Int umwandeln
ID = Datensatz[4:10]
ID = int(ID, 16)
# User herausfinden
User = Liste.get(ID, "Unbekannt")
# Ausgabe der Daten
print "------------------------------------------"
print "Datensatz: ", Datensatz
print "Tag: ", Tag
print "ID: ", ID
print "User: ", User
print "Checksumme: ", Checksumme
print "------------------------------------------"
Temp.close()
ich habe mir am Wochenende dieses RFID Modul bestellt:
http://www.watterott.com/de/Electronic-brick-125Khz-RFID-Card-Reader
Die ersten Tests sind auch erfolgreich gewesen.
Ich verwende das UART-Protokoll des Moduls und lese es über ein Python Programm aus:
import serial
import sys
import time
import string
from operator import xor
# UART
ID= ""
Zeichen = 0
Checksumme = 0
Tag = 0
# Flags
Startflag = "\x02"
Endflag = "\x03"
# User ID
User = ""
Daniel = "03003C00B08F"
# UART oeffnen
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()
while True:
# Variablen loeschen
Checksumme = 0
Checksumme_Tag = 0
ID = ""
# Zeichen einlesen
Zeichen = UART.read()
# Uebertragungsstart signalisiert worden?
if Zeichen == Startflag:
# ID zusammen setzen
for Counter in range(13):
Zeichen = UART.read()
ID = ID + str(Zeichen)
# Endflag aus dem String loeschen
ID = ID.replace(Endflag, "" );
# Checksumme berechnen
for I in range(0, 9, 2):
Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) + int(ID[I+1], 16))
Checksumme = hex(Checksumme)
# Tag herausfiltern
Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) + ((int(ID[3], 16)) << 0)
Tag = hex(Tag)
# User herausfinden
if ID in Daniel:
User = "Daniel"
else:
User = "Unbekannt"
# Ausgabe der Daten
print "------------------------------------------"
print "Datensatz: ", ID
print "Tag: ", Tag
print "ID: ", ID[4:10]
print "Checksumme: ", Checksumme
print "------------------------------------------"
print "User: ", User
Eine Ausgabe sieht dann so aus:
http://img90.imageshack.us/img90/9572/rfid.jpg (http://imageshack.us/photo/my-images/90/rfid.jpg/)
- - - Aktualisiert - - -
So hab das Programm noch mal erweitert.
Unter /home/pi/Desktop/Sicherheit gibt es nun eine Datei "ID.txt" wo User-IDs mit Namen aufgeführt sind.
Dies sieht so aus:
Daniel:3C00B0
Hans:27B7C1
Das aktuelle Python Programm öffnet diese Datei, ließt sie aus und speichert die Einträge in einem Dictionary.
Sobald eine Karte ausgelesen wurde durchsucht das Programm dieses Dictionary nach der ID der Karte und gibt anschließend den User aus.
Das klappt schon wunderbar. Ich habe zwei Karten, denen ich den User "Hans" und "Daniel" zugewiesen habe.
Das Programm erkennt die beiden Benutzer und bei einem dritten Tag meldet es "Unbekannt".
import serial
import sys
import time
from operator import xor
# UART
Datensatz = ""
Zeichen = 0
# Flags
Startflag = "\x02"
Endflag = "\x03"
# User ID
ID = 0
Tag = 0
User = ""
Liste = {}
Checksumme = 0
# UART oeffnen
UART = serial.Serial("/dev/ttyAMA0", 9600)
UART.open()
# Datei oeffnen
Temp = open("/home/pi/Desktop/Sicherheit/ID.txt", "r")
# Datei zeilenweise auslesen
for Zeile in Temp:
# CR aus der Textzeile entfernen
Zeile = Zeile.replace("\n", "")
# LF aus der Textzeile entfernen
Zeile = Zeile.replace("\r", "")
# Textzeile aufteilen
Zeile = Zeile.split(":")
# ID aus der Datei in eine Zahl umwandeln
Zeile[1] = int(Zeile[1])
# Daten zu der Liste hinzufuegen
Liste[Zeile[1]] = Zeile[0]
while True:
# Variablen loeschen
Checksumme = 0
Checksumme_Tag = 0
Datensatz = ""
# Zeichen einlesen
Zeichen = UART.read()
# Uebertragungsstart signalisiert worden?
if Zeichen == Startflag:
# ID zusammen setzen
for Counter in range(13):
Zeichen = UART.read()
Datensatz = Datensatz + str(Zeichen)
# Endflag aus dem String loeschen
Datensatz = Datensatz.replace(Endflag, "" );
# Checksumme berechnen
for I in range(0, 9, 2):
Checksumme = Checksumme ^ (((int(Datensatz[I], 16)) << 4) + int(Datensatz[I+1], 16))
Checksumme = hex(Checksumme)
# Tag herausfiltern
Tag = ((int(Datensatz[1], 16)) << 8) + ((int(Datensatz[2], 16)) << 4) + ((int(Datensatz[3], 16)) << 0)
Tag = hex(Tag)
# ID herausfiltern und zum Suchen in einen Int umwandeln
ID = Datensatz[4:10]
ID = int(ID, 16)
# User herausfinden
User = Liste.get(ID, "Unbekannt")
# Ausgabe der Daten
print "------------------------------------------"
print "Datensatz: ", Datensatz
print "Tag: ", Tag
print "ID: ", ID
print "User: ", User
print "Checksumme: ", Checksumme
print "------------------------------------------"
Temp.close()