X-Git-Url: http://www.average.org/gitweb/?p=loctrkd.git;a=blobdiff_plain;f=loctrkd%2Fbeesure.py;h=a0d802bb1df306e888e87218028241210ffd5695;hp=9b0255c2401a7d65f817afcb7363d9190122f073;hb=5ef83cb7db7464a5a625b0b7c86c4e25ebbb0de1;hpb=63a086cf3956b93f760b1a0344afd757e0d0392f diff --git a/loctrkd/beesure.py b/loctrkd/beesure.py index 9b0255c..a0d802b 100755 --- a/loctrkd/beesure.py +++ b/loctrkd/beesure.py @@ -24,6 +24,7 @@ from typing import ( __all__ = ( "Stream", "class_by_prefix", + "enframe", "inline_response", "parse_message", "probe_buffer", @@ -67,11 +68,6 @@ class Stream: self.imei: Optional[str] = None self.datalen: int = 0 - @staticmethod - def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes: - assert imei is not None and len(imei) == 10 - return f"[LT*{imei:10s}*{len(buffer):04X}*".encode() + buffer + b"]" - def recv(self, segment: bytes) -> List[Union[bytes, str]]: """ Process next segment of the stream. Return successfully deframed @@ -96,12 +92,13 @@ class Stream: ) self.buffer = self.buffer[toskip:] # From this point, buffer starts with a packet header - if self.imei is not None and self.imei != imei: + if self.imei is None: + self.imei = imei + if self.imei != imei: msgs.append( f"Packet's imei {imei} mismatches" - f" previous value {self.imei}" + f" previous value {self.imei}, old value kept" ) - self.imei = imei self.datalen = datalen if len(self.buffer) < self.datalen + 21: # Incomplete packet break @@ -125,6 +122,13 @@ class Stream: return ret +def enframe(buffer: bytes, imei: Optional[str] = None) -> bytes: + assert imei is not None and len(imei) == 10 + off, vid, _, dlen = _framestart(buffer) + assert off == 0 + return f"[{vid:2s}*{imei:10s}*{dlen:04X}*".encode() + buffer[20:] + + ### Parser/Constructor ### @@ -289,7 +293,8 @@ class BeeSurePkt(metaclass=MetaPkt): @property def packed(self) -> bytes: - return self.encode().encode() # first is object's, second str's + buffer = self.encode().encode() + return f"[LT*0000000000*{len(buffer):04X}*".encode() + buffer + b"]" class UNKNOWN(BeeSurePkt): @@ -411,7 +416,7 @@ def proto_by_name(name: str) -> str: def proto_of_message(packet: bytes) -> str: - return PROTO_PREFIX + packet.split(b",")[0].decode() + return PROTO_PREFIX + packet[20:-1].split(b",")[0].decode() def imei_from_packet(packet: bytes) -> Optional[str]: