From 84861997657f7a8daab41aa13790981bd77749f8 Mon Sep 17 00:00:00 2001 From: Eugene Crosser Date: Tue, 26 Jul 2022 23:43:29 +0200 Subject: [PATCH] protocols: introduce method `rectified()` --- loctrkd/beesure.py | 30 ++++++++++++++++++-- loctrkd/googlemaps.py | 1 + loctrkd/opencellid.py | 1 + loctrkd/termconfig.py | 1 + loctrkd/watch.py | 2 ++ loctrkd/zx303proto.py | 64 ++++++++++++++++--------------------------- test/test_storage.py | 9 ++++++ 7 files changed, 64 insertions(+), 44 deletions(-) diff --git a/loctrkd/beesure.py b/loctrkd/beesure.py index 7f689c5..93216c9 100755 --- a/loctrkd/beesure.py +++ b/loctrkd/beesure.py @@ -36,7 +36,6 @@ __all__ = ( "proto_name", "DecodeError", "Respond", - "LK", ) PROTO_PREFIX = "BS:" @@ -352,6 +351,30 @@ class _LOC_DATA(BeeSurePkt): self.latitude = p.lat * p.nors self.longitude = p.lon * p.eorw + def rectified(self) -> Dict[str, Any]: # JSON-able dict + if self.gps_valid: + return { + "type": "location", + "devtime": str(self.devtime), + "battery_percentage": self.battery_percentage, + "accuracy": self.positioning_accuracy, + "altitude": self.altitude, + "speed": self.speed, + "direction": self.direction, + "latitude": self.latitude, + "longitude": self.longitude, + } + else: + return { + "type": "approximate_location", + "devtime": str(self.devtime), + "battery_percentage": self.battery_percentage, + "mcc": self.mcc, + "mnc": self.mnc, + "base_stations": self.base_stations, + "wifi_aps": self.wifi_aps, + } + class AL(_LOC_DATA): RESPOND = Respond.INL @@ -595,6 +618,7 @@ def parse_message(packet: bytes, is_incoming: bool = True) -> BeeSurePkt: def exposed_protos() -> List[Tuple[str, bool]]: return [ - (proto_name(UD), True), - (proto_name(UD2), False), + (proto_name(cls), False) + for cls in CLASSES.values() + if hasattr(cls, "rectified") ] diff --git a/loctrkd/googlemaps.py b/loctrkd/googlemaps.py index 418523d..881a2bd 100644 --- a/loctrkd/googlemaps.py +++ b/loctrkd/googlemaps.py @@ -52,6 +52,7 @@ if __name__.endswith("__main__"): from sqlite3 import connect import sys from .zx303proto import * + from .zx303proto import WIFI_POSITIONING, WIFI_OFFLINE_POSITIONING db = connect(sys.argv[1]) c = db.cursor() diff --git a/loctrkd/opencellid.py b/loctrkd/opencellid.py index 583d2e1..4d0edce 100644 --- a/loctrkd/opencellid.py +++ b/loctrkd/opencellid.py @@ -58,6 +58,7 @@ if __name__.endswith("__main__"): from datetime import datetime, timezone import sys from .zx303proto import * + from .zx303proto import WIFI_POSITIONING, WIFI_OFFLINE_POSITIONING db = connect(sys.argv[1]) c = db.cursor() diff --git a/loctrkd/termconfig.py b/loctrkd/termconfig.py index f8f4b77..b1ea80a 100644 --- a/loctrkd/termconfig.py +++ b/loctrkd/termconfig.py @@ -8,6 +8,7 @@ import zmq from . import common from .zx303proto import * +from .zx303proto import STATUS, SETUP, POSITION_UPLOAD_INTERVAL from .zmsg import Bcast, Resp, topic log = getLogger("loctrkd/termconfig") diff --git a/loctrkd/watch.py b/loctrkd/watch.py index 8e962bc..6d3dcd9 100644 --- a/loctrkd/watch.py +++ b/loctrkd/watch.py @@ -37,6 +37,8 @@ def runserver(conf: ConfigParser) -> None: if pmod.proto_handled(zmsg.proto): msg = pmod.parse_message(zmsg.packet, zmsg.is_incoming) print(msg) + if zmsg.is_incoming and hasattr(msg, "rectified"): + print(msg.rectified()) except KeyboardInterrupt: pass diff --git a/loctrkd/zx303proto.py b/loctrkd/zx303proto.py index 454214e..e27eb5f 100755 --- a/loctrkd/zx303proto.py +++ b/loctrkd/zx303proto.py @@ -45,44 +45,6 @@ __all__ = ( "proto_name", "DecodeError", "Respond", - "GPS303Pkt", - "UNKNOWN", - "LOGIN", - "SUPERVISION", - "HEARTBEAT", - "GPS_POSITIONING", - "GPS_OFFLINE_POSITIONING", - "STATUS", - "HIBERNATION", - "RESET", - "WHITELIST_TOTAL", - "WIFI_OFFLINE_POSITIONING", - "TIME", - "PROHIBIT_LBS", - "GPS_LBS_SWITCH_TIMES", - "REMOTE_MONITOR_PHONE", - "SOS_PHONE", - "DAD_PHONE", - "MOM_PHONE", - "STOP_UPLOAD", - "GPS_OFF_PERIOD", - "DND_PERIOD", - "RESTART_SHUTDOWN", - "DEVICE", - "ALARM_CLOCK", - "STOP_ALARM", - "SETUP", - "SYNCHRONOUS_WHITELIST", - "RESTORE_PASSWORD", - "WIFI_POSITIONING", - "MANUAL_POSITIONING", - "BATTERY_CHARGE", - "CHARGER_CONNECTED", - "CHARGER_DISCONNECTED", - "VIBRATION_RECEIVED", - "POSITION_UPLOAD_INTERVAL", - "SOS_ALARM", - "UNKNOWN_B3", ) PROTO_PREFIX = "ZX:" @@ -401,6 +363,16 @@ class _GPS_POSITIONING(GPS303Pkt): ttup = (tup[0] % 100,) + tup[1:6] return pack("BBBBBB", *ttup) + def rectified(self) -> Dict[str, Any]: # JSON-able dict + return { + "type": "location", + "devtime": str(self.devtime), + "speed": self.speed, + "direction": self.heading, + "latitude": self.latitude, + "longitude": self.longitude, + } + class GPS_POSITIONING(_GPS_POSITIONING): PROTO = 0x10 @@ -517,6 +489,16 @@ class _WIFI_POSITIONING(GPS303Pkt): ] ) + def rectified(self) -> Dict[str, Any]: # JSON-able dict + return { + "type": "approximate_location", + "devtime": str(self.devtime), + "mcc": self.mcc, + "mnc": self.mnc, + "base_stations": self.gsm_cells, + "wifi_aps": self.wifi_aps, + } + class WIFI_OFFLINE_POSITIONING(_WIFI_POSITIONING): PROTO = 0x17 @@ -904,7 +886,7 @@ def parse_message(packet: bytes, is_incoming: bool = True) -> GPS303Pkt: def exposed_protos() -> List[Tuple[str, bool]]: return [ - (proto_name(GPS_POSITIONING), True), - (proto_name(WIFI_POSITIONING), False), - (proto_name(STATUS), True), + (proto_name(cls), cls.RESPOND is Respond.EXT) + for cls in CLASSES.values() + if hasattr(cls, "rectified") ] diff --git a/test/test_storage.py b/test/test_storage.py index 88dea4f..57c1d70 100644 --- a/test/test_storage.py +++ b/test/test_storage.py @@ -8,6 +8,15 @@ from typing import Any import unittest from .common import send_and_drain, TestWithServers from loctrkd.zx303proto import * +from loctrkd.zx303proto import ( + STATUS, + WIFI_POSITIONING, + WIFI_OFFLINE_POSITIONING, + WIFI_POSITIONING, + LOGIN, + HIBERNATION, + SETUP, +) from loctrkd.ocid_dload import SCHEMA -- 2.43.0