Skip to content

Commit ae6deb8

Browse files
committed
add rfid listener
1 parent c27e47c commit ae6deb8

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

doorctl.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def enable(conn, rfid):
8282
def disable(conn, rfid):
8383
userdb.disable(conn, encode_rfid(rfid))
8484

85-
sock_commands = ('addkey', 'openmode', 'authmode', 'resetpin')
85+
sock_commands = ('addkey', 'openmode', 'authmode', 'resetpin', 'rfidlisten')
8686

8787
db_commands = collections.OrderedDict([
8888
( 'initdb' , (userdb.init_db, 0, '') ),
@@ -104,11 +104,14 @@ def usage():
104104
pre = " "+sys.argv[0]
105105
sys.exit(1)
106106

107-
def socket_command(command):
107+
def socket_command(command, close=True):
108108
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
109109
s.connect( (host, port) )
110110
s.send(command+'\n')
111-
s.close()
111+
if close:
112+
s.close()
113+
else:
114+
return s
112115

113116
if len(sys.argv) < 2:
114117
usage()
@@ -117,7 +120,11 @@ def socket_command(command):
117120
args = sys.argv[2:]
118121

119122
if cmd in sock_commands:
120-
socket_command(cmd)
123+
if cmd == 'rfidlisten':
124+
for line in socket_command(cmd, close = False).makefile():
125+
print decode_rfid(line.rstrip('\n\r\0'))
126+
else:
127+
socket_command(cmd)
121128
elif cmd in db_commands:
122129
func, n_args, _ = db_commands[cmd]
123130
if len(args) != n_args:

doorio.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def __init__(self, auth_serial, lock_serial, cmd_in=None, socket=None):
1010
self._auth = auth_serial
1111
self._lock = lock_serial
1212
self._socklist = []
13+
self._rfidsocks = []
1314
self._cmd_in = cmd_in
1415
self._sock = socket
1516
self._led_state = "LED OFF"
@@ -44,13 +45,22 @@ def led_blink(self):
4445
self._led_state = 'LED BLINK\n'
4546
self.update_led()
4647

48+
def socket_remove(self, s):
49+
s.close()
50+
self._socklist.remove(pair)
51+
if s in self._rfidsocks:
52+
self._rfidsocks.remove(s)
53+
4754
def get_socket_line(self):
4855
for pair in self._socklist:
4956
s, data = pair
5057
if data.find('\n') >= 0:
5158
pair[1] = data[data.find('\n')+1:]
5259
data = data[:data.find('\n')+1]
53-
return data
60+
if data == 'rfidlisten':
61+
self._rfidsocks.append(s)
62+
else:
63+
return data
5464
else:
5565
return None
5666

@@ -64,11 +74,17 @@ def read_socket_data(self, r):
6474
read_data = ''
6575

6676
if read_data == '':
67-
s.close()
68-
self._socklist.remove(pair)
77+
self.socket_remove(s)
6978
else:
7079
pair[1] += read_data
7180

81+
def write_rfid(self):
82+
for s in self._rfidsocks:
83+
try:
84+
s.send(code+'\n')
85+
except IOError:
86+
self.socket_remove(s)
87+
7288
def get_command(self, line):
7389
cmd = line.rstrip('\r\n\0')
7490

@@ -118,6 +134,7 @@ def get_event(self, timeout=None):
118134
if line.startswith("RFID "):
119135
code = line.strip("RFID ")
120136
if re.match("^[01]{34}$", code):
137+
self.write_rfid()
121138
return { 'type': 'rfid', 'value': code }
122139

123140
if line == 'RESET':

start_doorbotd.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/bin/bash
22
ERRLOG=/srv/doorbot/doorbot.err
33
cd "$(dirname "$0")"
4-
su "$(stat -c "%U" user.db)" -c "while true; do python ./doorbotd.py; sleep 5; done" >>"$ERRLOG" 2>&1 &
4+
su "$(stat -c "%U" user.db)" -c "while true; do python ./doorbotd.py && exit; sleep 5; done" >>"$ERRLOG" 2>&1 &

0 commit comments

Comments
 (0)