From: Eugene Crosser Date: Mon, 23 May 2022 20:15:08 +0000 (+0200) Subject: Report status (with battery %) to the webpage X-Git-Tag: 0.92~4 X-Git-Url: http://www.average.org/gitweb/?p=loctrkd.git;a=commitdiff_plain;h=af6691efc04cf2fb6aaa22be606b6468cceaffb6 Report status (with battery %) to the webpage --- diff --git a/gps303/wsgateway.py b/gps303/wsgateway.py index d3c0541..1843ce9 100644 --- a/gps303/wsgateway.py +++ b/gps303/wsgateway.py @@ -21,6 +21,7 @@ from . import common from .evstore import initdb, fetch from .gps303proto import ( GPS_POSITIONING, + STATUS, WIFI_POSITIONING, parse_message, ) @@ -40,6 +41,7 @@ def backlog(imei, numback): msg = parse_message(packet, is_incoming=is_incoming) result.append( { + "type": "location", "imei": imei, "timestamp": str( datetime.fromtimestamp(timestamp).astimezone( @@ -48,6 +50,9 @@ def backlog(imei, numback): ), "longitude": msg.longitude, "latitude": msg.latitude, + "accuracy": "gps" + if isinstance(msg, GPS_POSITIONING) + else "approximate", } ) return result @@ -68,19 +73,14 @@ def try_http(data, fd, e): fd, headers, ) - try: - pos = resource.index("?") - resource = resource[:pos] - except ValueError: - pass if op == "GET": if htmlfile is None: return ( f"{proto} 500 No data configured\r\n" f"Content-Type: text/plain\r\n\r\n" - f"HTML data not configure on the server\r\n".encode() + f"HTML data not configured on the server\r\n".encode() ) - elif resource == "/": + else: try: with open(htmlfile, "rb") as fl: htmldata = fl.read() @@ -96,12 +96,6 @@ def try_http(data, fd, e): f"Content-Type: text/plain\r\n\r\n" f"HTML file could not be opened\r\n".encode() ) - else: - return ( - f"{proto} 404 File not found\r\n" - f"Content-Type: text/plain\r\n\r\n" - f'We can only serve "/"\r\n'.encode() - ) else: return ( f"{proto} 400 Bad request\r\n" @@ -286,6 +280,10 @@ def runserver(conf): zmq.SUBSCRIBE, topic(WIFI_POSITIONING.PROTO, False, imei), ) + zsub.setsockopt( + zmq.SUBSCRIBE, + topic(STATUS.PROTO, True, imei), + ) for imei in activesubs - neededsubs: zsub.setsockopt( zmq.UNSUBSCRIBE, @@ -295,6 +293,10 @@ def runserver(conf): zmq.UNSUBSCRIBE, topic(WIFI_POSITIONING.PROTO, False, imei), ) + zsub.setsockopt( + zmq.UNSUBSCRIBE, + topic(STATUS.PROTO, True, imei), + ) activesubs = neededsubs log.debug("Subscribed to: %s", activesubs) tosend = [] @@ -309,18 +311,36 @@ def runserver(conf): zmsg = Bcast(zsub.recv(zmq.NOBLOCK)) msg = parse_message(zmsg.packet, zmsg.is_incoming) log.debug("Got %s with %s", zmsg, msg) - tosend.append( - { - "imei": zmsg.imei, - "timestamp": str( - datetime.fromtimestamp( - zmsg.when - ).astimezone(tz=timezone.utc) - ), - "longitude": msg.longitude, - "latitude": msg.latitude, - } - ) + 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", + } + ) except zmq.Again: break elif sk == tcpfd: diff --git a/webdemo/index.html b/webdemo/index.html index b857360..d0af1ac 100644 --- a/webdemo/index.html +++ b/webdemo/index.html @@ -43,6 +43,7 @@ send = document.getElementById("send"); clear = document.getElementById("clear"); subslist = document.getElementById("subslist"); + devstatus = document.getElementById("devstatus"); tstamp = document.getElementById("tstamp"); if (qimei) { imei.value = qimei; @@ -134,6 +135,10 @@ markers.addMarker(new OpenLayers.Marker(lonLat, icon)); map.setCenter(lonLat, 14); } + function display_status(msg) { + console.log("status " + JSON.stringify(msg)); + devstatus.innerHTML = "BAT: " + msg.battery; + } function open_ws() { wsurl = new URL("ws://localhost/"); @@ -157,7 +162,13 @@ } function ws_onmessage(event) { console.log("message " + event.data); - set_marker(JSON.parse(event.data)); + msg = JSON.parse(event.data); + if (msg.type === "location") { + set_marker(msg); + } else if (msg.type === "status") { + display_status(msg); + } + } function ws_onerror(event) { console.log("error " + event); @@ -214,7 +225,10 @@ - + + | + | +