Cursor sind was kurzlebiges, das sollte nicht länger als eine Transaktion existieren.
Eine Klasse, die nur ein einziges Attribut hat, ist keine sinnvolle Klasse.
Du bindest den Rückgabewert von execute an Variablen, die nie benutzt werden, was ja auch klar ist, weil das keinen nutzbaren Rückgabewert hat.
Wenn das SELECT nur einen Wert liefern kann, dann ist eine for-Schleife und fetchall verwirrend.
Die Daten sollten schon die richtigen Typen haben, so dass die int- und str-Aufrufe unsinnig sein sollten. Ist der Rückgabewert von 0,0,0,0 wirklich sinnvoll?
Im Hauptprogramm ist das Signalhandling Schrott, man sollte keine globalen Variablen benutzen.
Code: Alles auswählen
from contextlib import closing
from RPi import GPIO
import MFRC522
import pymysql
# This is the default key for authentication
KEY = [0xFF,0xFF,0xFF,0xFF,0xFF,0xFF]
def initialize_db():
return pymysql.connect(host="localhost", user="NFC", passwd="blaa", db="NFC")
def add_user(db, rfid_id, name):
with closing(db.cursor()) as cursor:
cursor.execute("INSERT INTO users (UID, name) VALUES (%s,%s)", (rfid_id, name))
db.commit()
def mysql_read(db, rfid_id):
print("angekommen:", rfid_id)
with closing(db.cursor()) as cursor:
cursor.execute("SELECT name, UID, nummer, zeit FROM users WHERE nummer = %s", [rfid_id])
return cursor.fetchone()
def update_timestamp(db, rfid_id):
with closing(db.cursor()) as cursor:
cursor.execute("UPDATE users SET zeit = NOW() WHERE nummer = %s", [rfid_id])
db.commit()
def read_card(db, mifare_reader):
(status,TagType) = mifare_reader.MFRC522_Request(mifare_reader.PICC_REQIDL)
if status != mifare_reader.MI_OK:
return
print("Card detected")
# Get the UID of the card
(status,uid) = mifare_reader.MFRC522_Anticoll()
# If we have the UID, continue
if status != mifare_reader.MI_OK:
return
# Print UID
print("Card read UID: %s,%s,%s,%s" % (uid[0], uid[1], uid[2], uid[3]))
# Select the scanned tag
mifare_reader.MFRC522_SelectTag(uid)
# Authenticate
status = mifare_reader.MFRC522_Auth(mifare_reader.PICC_AUTHENT1A, 8, KEY, uid)
# Check if authenticated
if status != mifare_reader.MI_OK:
return
data = mifare_reader.MFRC522_Read(8)
mifare_reader.MFRC522_StopCrypto1()
if not data:
return
text = "".join(chr(x) for x in data)
print("Test:", text)
print("Data:", data)
print("UID:", uid)
check = db.mysql_read(uid)
print("Check:", check)
def main():
try:
db = initialize_db()
mifare_reader = MFRC522.MFRC522()
while True:
read_card(db, mifare_reader)
finally:
GPIO.cleanup()
if __name__ == "__main__":
main()