X-Git-Url: http://www.average.org/gitweb/?p=loctrkd.git;a=blobdiff_plain;f=gps303%2Fzmsg.py;h=80cf0003cbb97eee3baf55684a9085cb010d2c3f;hp=56392007f1ff74ecd61cf59b8a95b1b9c2c06c48;hb=80e795c08def3466884223357798cd1aff265212;hpb=fd43e9d459258ecc737995b8367c26f2940ec615 diff --git a/gps303/zmsg.py b/gps303/zmsg.py index 5639200..80cf000 100644 --- a/gps303/zmsg.py +++ b/gps303/zmsg.py @@ -1,9 +1,10 @@ """ Zeromq messages """ +from datetime import datetime, timezone import ipaddress as ip from struct import pack, unpack -__all__ = "Bcast", "Resp" +__all__ = "Bcast", "LocEvt", "Resp" def pack_peer(peeraddr): @@ -119,3 +120,31 @@ class Resp(_Zmsg): def decode(self, buffer): self.imei = buffer[:16].decode() self.packet = buffer[16:] + + +class LocEvt(_Zmsg): + """Zmq message with original or approximated location from lookaside""" + + KWARGS = ( + ("imei", "0000000000000000"), + ("devtime", datetime(1970, 1, 1, tzinfo=timezone.utc)), + ("lat", 0.0), + ("lon", 0.0), + ("is_gps", True), + ) + + @property + def packed(self): + return self.imei.encode() + pack( + "!dddB", + self.devtime.replace(tzinfo=timezone.utc).timestamp(), + self.lat, + self.lon, + int(self.is_gps), + ) + + def decode(self, buffer): + self.imei = buffer[:16].decode() + when, self.lat, self.lon, is_gps = unpack("!dddB", buffer[16:]) + self.devtime = datetime.fromtimestamp(when).astimezone(tz=timezone.utc) + self.is_gps = bool(is_gps)