X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;f=loctrkd%2Fwsgateway.py;h=e568584054dd571e0a83c04039a0f2cbfeeaa828;hb=77c191290dad765c5b2e09c60d2b7e38aff87565;hp=522cd59269d8380596c0befb7f95dffc058fffd9;hpb=dbdf9d63af31770ad57302e16b17a2fdc526773f;p=loctrkd.git diff --git a/loctrkd/wsgateway.py b/loctrkd/wsgateway.py index 522cd59..e568584 100644 --- a/loctrkd/wsgateway.py +++ b/loctrkd/wsgateway.py @@ -2,6 +2,7 @@ from configparser import ConfigParser from datetime import datetime, timezone +from importlib import import_module from json import dumps, loads from logging import getLogger from socket import socket, AF_INET6, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR @@ -22,46 +23,21 @@ import zmq from . import common from .evstore import initdb, fetch -from .zx303proto import ( - GPS_POSITIONING, - STATUS, - WIFI_POSITIONING, - parse_message, - proto_name, -) -from .zmsg import Bcast, topic +from .protomodule import ProtoModule +from .zmsg import Rept, rtopic log = getLogger("loctrkd/wsgateway") + htmlfile = None def backlog(imei: str, numback: int) -> List[Dict[str, Any]]: result = [] - for is_incoming, timestamp, packet in fetch( - imei, - [ - (True, proto_name(GPS_POSITIONING)), - (False, proto_name(WIFI_POSITIONING)), - ], - numback, - ): - msg = parse_message(packet, is_incoming=is_incoming) - result.append( - { - "type": "location", - "imei": imei, - "timestamp": str( - datetime.fromtimestamp(timestamp).astimezone( - tz=timezone.utc - ) - ), - "longitude": msg.longitude, - "latitude": msg.latitude, - "accuracy": "gps" - if isinstance(msg, GPS_POSITIONING) - else "approximate", - } - ) + for report in fetch(imei, numback): + report["type"] = "location" + timestamp = report.pop("devtime") + report["timestamp"] = timestamp + result.append(report) return result @@ -261,13 +237,12 @@ class Clients: def runserver(conf: ConfigParser) -> None: global htmlfile - initdb(conf.get("storage", "dbfn")) htmlfile = conf.get("wsgateway", "htmlfile", fallback=None) # Is this https://github.com/zeromq/pyzmq/issues/1627 still not fixed?! zctx = zmq.Context() # type: ignore zsub = zctx.socket(zmq.SUB) # type: ignore - zsub.connect(conf.get("collector", "publishurl")) + zsub.connect(conf.get("rectifier", "publishurl")) tcpl = socket(AF_INET6, SOCK_STREAM) tcpl.setblocking(False) tcpl.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) @@ -284,31 +259,9 @@ def runserver(conf: ConfigParser) -> None: while True: neededsubs = clients.subs() for imei in neededsubs - activesubs: - zsub.setsockopt( - zmq.SUBSCRIBE, - topic(proto_name(GPS_POSITIONING), True, imei), - ) - zsub.setsockopt( - zmq.SUBSCRIBE, - topic(proto_name(WIFI_POSITIONING), False, imei), - ) - zsub.setsockopt( - zmq.SUBSCRIBE, - topic(proto_name(STATUS), True, imei), - ) + zsub.setsockopt(zmq.SUBSCRIBE, rtopic(imei)) for imei in activesubs - neededsubs: - zsub.setsockopt( - zmq.UNSUBSCRIBE, - topic(proto_name(GPS_POSITIONING), True, imei), - ) - zsub.setsockopt( - zmq.UNSUBSCRIBE, - topic(proto_name(WIFI_POSITIONING), False, imei), - ) - zsub.setsockopt( - zmq.UNSUBSCRIBE, - topic(proto_name(STATUS), True, imei), - ) + zsub.setsockopt(zmq.UNSUBSCRIBE, rtopic(imei)) activesubs = neededsubs log.debug("Subscribed to: %s", activesubs) tosend = [] @@ -320,39 +273,11 @@ def runserver(conf: ConfigParser) -> None: if sk is zsub: while True: try: - zmsg = Bcast(zsub.recv(zmq.NOBLOCK)) - msg = parse_message(zmsg.packet, zmsg.is_incoming) - log.debug("Got %s with %s", zmsg, msg) - if isinstance(msg, STATUS): - tosend.append( - { - "type": "status", - "imei": zmsg.imei, - "timestamp": str( - datetime.fromtimestamp( - zmsg.when - ).astimezone(tz=timezone.utc) - ), - "battery": msg.batt, - } - ) - else: - tosend.append( - { - "type": "location", - "imei": zmsg.imei, - "timestamp": str( - datetime.fromtimestamp( - zmsg.when - ).astimezone(tz=timezone.utc) - ), - "longitude": msg.longitude, - "latitude": msg.latitude, - "accuracy": "gps" - if zmsg.is_incoming - else "approximate", - } - ) + zmsg = Rept(zsub.recv(zmq.NOBLOCK)) + msg = loads(zmsg.payload) + msg["imei"] = zmsg.imei + log.debug("Got %s, sending %s", zmsg, msg) + tosend.append(msg) except zmq.Again: break elif sk == tcpfd: