]> www.average.org Git - loctrkd.git/commitdiff
WIP on ws gateway, it now works
authorEugene Crosser <crosser@average.org>
Thu, 5 May 2022 13:39:59 +0000 (15:39 +0200)
committerEugene Crosser <crosser@average.org>
Thu, 5 May 2022 13:40:37 +0000 (15:40 +0200)
gps303/mock.py [new file with mode: 0644]
gps303/wsgateway.py
gps303/zmsg.py
webdemo/index.html

diff --git a/gps303/mock.py b/gps303/mock.py
new file mode 100644 (file)
index 0000000..9652fc1
--- /dev/null
@@ -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))
index 15a6517d0c61ac14535f346545b1c03607abcc1a..674a075ed22b6fffc54418c812c5e8413a9cdcdd 100644 (file)
@@ -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:
index 898918cab10204384986bf2b36ae710148dbab9c..0ccef007db6a0ddc5a9491b6d661ec89a63c1a57 100644 (file)
@@ -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:])
index d726b02ba2f40c6cb4a4410c1c3f78135ed95d47..5567eed239127f8fab5507aced48ddb1e8140ff0 100644 (file)
@@ -32,7 +32,7 @@
                }
                function ws_onmessage(event) {
                        console.log("message " + event);
-                       log.innerHTML += "message " + event + "<br>";
+                       log.innerHTML += "message " + event.data + "<br>";
                }
                function ws_onerror(event) {
                        console.log("error " + event);