-
Notifications
You must be signed in to change notification settings - Fork 0
/
CardReader.py
75 lines (60 loc) · 1.91 KB
/
CardReader.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
__author__ = 'stephan'
# requires pyserial, json, re
import serial
import json
import re
import time
class CardReader:
def __init__(self, bus_addr):
self.bus_addr = bus_addr
def check(self, ser):
# try communication
try:
ser.write("$%i/check\n" % self.bus_addr)
res = ser.readline()
res = re.sub(r'[^\x00-\x7F]+', ' ', res)
except:
self.log("Communication with node %i failed." % self.bus_addr)
return 0
if len(res) < 1:
return 0 # no data
try:
decoded = json.loads(res.strip())
except ValueError as err:
return 0
try:
check_result_data = decoded['check_result']
hasData = check_result_data['hasData']
# has data
if hasData == 1 and check_result_data['node'] == self.bus_addr:
card_nr = check_result_data['cardnr']
card_uid = check_result_data['uid']
if card_nr == "000000000000":
check_result_data['cardnr'] = "UI%i" % int(card_uid, 16)
# print check_result_data['cardnr']
return check_result_data
except:
self.log("ReadError")
return 0
def confirm(self, ser):
ser.write("$%i/confirm\n" % self.bus_addr)
res = ser.readline()
def deny(self, ser):
ser.write("$%i/deny\n" % self.bus_addr)
res = ser.readline()
def log(self, message):
print(message)
# example
def testCardReader():
ser = serial.Serial('/dev/ttyUSB1', 115200, timeout=0.05)
cr = CardReader(1)
while 1:
data = cr.check(ser)
if data is not 0:
cardNr = data['cardnr']
print(cardNr)
if cardNr == "158021227943":
cr.confirm(ser)
else:
cr.deny(ser)
time.sleep(0.2)