# HG changeset patch # User drewp@bigasterisk.com # Date 1580949548 28800 # Node ID 2866c155eb07bab052b52af4a4584c883a2272b7 # Parent b87b6e9cedb21afcde2411301779167f2324e60e rm older rfid attempt using MFRC522 chip Ignore-this: b84ff118c941f594b71bcbdec9d58db4 diff -r b87b6e9cedb2 -r 2866c155eb07 service/rfid/Dockerfile --- a/service/rfid/Dockerfile Wed Feb 05 00:29:13 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -FROM bang6:5000/base_x86 - -WORKDIR /opt - - - -COPY requirements.txt . - -RUN pip install -r requirements.txt - -COPY *.py *.html *.js ./ - -EXPOSE 10012 - - diff -r b87b6e9cedb2 -r 2866c155eb07 service/rfid/Dockerfile.pi --- a/service/rfid/Dockerfile.pi Wed Feb 05 00:29:13 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -FROM bang6:5000/base_pi - -WORKDIR /opt - -COPY requirements.txt . - -RUN pip install -r requirements.txt - -COPY *.py *.html *.js ./ - -EXPOSE 10012 - diff -r b87b6e9cedb2 -r 2866c155eb07 service/rfid/index.html --- a/service/rfid/index.html Wed Feb 05 00:29:13 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ - - - - rfid - - - - - - - - - - - - - - - - - - - - - - diff -r b87b6e9cedb2 -r 2866c155eb07 service/rfid/makefile --- a/service/rfid/makefile Wed Feb 05 00:29:13 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -SERVICE=rfid - -build_image: - rm -rf tmp_ctx - mkdir -p tmp_ctx - cp -a Dockerfile ../../lib/*.py *.py *.txt *.html MFRC522-python tmp_ctx - docker build --network=host -t bang6:5000/$(SERVICE)_x86:latest tmp_ctx - docker push bang6:5000/$(SERVICE)_x86:latest - rm -rf tmp_ctx - - -build_image_pi: - rm -rf tmp_ctx - mkdir -p tmp_ctx - cp -a Dockerfile.pi ../../lib/*.py *.py *.txt *.html MFRC522-python tmp_ctx - docker build --file Dockerfile.pi --network=host -t bang6:5000/$(SERVICE)_pi:latest tmp_ctx - docker push bang6:5000/$(SERVICE)_pi:latest - rm -rf tmp_ctx - -shell: - docker run --rm -it --cap-add SYS_PTRACE --net=host bang6:5000/$(SERVICE)_x86:latest /bin/sh - -local_run: - docker run --rm -it --net=host bang6:5000/$(SERVICE)_x86:latest diff -r b87b6e9cedb2 -r 2866c155eb07 service/rfid/requirements.txt --- a/service/rfid/requirements.txt Wed Feb 05 00:29:13 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -cyclone -docopt -rdflib-jsonld==0.4.0 -rdflib==4.2.2 -https://projects.bigasterisk.com/rdfdb/rdfdb-0.7.0.tar.gz -https://github.com/drewp/MFRC522-python/archive/877f5568627b5e67d622c08191aae0f4ffd6dd32.zip -git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales diff -r b87b6e9cedb2 -r 2866c155eb07 service/rfid/rfid.py --- a/service/rfid/rfid.py Wed Feb 05 00:29:13 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -from docopt import docopt -from rdfdb.patch import Patch -from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler -from rdflib import Namespace, URIRef, Literal, Graph -from rdflib.parser import StringInputSource -from twisted.internet import reactor, task -import cyclone.web -from cyclone.httpclient import fetch -import logging, time, json, random, string -from MFRC522.SimpleMFRC522 import SimpleMFRC522 -from logsetup import log, enableTwistedLog -import private -from greplin import scales -from greplin.scales.cyclonehandler import StatsHandler - -ROOM = Namespace('http://projects.bigasterisk.com/room/') - -ctx = ROOM['frontDoorWindowRfidCtx'] - -cardOwner = { - URIRef('http://bigasterisk.com/rfidCard/93a7591a77'): - URIRef('http://bigasterisk.com/foaf.rdf#drewp'), -} - -STATS = scales.collection('/web', - scales.PmfStat('cardReadPoll'), -) -def rdfGraphBody(body, headers): - g = Graph() - g.parse(StringInputSource(body), format='nt') - return g - -class OutputPage(cyclone.web.RequestHandler): - def put(self): - user = URIRef(self.request.headers['x-foaf-agent']) - arg = self.request.arguments - if arg.get('s') and arg.get('p'): - subj = URIRef(arg['s'][-1]) - pred = URIRef(arg['p'][-1]) - obj = URIRef(self.request.body) - stmt = (subj, pred, obj) - else: - g = rdfGraphBody(self.request.body, self.request.headers) - assert len(g) == 1, len(g) - stmt = g.triples((None, None, None)).next() - self._onStatement(user, stmt) - post = put - - def _onStatement(self, user, stmt): - # write rfid to new key, etc. - if stmt[1] == ROOM['keyContents']: - return - log.warn("ignoring %s", stmt) - -def uidUri(card_id): - return URIRef('http://bigasterisk.com/rfidCard/%010x' % card_id) - -def uidArray(uri): - prefix, h = uri.rsplit('/', 1) - if prefix != 'http://bigasterisk.com/rfidCard': - raise ValueError(uri) - return [int(h[i * 2: i * 2 + 2], 16) for i in range(0, len(h), 2)] - -class Rewrite(cyclone.web.RequestHandler): - def post(self): - agent = URIRef(self.request.headers['x-foaf-agent']) - body = json.loads(self.request.body) - - _, uid = reader.read_id() - log.info('current card id: %r %r', _, uid) - if uid is None: - self.set_status(404, "no card present") - # maybe retry a few more times since the card might be nearby - return - - text = ''.join(random.choice(string.uppercase) for n in range(32)) - log.info('%s rewrites %s to %s, to be owned by %s', - agent, uid, text, body['user']) - - #reader.KEY = private.rfid_key - reader.write(uid, text) - log.info('done with write') - - -sensor = ROOM['frontDoorWindowRfid'] - -class ReadLoop(object): - def __init__(self, reader, masterGraph): - self.reader = reader - self.masterGraph = masterGraph - self.log = {} # cardIdUri : most recent seentime - - self.pollPeriodSecs = .1 - self.expireSecs = 2 - - task.LoopingCall(self.poll).start(self.pollPeriodSecs) - - @STATS.cardReadPoll.time() - def poll(self): - now = time.time() - - self.flushOldReads(now) - - card_id, text = self.reader.read() - if card_id is None or text == '': - # text=='' could be legit, but it's probably a card that's - # still being read. - return - - cardIdUri = uidUri(card_id) - textLit = Literal(text.rstrip().decode('ascii', 'replace')) - - is_new = cardIdUri not in self.log - self.log[cardIdUri] = now - if is_new: - self.startCardRead(cardIdUri, textLit) - - def flushOldReads(self, now): - for uri in self.log.keys(): - if self.log[uri] < now - self.expireSecs: - self.endCardRead(uri) - del self.log[uri] - - def startCardRead(self, cardUri, text): - p = Patch(addQuads=[(sensor, ROOM['reading'], cardUri, ctx), - (cardUri, ROOM['cardText'], text, ctx)], - delQuads=[]) - self.masterGraph.patch(p) - log.info('read card: id=%s %r', cardUri, str(text)) - self._sendOneshot([(sensor, ROOM['startReading'], cardUri), - (cardUri, ROOM['cardText'], text)]) - - def endCardRead(self, cardUri): - delQuads = [] - for spo in self.masterGraph._graph.triples( - (sensor, ROOM['reading'], cardUri)): - delQuads.append(spo + (ctx,)) - for spo in self.masterGraph._graph.triples( - (cardUri, ROOM['cardText'], None)): - delQuads.append(spo + (ctx,)) - - self.masterGraph.patch(Patch(addQuads=[], delQuads=delQuads)) - - def _sendOneshot(self, oneshot): - body = (' '.join('%s %s %s .' % (s.n3(), p.n3(), o.n3()) - for s,p,o in oneshot)).encode('utf8') - url = 'http://bang6:9071/oneShot' - d = fetch(method='POST', - url=url, - headers={'Content-Type': ['text/n3']}, - postdata=body, - timeout=5) - def err(e): - log.info('oneshot post to %r failed: %s', - url, e.getErrorMessage()) - d.addErrback(err) - - - -if __name__ == '__main__': - arg = docopt(""" - Usage: rfid.py [options] - - -v Verbose - """) - log.setLevel(logging.INFO) - if arg['-v']: - enableTwistedLog() - log.setLevel(logging.DEBUG) - - masterGraph = PatchableGraph() - reader = SimpleMFRC522(gain=0x07) - - loop = ReadLoop(reader, masterGraph) - - port = 10012 - reactor.listenTCP(port, cyclone.web.Application([ - (r"/()", cyclone.web.StaticFileHandler, - {"path": ".", "default_filename": "index.html"}), - (r"/graph/rfid", CycloneGraphHandler, {'masterGraph': masterGraph}), - (r"/graph/rfid/events", CycloneGraphEventsHandler, - {'masterGraph': masterGraph}), - (r'/output', OutputPage), - (r'/rewrite', Rewrite), - (r'/stats/(.*)', StatsHandler, {'serverName': 'rfid'}), - ], masterGraph=masterGraph, debug=arg['-v']), interface='::') - log.warn('serving on %s', port) - - reactor.run()