X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;f=loctrkd%2Fzx303proto.py;h=236f5daa16a1252f3203e660e1718370148465a5;hb=be1de0bb68c5c4acf2edd6f04c5ea8e40d9f31fb;hp=454214eb0c22d7f9e8713e7b367059f279886bb7;hpb=cbb7603aebedf517d7b7c61ff6de02d3e7193409;p=loctrkd.git diff --git a/loctrkd/zx303proto.py b/loctrkd/zx303proto.py index 454214e..236f5da 100755 --- a/loctrkd/zx303proto.py +++ b/loctrkd/zx303proto.py @@ -19,6 +19,7 @@ from enum import Enum from inspect import isclass from struct import error, pack, unpack from time import time +from types import SimpleNamespace from typing import ( Any, Callable, @@ -45,44 +46,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 +364,16 @@ class _GPS_POSITIONING(GPS303Pkt): ttup = (tup[0] % 100,) + tup[1:6] return pack("BBBBBB", *ttup) + def rectified(self) -> SimpleNamespace: # JSON-able dict + return SimpleNamespace( + 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 +490,16 @@ class _WIFI_POSITIONING(GPS303Pkt): ] ) + def rectified(self) -> SimpleNamespace: # JSON-able dict + return SimpleNamespace( + 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 +887,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") ]