-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnfc_access.py
267 lines (212 loc) · 8.7 KB
/
nfc_access.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>
"""
projet tuteuré 2014-2015
repris par LW
"""
# Importation des bibliotheques
from __future__ import print_function, division
import RPi.GPIO as GPIO
import pingo
from pingo.parts.led import Led
#from pingo.parts.button import Switch
#import time
from time import sleep
import nxppy
import sqlite3
import logging
from logging.handlers import RotatingFileHandler
# CONFIGURATION DES LOGS
# création de l'objet logger qui va nous servir à écrire dans les logs
logger = logging.getLogger()
# on met le niveau du logger à DEBUG, comme ça il écrit tout
logger.setLevel(logging.DEBUG)
# création d'un formateur qui va ajouter le temps, le niveau
# de chaque message quand on écrira un message dans le log
formatter = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s')
# création d'un handler qui va rediriger une écriture du log vers
# un fichier en mode 'append', avec 1 backup et une taille max de 10Mo
file_handler = RotatingFileHandler('/home/pi/LOGS/LOG_raspAccess.log', 'a', 10000000, 1)
# on lui met le niveau sur DEBUG, on lui dit qu'il doit utiliser le formateur
# créé précédement et on ajoute ce handler au logger
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# création d'un second handler qui va rediriger chaque écriture de log
# sur la console
steam_handler = logging.StreamHandler()
steam_handler.setLevel(logging.DEBUG)
logger.addHandler(steam_handler)
logger.info('Start script')
def lecture():
""" Lecture d'une carte NFC """
mifare = nxppy.Mifare()
data = ""
try:
data = mifare.select()
logger.debug("UID=" + str(data))
except nxppy.SelectError:
pass
return data
def createTable(dbname):
try:
db = sqlite3.connect(dbname)
cursor = db.cursor()
cursor.execute(''' CREATE TABLE IF NOT EXISTS carte(
id INTEGER PRIMARY KEY,
card TEXT,
m INTEGER) ''')
db.commit()
except Exception as e:
# Roll back any change if something goes wrong
logger.info("Erreur lors de la creation de la table")
db.rollback()
raise e
finally:
db.close()
def insertcard(dbname, uid):
try:
db = sqlite3.connect(dbname)
cursor = db.cursor()
cursor.execute('''INSERT INTO carte (card) values (?)''' , (uid,))
db.commit()
logger.info("la carte %s a ete ajoute" % (uid))
except Exception as e:
# Roll back any change if something goes wrong
logger.debug("Erreur lors de l'execution du script SQL")
db.rollback()
raise e
finally:
db.close()
def deletecard(dbname, uid):
try:
db = sqlite3.connect(dbname)
cursor = db.cursor()
cursor.execute('''delete from carte where card=(?)''' , (uid,))
db.commit()
logger.info('la carte %s a ete supprime' % (uid))
except Exception as e:
# Roll back any change if something goes wrong
logger.debug("Erreur lors de l'execution du script SQL")
db.rollback()
raise e
finally:
db.close()
def getlisteofcards(dbname):
try:
db = sqlite3.connect(dbname)
cursor = db.cursor()
cursor.execute('''SELECT * FROM carte''')
listebdd = cursor.fetchall()
except Exception as e:
# Roll back any change if something goes wrong
logger.debug("Erreur lors de l'execution du script SQL")
db.rollback()
raise e
finally:
db.close()
return listebdd
def main():
""" Fonction principale """
MASTER = '04F1D561EE0280'
BDD_NAME = "nfc2.db"
# Definition des ports en entre/sortie
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(4, GPIO.OUT) #Sortie relais
GPIO.output(4, GPIO.LOW) #initialise la sortie relais
board = pingo.detect.get_board()
red_led_pin = board.pins[12] #GPIO18
r_led = Led(red_led_pin)
green_led_pin = board.pins[11] #GPIO17
g_led = Led(green_led_pin)
r_led.off()
g_led.off()
black_btn_pin = board.pins[15] #GPIO22
red_btn_pin = board.pins[22] #GPIO25
black_btn_pin.mode = pingo.IN
red_btn_pin.mode = pingo.IN
#Test leds
g_led.on()
r_led.on()
sleep(1)
g_led.off()
r_led.off()
# Creation de la table si elle n'existe pas
createTable(BDD_NAME)
# Debut du programme
while True:
uid = lecture()
#************************************
#*** Detection de la carte MASTER ***
#************************************
if uid == MASTER: # Si la carte maitre est detectee
# Condition pour l'AJOUT d une carte
if (black_btn_pin.state == pingo.LOW and red_btn_pin.state == pingo.HIGH): # Si seul le bouton poussoir noir est appuye
logger.debug("Presente la carte a ajouter")
# Clignotement LED verte
# Donne aussi le temps de présenter la carte a enregistrer
for i in range(4):
g_led.on()
sleep(0.4)
g_led.off()
sleep(0.4)
#g_led.blink(times=5, on_delay=0.4, off_delay=0.4) # blink
# Fin clignotement
uid = lecture()
listebdd = getlisteofcards(BDD_NAME) # Lecture de la base de donnee
if str(uid) in str(listebdd): # Si la carte est dans la BDD
logger.debug('la carte ' + str(uid) + ' est deja autorisee')
r_led.on() # Allumer LED rouge
elif str(uid) == "None": # Si pas de carte detectee
logger.debug("Aucune carte detectee")
r_led.on() # Allumer LED rouge
else:
insertcard(BDD_NAME, uid)
g_led.on() # Allumer LED verte
sleep(1)
g_led.off() # Eteindre LED verte
sleep(1)
r_led.off() # Eteindre LED rouge
#Condition pour la SUPPRESSION d une carte
elif (black_btn_pin.state == pingo.HIGH and red_btn_pin.state == pingo.LOW): # Si seul le bouton poussoir rouge est appuye
logger.debug("Presente la carte a supprimer")
# Clignotement LED rouge
# Donne aussi le temps de présenter la carte
for i in range(4):
r_led.on()
sleep(0.4)
r_led.off()
sleep(0.4)
#r_led.blink(times=4, on_delay=0.4, off_delay=0.4) # blink forever
uid = lecture()
listebdd = getlisteofcards(BDD_NAME) # Lecture de la base de donnee
if uid == MASTER: # Si on presente la carte maitre
logger.warning("Tentative de suppression de la carte MAITRE")
r_led.on() # Allumer LED rouge
sleep(1)
r_led.off() # Eteindre LED rouge
elif str(uid) in str(listebdd): # Si la carte est dans la BDD
deletecard(BDD_NAME, uid) # Suppression dans la BDD
g_led.on() # Allumer LED verte
sleep(1)
g_led.off() # Eteindre LED verte
else:
logger.debug("La carte %s n est pas dans la base de donnee" % (uid))
r_led.on() # Allumer LED rouge
sleep(1)
r_led.off() # Eteindre LED rouge
if (uid != "" and red_btn_pin.state == pingo.HIGH and black_btn_pin.state == pingo.HIGH): # Si aucun bouton poussoir n est presse
listebdd = getlisteofcards(BDD_NAME) # Lecture de la base de donnee
if str(uid) in str(listebdd): # Si la carte est dans la BDD
logger.info("%s ouvre de la porte" % (uid))
g_led.on() # Allumer LED verte
GPIO.output(4, GPIO.HIGH) # Declencher relais
sleep(5)
g_led.off() # Eteindre LED verte
GPIO.output(4, GPIO.LOW) # Arret du declenchement du relais
logger.debug("Verrouillage de la porte")
sleep(1)
if __name__ == "__main__":
main()