From 38f814dde6ea7ff8b33d8f5de49fa8fb007b7e2a Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Thu, 5 May 2022 15:39:59 +0200 Subject: [PATCH] WIP on ws gateway, it now works --- gps303/mock.py | 37 +++++++++++++++++++++++++++++++++++++ gps303/wsgateway.py | 21 +++++++++++++-------- gps303/zmsg.py | 13 +++++++++++++ webdemo/index.html | 2 +- 4 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 gps303/mock.py diff --git a/gps303/mock.py b/gps303/mock.py new file mode 100644 index 0000000..9652fc1 --- /dev/null +++ b/gps303/mock.py @@ -0,0 +1,37 @@ +""" Watch for locevt and print them """ + +from datetime import datetime, timezone +from logging import getLogger +from os import umask +from sys import argv, stdin +import zmq + +from . import common +from .zmsg import LocEvt + +log = getLogger("gps303/watch") + + +def main(conf): + zctx = zmq.Context() + zpub = zctx.socket(zmq.PUB) + oldmask = umask(0o117) + zpub.bind(conf.get("lookaside", "publishurl")) + umask(oldmask) + + while True: + line = stdin.readline() + line = line.rstrip("\r\n") + if not line: + break + print(line.encode()) + args = line.split(" ") + imei = args[0] + kwargs = dict([arg.split("=") for arg in args[1:]]) + msg = LocEvt(imei=imei, **kwargs) + print("Publishing:", msg) + zpub.send(msg.packed) + + +if __name__.endswith("__main__"): + main(common.init(log)) diff --git a/gps303/wsgateway.py b/gps303/wsgateway.py index 15a6517..674a075 100644 --- a/gps303/wsgateway.py +++ b/gps303/wsgateway.py @@ -130,9 +130,12 @@ class Client: self.write() return msgs - def send(self, imei, message): + def wants(self, imei): + return True # TODO: check subscriptions + + def send(self, message): # TODO: filter only wanted imei got from the client - self.ws_data += self.ws.send(Message(data=message)) + self.ws_data += self.ws.send(Message(data=message.json)) def write(self): try: @@ -173,10 +176,11 @@ class Clients: log.debug("Received: %s", msg) return result - def send(self, msgs): + def send(self, msg): for clnt in self.by_fd.values(): - clnt.send(msgs) - clnt.write() + if clnt.wants(msg.imei): + clnt.send(msg) + clnt.write() def runserver(conf): @@ -207,13 +211,14 @@ def runserver(conf): tosend = [] topoll = [] tostop = [] - events = poller.poll(1000) + events = poller.poll(5000) + log.debug("got events: %s", events) for sk, fl in events: if sk is zsub: while True: try: - msg = zsub.recv(zmq.NOBLOCK) - tosend.append(LocEvt(msg)) + zmsg = LocEvt(zsub.recv(zmq.NOBLOCK)) + tosend.append(zmsg) except zmq.Again: break elif sk == tcpfd: diff --git a/gps303/zmsg.py b/gps303/zmsg.py index 898918c..0ccef00 100644 --- a/gps303/zmsg.py +++ b/gps303/zmsg.py @@ -156,6 +156,19 @@ class LocEvt(_Zmsg): ).encode() ) + # And this is full json that can be sent over websocket etc. + @property + def json(self): + return dumps( + { + "imei": self.imei, + "devtime": str(self.devtime), + "latitude": self.lat, + "longitude": self.lon, + "is-gps": self.is_gps, + } + ) + def decode(self, buffer): self.imei = buffer[:16].decode() json_data = loads(buffer[16:]) diff --git a/webdemo/index.html b/webdemo/index.html index d726b02..5567eed 100644 --- a/webdemo/index.html +++ b/webdemo/index.html @@ -32,7 +32,7 @@ } function ws_onmessage(event) { console.log("message " + event); - log.innerHTML += "message " + event + "
"; + log.innerHTML += "message " + event.data + "
"; } function ws_onerror(event) { console.log("error " + event); -- 2.39.2