Guest User

Untitled

a guest
Jan 20th, 2017
106
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import os
  2. import sys
  3. import serial
  4. import select
  5. import signal
  6. import time
  7. import datetime
  8. from functools import partial
  9. import MySQLdb
  10. import RPi.GPIO as GPIO
  11. from Queue import Queue
  12.  
  13. queue = Queue()
  14.  
  15. # Alle GPIOs auf Output setzen
  16. GPIO.setmode(GPIO.BOARD)
  17. GPIO.setup(29, GPIO.OUT) #LED1 BCM5
  18. GPIO.setup(31, GPIO.OUT) #LED2 BCM6
  19. GPIO.setup(37, GPIO.OUT) #LED3 BCM26
  20. GPIO.setup(16, GPIO.OUT) #RELAIS1 BCM23
  21. GPIO.setup(18, GPIO.OUT) #RELAIS2 BCM24
  22. GPIO.setup(36, GPIO.OUT) #RELAIS3 BCM16
  23.  
  24. # Alle GPIOs auf 0 setzen
  25. GPIO.output(29, GPIO.LOW) #LED1
  26. GPIO.output(31, GPIO.LOW) #LED2
  27. GPIO.output(37, GPIO.LOW) #LED3
  28. GPIO.output(16, GPIO.LOW) #RELAIS1
  29. GPIO.output(18, GPIO.LOW) #RELAIS2
  30. GPIO.output(36, GPIO.LOW) #RELAIS3
  31.  
  32. # Datenbankconnection
  33. db = MySQLdb.connect(host="localhost",      # your host, usually localhost
  34.                      user="root",           # your username
  35.                      passwd="raspberry",    # your password
  36.                      db="rfid")             # name of the data base
  37.                      
  38. # RFID
  39. ID = ""
  40. Zeichen = 0
  41. decuid = ""
  42. Checksumme = 0
  43. Tag = 0
  44. Startflag = "\x02"
  45. Endflag = "\x03"
  46.  
  47.  
  48. class SelectLoop(object):
  49.     def __init__(self, *a, **k):
  50.         super(SelectLoop, self).__init__(*a, **k)
  51.         self._input_mapping = {}
  52.  
  53.     def add_file(self, fileobject, callback):
  54.         self._input_mapping[fileobject] = callback
  55.  
  56.     def mainloop(self):
  57.         while True:
  58.             #print self._input_mapping.keys()
  59.             read_fds, _, _ = select.select(
  60.                 self._input_mapping.keys(),
  61.                 [],
  62.                 [],
  63.             )
  64.             for fd in read_fds:
  65.                 self._input_mapping[fd](fd)
  66.  
  67. # RFID-Auslesung
  68. def read_file(filename, fileobject):
  69.     # Prüfen ob Startflag im Ausleseobjekt vorhanden
  70.     if fileobject.read() == Startflag:
  71.       # TAG-Daten leeren
  72.       doppelausloeser = 0
  73.       Checksumme = 0
  74.       Checksumme_Tag = 0
  75.       ID = ""
  76.  
  77.       # ID zusammen setzen
  78.       for Counter in range(13):
  79.  
  80.         Zeichen = fileobject.read()
  81.         ID = ID + str(Zeichen)
  82.  
  83.         # Endflag aus dem String loeschen
  84.         ID = ID.replace(Endflag, "" );
  85.        
  86.       # Checksumme berechnen
  87.       for I in range(0, 9, 2):
  88.         Checksumme = Checksumme ^ (((int(ID[I], 16)) << 4) + int(ID[I+1], 16))
  89.       Checksumme = hex(Checksumme)
  90.      
  91.       # Tag herausfiltern
  92.       Tag = ((int(ID[1], 16)) << 8) + ((int(ID[2], 16)) << 4) + ((int(ID[3], 16)) << 0)
  93.       Tag = hex(Tag)
  94.  
  95.       # Ausgabe der Daten
  96.       #print "------------------------------------------"
  97.       #print "HEX-UID: ", ID[4:10]
  98.      
  99.       # UID in Dezimal speichern
  100.       decuid = int(ID[4:10],16)
  101.       while 10-len(str(decuid)) > 0:
  102.         decuid = "0" + str(decuid)
  103.  
  104.  
  105.       # Doppelausloeser vermeiden
  106.       while not queue.empty():
  107.         timestamp, UID = queue.get()
  108.         if (decuid == UID) and ((time.time() - timestamp) <= 10):        
  109.           doppelausloeser = 1
  110.       queue.put( (time.time(), decuid) )   # tuple of unix-timestamp and UID
  111.      
  112.       # Lesestation + Dezimal-UID ausgeben
  113.       print filename, decuid
  114.      
  115.       # Doppelausloeser filtern
  116.       if doppelausloeser == 1:
  117.         print "Doppelausloeser! ID %s wurde in den letzten 10 Sekunden schon mal eingelesen!" % decuid
  118.       # Kein Doppelausloeser, UID auswerten
  119.       else:    
  120.         # Zutritt auf 0 setzen
  121.         zutritt = 0
  122.         # Datenbankverarbeitung
  123.         cur = db.cursor()
  124.         try:
  125.           # UID mit bekannten Tags in Datenbank abgleichen
  126.           cur.execute("SELECT * FROM tags_known WHERE uid = (%s)", (decuid))
  127.           rows = cur.fetchall()
  128.          
  129.           if rows:
  130.             for row in rows:
  131.               # Gültigkeitszeit aus DB auslesen
  132.               timefrom = str(row[4])
  133.               timeto = str(row[5])
  134.               datefrom = str(row[6])
  135.               dateto = str(row[7])
  136.               print "UID gefunden!"
  137.              
  138.               # Zeitumrechnung in Sekunden
  139.               zeitfrom_db = int(timefrom.split(':',3)[0])*3600 + int(timefrom.split(':',3)[1])*60 + int(timefrom.split(':',3)[2])
  140.               zeitto_db = int(timeto.split(':',3)[0])*3600 + int(timeto.split(':',3)[1])*60 + int(timeto.split(':',3)[2])
  141.               zeitjetzt = int(time.strftime("%H"))*3600 + int(time.strftime("%M"))*60 + int(time.strftime("%S"))
  142.              
  143.               # Zeitzutritt prüfen
  144.               if zeitfrom_db < zeitjetzt and zeitto_db > zeitjetzt:
  145.                 zutritt = 1
  146.               elif zeitto_db < zeitfrom_db:
  147.                 if zeitfrom_db < zeitjetzt+86400 and zeitto_db+86400 > zeitjetzt+86400:
  148.                   zutritt = 1
  149.               elif zeitfrom_db == 0 and zeitto_db == 0:
  150.                 zutritt = 1
  151.               else:
  152.                 zutritt = 0
  153.    
  154.               # Datumszutritt
  155.               if zutritt != 0:
  156.                 if datefrom == "None" or dateto == "None":
  157.                   zutritt = 1
  158.                 else:
  159.                   # Datumsumrechnung
  160.                   jahrfrom = datefrom.split('-',3)[0]
  161.                   monatfrom = datefrom.split('-',3)[1]
  162.                   tagfrom = datefrom.split('-',3)[2]
  163.                   jahrto = dateto.split('-',3)[0]
  164.                   monatto = dateto.split('-',3)[1]
  165.                   tagto = dateto.split('-',3)[2]
  166.                  
  167.                   if datetime.date.today() >= datetime.date(int(jahrfrom), int(monatfrom), int(tagfrom)) and datetime.date.today() <= datetime.date(int(jahrto), int(monatto), int(tagto)):
  168.                     zutritt = 1
  169.                   else:
  170.                     zutritt = 0
  171.                    
  172.               # Zutritt akzeptiert    
  173.               if zutritt != 0:
  174.                 print "Zutritt Akzeptiert!"
  175.                 # Unterscheidung Lesestation -> Relais + LED schalten
  176.                 if filename == "/dev/USB1":
  177.                   GPIO.output(29, GPIO.HIGH) #LED1
  178.                   GPIO.output(16, GPIO.HIGH) #RELAIS1
  179.                   time.sleep(1)
  180.                   GPIO.output(29, GPIO.LOW) #LED21
  181.                   GPIO.output(16, GPIO.LOW) #RELAIS1
  182.                 elif filename == "/dev/USB2":
  183.                   GPIO.output(31, GPIO.HIGH) #LED2
  184.                   GPIO.output(18, GPIO.HIGH) #RELAIS2
  185.                   time.sleep(1)
  186.                   GPIO.output(31, GPIO.LOW) #LED2
  187.                   GPIO.output(18, GPIO.LOW) #RELAIS2
  188.                 elif filename == "/dev/USB3":
  189.                   GPIO.output(37, GPIO.HIGH) #LED3
  190.                   GPIO.output(36, GPIO.HIGH) #RELAIS3
  191.                   time.sleep(1)
  192.                   GPIO.output(37, GPIO.LOW) #LED3
  193.                   GPIO.output(36, GPIO.LOW) #RELAIS3
  194.                  
  195.                 # Access_Log schreiben
  196.                 try:
  197.                   cur.execute("INSERT INTO access_log(uid, reader, access) values (%s, %s, '1')", (decuid, filename[-1]))
  198.                   print "Zutrittslog erfolgreich geschrieben!"
  199.                   db.commit()
  200.                 except:
  201.                   print "Datenbankfehler!"
  202.                   db.rollback()
  203.               else:
  204.                 print "Zutritt abgelehnt!"
  205.                 db.rollback()
  206.                 # Zutritt abgelehnt -> Lesestation unterscheiden und LED blinken
  207.                 if filename == "/dev/USB1":
  208.                   GPIO.output(29, GPIO.HIGH) #LED1
  209.                   time.sleep(0.2)
  210.                   GPIO.output(29, GPIO.LOW) #LED1
  211.                   time.sleep(0.1)
  212.                   GPIO.output(29, GPIO.HIGH) #LED1
  213.                   time.sleep(0.2)
  214.                   GPIO.output(29, GPIO.LOW) #LED1
  215.                   time.sleep(0.1)
  216.                   GPIO.output(29, GPIO.HIGH) #LED1
  217.                   time.sleep(0.2)
  218.                   GPIO.output(29, GPIO.LOW) #LED1
  219.                 elif filename == "/dev/USB2":
  220.                   GPIO.output(31, GPIO.HIGH) #LED1
  221.                   time.sleep(0.2)
  222.                   GPIO.output(31, GPIO.LOW) #LED1
  223.                   time.sleep(0.1)
  224.                   GPIO.output(31, GPIO.HIGH) #LED1
  225.                   time.sleep(0.2)
  226.                   GPIO.output(31, GPIO.LOW) #LED1
  227.                   time.sleep(0.1)
  228.                   GPIO.output(31, GPIO.HIGH) #LED1
  229.                   time.sleep(0.2)
  230.                   GPIO.output(31, GPIO.LOW) #LED1
  231.                 elif filename == "/dev/USB3":
  232.                   GPIO.output(37, GPIO.HIGH) #LED1
  233.                   time.sleep(0.2)
  234.                   GPIO.output(37, GPIO.LOW) #LED1
  235.                   time.sleep(0.1)
  236.                   GPIO.output(37, GPIO.HIGH) #LED1
  237.                   time.sleep(0.2)
  238.                   GPIO.output(37, GPIO.LOW) #LED1
  239.                   time.sleep(0.1)
  240.                   GPIO.output(37, GPIO.HIGH) #LED1
  241.                   time.sleep(0.2)
  242.                   GPIO.output(37, GPIO.LOW) #LED1
  243.                
  244.           else:
  245.             # Zutritt abgelehnt -> Lesestation unterscheiden und LED blinken
  246.             if filename == "/dev/USB1":
  247.               GPIO.output(29, GPIO.HIGH) #LED1
  248.               time.sleep(0.2)
  249.               GPIO.output(29, GPIO.LOW) #LED1
  250.               time.sleep(0.1)
  251.               GPIO.output(29, GPIO.HIGH) #LED1
  252.               time.sleep(0.2)
  253.               GPIO.output(29, GPIO.LOW) #LED1
  254.               time.sleep(0.1)
  255.               GPIO.output(29, GPIO.HIGH) #LED1
  256.               time.sleep(0.2)
  257.               GPIO.output(29, GPIO.LOW) #LED1
  258.             elif filename == "/dev/USB2":
  259.               GPIO.output(31, GPIO.HIGH) #LED1
  260.               time.sleep(0.2)
  261.               GPIO.output(31, GPIO.LOW) #LED1
  262.               time.sleep(0.1)
  263.               GPIO.output(31, GPIO.HIGH) #LED1
  264.               time.sleep(0.2)
  265.               GPIO.output(31, GPIO.LOW) #LED1
  266.               time.sleep(0.1)
  267.               GPIO.output(31, GPIO.HIGH) #LED1
  268.               time.sleep(0.2)
  269.               GPIO.output(31, GPIO.LOW) #LED1
  270.             elif filename == "/dev/USB3":
  271.               GPIO.output(37, GPIO.HIGH) #LED1
  272.               time.sleep(0.2)
  273.               GPIO.output(37, GPIO.LOW) #LED1
  274.               time.sleep(0.1)
  275.               GPIO.output(37, GPIO.HIGH) #LED1
  276.               time.sleep(0.2)
  277.               GPIO.output(37, GPIO.LOW) #LED1
  278.               time.sleep(0.1)
  279.               GPIO.output(37, GPIO.HIGH) #LED1
  280.               time.sleep(0.2)
  281.               GPIO.output(37, GPIO.LOW) #LED1
  282.                  
  283.             # Unbekannte UID in Datenbank schreiben
  284.             try:
  285.               cur.execute("SELECT * FROM tags_new WHERE uid = (%s)", (decuid))
  286.               row = cur.fetchone()
  287.               if row == None:
  288.                 cur.execute("INSERT INTO tags_new(uid) values (%s)", (decuid))
  289.                 print "Unbekannte UID "+decuid+" erfolgreich in die Datenbank geschrieben"
  290.               else:
  291.                 print "Unbekannte UID "+decuid+" bereits vorhanden!"
  292.               db.commit()
  293.             except:
  294.               print "Datenbankfehler!"
  295.               db.rollback()
  296.             # Access_Log schreiben
  297.             try:
  298.               cur.execute("INSERT INTO access_log(uid, reader, access) values (%s, %s, '0')", (decuid, filename[-1]))
  299.               print "Zutrittslog erfolgreich geschrieben!"
  300.               db.commit()
  301.             except:
  302.               print "Datenbankfehler!"
  303.               db.rollback()
  304.          
  305.         except:
  306.           print "Datenbankfehler!"
  307.           db.rollback()
  308.         cur.close()
  309.        
  310.      
  311.  
  312. def main():
  313.     loop = SelectLoop()
  314.     for fname in sys.argv[1:]:
  315.         # Serielle Schnittstelle einstellen
  316.         ser = serial.Serial()
  317.         ser.port = fname
  318.         ser.baudrate = 9600
  319.         try:
  320.             # Serielle Schnittstelle öffnen
  321.             ser.open()
  322.         except Exception, e:
  323.             print "Error open serial port: " + str(e)
  324.             continue
  325.         if ser.isOpen():
  326.             try:
  327.                 # Serielle Schnittstelle leeren
  328.                 ser.flushInput()    #flush input buffer, discarding all its contents
  329.                 ser.flushOutput()   #flush output buffer, aborting current output and discard all that is in buffer
  330.                 loop.add_file(ser, partial(read_file, fname))
  331.             except Exception, e:
  332.                 print "Error...: " + str(e)
  333.     loop.mainloop()
  334.  
  335.  
  336. if __name__ == '__main__':
  337.         main()
RAW Paste Data