Mercurial > code > home > repos > homeauto
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 |
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 | 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 | 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 | 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() |