From e960357e336e41168156af24a9b3cab2113b8657 Mon Sep 17 00:00:00 2001 From: Florian Schweikert Date: Mon, 3 Aug 2015 22:22:11 +0200 Subject: [PATCH] Init --- .gitignore | 3 +++ coapserver.py | 60 ++++++++++++++++++++++++++++++++++++++++++++++ json_serializer.py | 6 +++++ requirements.txt | 2 ++ 4 files changed, 71 insertions(+) create mode 100644 .gitignore create mode 100644 coapserver.py create mode 100644 json_serializer.py create mode 100644 requirements.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f0580f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +__pycache__ +env +pyWL diff --git a/coapserver.py b/coapserver.py new file mode 100644 index 0000000..2d9674a --- /dev/null +++ b/coapserver.py @@ -0,0 +1,60 @@ +import asyncio +import json + +import aiocoap.resource as resource +import aiocoap +from pyWL.database import Station, Line +from pyWL.realtime import Departures +import json_serializer + + +class DepartureResource(resource.ObservableResource): + def __init__(self): + super().__init__() + self.notify() + + def notify(self): + self.updated_state() + # Notify all observers every minute + asyncio.get_event_loop().call_later(30, self.notify) + + @asyncio.coroutine + def render_post(self, request): + station_name = request.payload.decode('UTF-8') + stations = Station.search_by_name(station_name) + + if len(station_name) < 4: + payload = 'Search string to short' + if len(station_name) == 0: + payload = 'Missing search string' + return aiocoap.Message(code=aiocoap.NOT_FOUND, payload=payload.encode('ascii')) + + if stations: + payload = str([s['name'] for s in stations]) + for station in stations: + if station['name'] == station_name: + stations = [station] + + if len(stations) == 1: + station = stations[0] + dep = Departures(station.get_stops()) + dep.refresh() + payload = json.dumps(dep, ensure_ascii=False, default=json_serializer.default) + else: + return aiocoap.Message(code=aiocoap.NOT_FOUND, payload='Station not found'.encode('ascii')) + + return aiocoap.Message(code=aiocoap.CONTENT, payload=payload.encode('UTF-8')) + + +def main(): + root = resource.Site() + # add .well-known/core + wkc = resource.WKCResource(root.get_resources_as_linkheader) + root.add_resource((".well-known", "core"), wkc) + root.add_resource(("dep",), DepartureResource()) + + asyncio.async(aiocoap.Context.create_server_context(root)) + asyncio.get_event_loop().run_forever() + +if __name__ == "__main__": + main() diff --git a/json_serializer.py b/json_serializer.py new file mode 100644 index 0000000..22c2087 --- /dev/null +++ b/json_serializer.py @@ -0,0 +1,6 @@ +import datetime + + +def default(obj): + if isinstance(obj, (datetime.datetime, datetime.time, datetime.date)): + return obj.isoformat() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..760d667 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +-e git+https://github.com/chrysn/aiocoap.git@288e5a6a0320a9d9ca6fc04de9ea9307cbb0b374#egg=aiocoap-master +LinkHeader