X-Git-Url: http://average.org/gitweb/?a=blobdiff_plain;f=loctrkd%2Fbeesure.py;h=8fa83f51902b0e472286ceff089ba49aeb389964;hb=ba4cb894d37f24ac333b316cf9487dfc913eaf74;hp=9b0255c2401a7d65f817afcb7363d9190122f073;hpb=63a086cf3956b93f760b1a0344afd757e0d0392f;p=loctrkd.git diff --git a/loctrkd/beesure.py b/loctrkd/beesure.py index 9b0255c..8fa83f5 100755 --- a/loctrkd/beesure.py +++ b/loctrkd/beesure.py @@ -24,7 +24,9 @@ from typing import ( __all__ = ( "Stream", "class_by_prefix", + "enframe", "inline_response", + "proto_handled", "parse_message", "probe_buffer", "proto_by_name", @@ -67,11 +69,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 +93,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 +123,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 +294,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): @@ -315,7 +321,10 @@ class LK(BeeSurePkt): class CONFIG(BeeSurePkt): PROTO = "CONFIG" - RESPOND = Respond.INL + + +class ICCID(BeeSurePkt): + PROTO = "ICCID" class UD(BeeSurePkt): @@ -400,6 +409,10 @@ def class_by_prefix( return CLASSES[proto] +def proto_handled(proto: str) -> bool: + return proto.startswith(PROTO_PREFIX) + + def proto_name(obj: Union[MetaPkt, BeeSurePkt]) -> str: return PROTO_PREFIX + ( obj.__class__.__name__ if isinstance(obj, BeeSurePkt) else obj.__name__ @@ -411,7 +424,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]: