annotate service/rfid_pn532_py/rfid.py @ 1218:c571a45c944f

split console web component Ignore-this: 1af5e69fff09e7e5680ffb25e9236fc0 darcs-hash:7acb2532595a2073de5bb224ef708e57b84dc99d
author drewp <drewp@bigasterisk.com>
date Sat, 23 Mar 2019 13:57:44 -0700
parents c21f433ddbac
children f134b64a0ab7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1215
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
1 import os
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
2 os.environ['LIBNFC_DEFAULT_DEVICE'] = "pn532_i2c:/dev/i2c-1"
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
3
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
4 from docopt import docopt
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
5 from rdfdb.patch import Patch
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
6 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
7 from rdflib import Namespace, URIRef, Literal, Graph
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
8 from rdflib.parser import StringInputSource
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
9 from twisted.internet import reactor, task
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
10 import cyclone.web
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
11 from cyclone.httpclient import fetch
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
12 import cyclone
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
13 import logging, time, json, random, string
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
14 from logsetup import log, enableTwistedLog
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
15 from greplin import scales
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
16 from greplin.scales.cyclonehandler import StatsHandler
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
17 from tags import NfcDevice, FakeNfc
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
18
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
19 ROOM = Namespace('http://projects.bigasterisk.com/room/')
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
20
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
21 ctx = ROOM['frontDoorWindowRfidCtx']
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
22
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
23 STATS = scales.collection('/web',
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
24 scales.PmfStat('cardReadPoll'),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
25 )
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
26
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
27 class OutputPage(cyclone.web.RequestHandler):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
28 def put(self):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
29 arg = self.request.arguments
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
30 if arg.get('s') and arg.get('p'):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
31 self._onQueryStringStatement(arg['s'][-1], arg['p'][-1], self.request.body)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
32 else:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
33 self._onGraphBodyStatements(self.request.body, self.request.headers)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
34 post = put
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
35 def _onQueryStringStatement(self, s, p, body):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
36 subj = URIRef(s)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
37 pred = URIRef(p)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
38 turtleLiteral = self.request.body
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
39 try:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
40 obj = Literal(float(turtleLiteral))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
41 except ValueError:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
42 obj = Literal(turtleLiteral)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
43 self._onStatements([(subj, pred, obj)])
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
44
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
45 def _onGraphBodyStatements(self, body, headers):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
46 g = Graph()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
47 g.parse(StringInputSource(body), format='nt')
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
48 if not g:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
49 raise ValueError("expected graph body")
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
50 self._onStatements(list(g.triples((None, None, None))))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
51 post = put
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
52
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
53 def _onStatements(self, stmts):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
54 # write rfid to new key, etc.
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
55 if len(stmts) > 0 and stmts[0][1] == ROOM['keyContents']:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
56 return
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
57 log.warn("ignoring %s", stmts)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
58
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
59 def uidUri(card_id):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
60 return URIRef('http://bigasterisk.com/rfidCard/%s' % card_id)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
61
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
62 BODY_VERSION = "1"
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
63 def randomBody():
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
64 return BODY_VERSION + '*' + ''.join(random.choice(string.ascii_uppercase) for n in range(16 - 2))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
65
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
66 def looksLikeBigasterisk(text):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
67 return text.startswith(BODY_VERSION + "*")
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
68
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
69 class Rewrite(cyclone.web.RequestHandler):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
70 def post(self):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
71 agent = URIRef(self.request.headers['x-foaf-agent'])
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
72 body = json.loads(self.request.body)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
73
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
74 _, uid = reader.read_id()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
75 log.info('current card id: %r %r', _, uid)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
76 if uid is None:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
77 self.set_status(404, "no card present")
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
78 # maybe retry a few more times since the card might be nearby
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
79 return
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
80
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
81 text = randomBody()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
82 log.info('%s rewrites %s to %s, to be owned by %s',
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
83 agent, uid, text, body['user'])
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
84
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
85 #reader.KEY = private.rfid_key
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
86 reader.write(uid, text)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
87 log.info('done with write')
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
88
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
89
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
90 sensor = ROOM['frontDoorWindowRfid']
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
91
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
92 class ReadLoop(object):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
93 def __init__(self, reader, masterGraph, overwrite_any_tag):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
94 self.reader = reader
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
95 self.masterGraph = masterGraph
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
96 self.overwrite_any_tag = overwrite_any_tag
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
97 self.log = {} # cardIdUri : most recent seentime
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
98
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
99 self.pollPeriodSecs = 5.1
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
100 self.expireSecs = 5
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
101
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
102 task.LoopingCall(self.poll).start(self.pollPeriodSecs)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
103
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
104 @STATS.cardReadPoll.time()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
105 def poll(self):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
106 now = time.time()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
107
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
108 self.flushOldReads(now)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
109
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
110 for tag in self.reader.getTags(): # blocks for a bit
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
111 uid = tag.uid()
1217
c21f433ddbac less logging
drewp <drewp@bigasterisk.com>
parents: 1215
diff changeset
112 log.debug('detected tag uid=%r', uid)
1215
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
113 cardIdUri = uidUri(uid)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
114
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
115 is_new = cardIdUri not in self.log
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
116 self.log[cardIdUri] = now
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
117 if is_new:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
118 tag.connect()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
119 try:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
120 textLit = Literal(tag.readBlock(1).rstrip('\x00'))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
121 if self.overwrite_any_tag and not looksLikeBigasterisk(textLit):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
122 log.info("block 1 was %r; rewriting it", textLit)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
123 tag.writeBlock(1, randomBody())
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
124 textLit = Literal(tag.readBlock(1).rstrip('\x00'))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
125 finally:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
126 tag.disconnect()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
127 self.startCardRead(cardIdUri, textLit)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
128
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
129 def flushOldReads(self, now):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
130 for uri in list(self.log):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
131 if self.log[uri] < now - self.expireSecs:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
132 self.endCardRead(uri)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
133 del self.log[uri]
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
134
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
135 def startCardRead(self, cardUri, text):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
136 self.masterGraph.patch(Patch(addQuads=[
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
137 (sensor, ROOM['reading'], cardUri, ctx),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
138 (cardUri, ROOM['cardText'], text, ctx)],
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
139 delQuads=[]))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
140 log.info('read card at id=%s %r', cardUri, str(text))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
141 self._sendOneshot([(sensor, ROOM['startReading'], cardUri),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
142 (cardUri, ROOM['cardText'], text)])
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
143
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
144 def endCardRead(self, cardUri):
1217
c21f433ddbac less logging
drewp <drewp@bigasterisk.com>
parents: 1215
diff changeset
145 log.debug(f'{cardUri} has been gone for {self.expireSecs} sec')
1215
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
146 delQuads = []
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
147 for spo in self.masterGraph._graph.triples(
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
148 (sensor, ROOM['reading'], cardUri)):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
149 delQuads.append(spo + (ctx,))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
150 for spo in self.masterGraph._graph.triples(
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
151 (cardUri, ROOM['cardText'], None)):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
152 delQuads.append(spo + (ctx,))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
153
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
154 self.masterGraph.patch(Patch(addQuads=[], delQuads=delQuads))
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
155
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
156 def _sendOneshot(self, oneshot):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
157 body = (' '.join('%s %s %s .' % (s.n3(), p.n3(), o.n3())
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
158 for s,p,o in oneshot)).encode('utf8')
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
159 url = b'http://bang6:19071/oneShot'
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
160 d = fetch(method=b'POST',
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
161 url=url,
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
162 headers={b'Content-Type': [b'text/n3']},
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
163 postdata=body,
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
164 timeout=5)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
165 def err(e):
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
166 log.info('oneshot post to %r failed: %s',
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
167 url, e.getErrorMessage())
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
168 d.addErrback(err)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
169
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
170
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
171
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
172 if __name__ == '__main__':
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
173 arg = docopt("""
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
174 Usage: rfid.py [options]
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
175
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
176 -v Verbose
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
177 --overwrite_any_tag Rewrite any unknown tag with a new random body
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
178 -n Fake reader
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
179 """)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
180 log.setLevel(logging.INFO)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
181 if arg['-v']:
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
182 enableTwistedLog()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
183 log.setLevel(logging.DEBUG)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
184 log.info(f'cyclone {cyclone.__version__}')
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
185
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
186 masterGraph = PatchableGraph()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
187 reader = NfcDevice() if not arg['-n'] else FakeNfc()
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
188
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
189 loop = ReadLoop(reader, masterGraph, overwrite_any_tag=arg['--overwrite_any_tag'])
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
190
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
191 port = 10012
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
192 reactor.listenTCP(port, cyclone.web.Application([
1218
c571a45c944f split console web component
drewp <drewp@bigasterisk.com>
parents: 1217
diff changeset
193 (r"/(|.+\.html)", cyclone.web.StaticFileHandler,
1215
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
194 {"path": ".", "default_filename": "index.html"}),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
195 (r"/graph", CycloneGraphHandler, {'masterGraph': masterGraph}),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
196 (r"/graph/events", CycloneGraphEventsHandler,
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
197 {'masterGraph': masterGraph}),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
198 (r'/output', OutputPage),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
199 (r'/rewrite', Rewrite),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
200 (r'/stats/(.*)', StatsHandler, {'serverName': 'rfid'}),
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
201 ], masterGraph=masterGraph, debug=arg['-v']), interface='::')
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
202 log.warn('serving on %s', port)
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
203
b48f1ecbc078 copy rest of rfid service from the first try. fix some crashes in tags.py
drewp <drewp@bigasterisk.com>
parents:
diff changeset
204 reactor.run()